gpt4 book ai didi

sql-server-2008 - 如何编写 SQL Server 数据库图表脚本?

转载 作者:行者123 更新时间:2023-12-04 01:49:22 25 4
gpt4 key购买 nike

如何将 SQL Server 数据库图表导出为对开发人员友好的 SQL 脚本?

对开发人员友好,我的意思是以类似于人类编写它们的方式编写,而不是困惑的许多 - UPDATE existing solutions 使用的 s 样式.

(请注意,此站点上的类似问题似乎仅涉及特定版本的 SQL Server 或图表迁移。)

最佳答案

这是执行此操作的脚本。在 SQL Server 2008 R2 和 2012 中测试。

DECLARE @values nvarchar(max);
SET @values =
(
SELECT '
(''' + REPLACE(name, '''', '''''') + ''', ' + CAST(principal_id AS VARCHAR(100)) +', ' + CAST(version AS VARCHAR(100)) + ', ' + sys.fn_varbintohexstr(definition) + '),'
FROM sysdiagrams
FOR XML PATH(''), TYPE
).value('.', 'nvarchar(max)');
SET @values = LEFT(@values, LEN(@values) - 1);

SELECT
'IF OBJECT_ID(N''dbo.sysdiagrams'') IS NULL
CREATE TABLE dbo.sysdiagrams
(
name sysname NOT NULL,
principal_id int NOT NULL,
diagram_id int PRIMARY KEY IDENTITY,
version int,

definition varbinary(max)
CONSTRAINT UK_principal_name UNIQUE
(
principal_id,
name
)
);

MERGE sysdiagrams AS Target
USING
(
VALUES' + @values + '
) AS Source (name, principal_id, version, definition)
ON Target.name = Source.name
AND Target.principal_id = Source.principal_id
WHEN MATCHED THEN
UPDATE SET version = Source.version, definition = Source.definition
WHEN NOT MATCHED BY Target THEN
INSERT (name, principal_id, version, definition)
VALUES (name, principal_id, version, definition);
';

它基本上导出 sysdiagrams的内容 table 。请注意,它不保留图表的 ID 号。它还保留了谁创建了图表,但 ID 号也应该存在于目标数据库中。

如果您在没有数据库图表对象的服务器实例上运行生成的脚本,它应该仍然可以工作。但是,在这样做之后,为了让它们出现在 SSMS 中,我认为您需要展开 Database Diagrams 节点并在要求创建它们时单击 Yes。

这是基于 here 的 2008 年脚本.

请注意,有一个问题! 如果您有多个图表,SSMS 和其他 Microsoft 工具会截断结果集中的结果文本。要获取全文,这里有一个 PowerShell 脚本来运行查询并将输出放入剪贴板:
$ErrorActionPreference = "Stop"

function Pause([string]$message) {
Write-Host $message
$host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") | Out-Null
}

function Set-Clipboard {
$input | PowerShell -NoProfile -STA -Command {
Add-Type -AssemblyName "System.Windows.Forms"
[Windows.Forms.Clipboard]::SetText($input)
}
}

$connection = New-Object System.Data.SqlClient.SqlConnection ("Data Source=DATABASE_INSTANCE;Initial Catalog=DATABASE;Integrated Security=SSPI")
$connection.Open()
$command = $connection.CreateCommand()
$command.CommandText = @"
--SQL CODE
"@

$command.CommandTimeout = 60
$result = $command.ExecuteScalar()
$command.Dispose()
$connection.Dispose()

Pause "Press any key to copy the resulting SQL to the clipboard..."
$result | Set-Clipboard

填写数据库、实例名称和 SQL 占位符。

关于sql-server-2008 - 如何编写 SQL Server 数据库图表脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18246965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com