批处理文件中 SQL Server 数据库的脚本内容

usr*_*usr 6 sql-server command-line scripting smo

我希望能够从 Windows 命令提示符将给定数据库的架构脚本写入 .sql 文件。基本上,我想以编程方式执行 Management Studio 的“生成脚本”功能。

我知道使用 .NET 和 SMO 可以做到这一点,但是是否有内置的东西可以做到这一点?

这个问题的背景:这是一个简单的审计工具。我们希望每晚都捕获模式。任何原始的、低技术的解决方案都适合我们。

Set*_*eno 7

我编写了一个名为SchemaZen 的开源命令行实用程序来执行此操作。它比来自管理工作室的脚本要快得多,而且它的输出对版本控制更友好。它支持对模式和数据进行脚本编写。

要生成脚本,请运行:

schemazen.exe 脚本 --server localhost --database db --scriptDir c:\somedir

然后从脚本运行重新创建数据库:

schemazen.exe 创建 --server localhost --database db --scriptDir c:\somedir


squ*_*man 5

命令行没有内置任何内容。

如果你有红门 SQL 比较,你可以这样做:

sqlcompare /s1:MySQLInstance /db1:MyDB /mkscr:MyDB_Schema /q
Run Code Online (Sandbox Code Playgroud)

SSMS 脚本函数只是 SMO 的包装器。我知道您提到了它,但是您可以编写一个 powershell 脚本来使用 SMO。

这是改编自这篇Simple Talk 帖子中的代码。

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")

$serverName = "MYSQLINSTANCE"
$databaseName = "MyDB"
$sqlServer = new-object("Microsoft.SqlServer.Management.Smo.Server") $serverName
$sqlDb = $sqlServer.Databases[$databasename]

$options = new-object ("Microsoft.SqlServer.Management.Smo.ScriptingOptions")
$options.ExtendedProperties = $true
$options.DRIAll = $true
$options.Indexes = $true
$options.Triggers = $true
$options.ScriptBatchTerminator = $true
$options.Filename = "c:\\script_folder\\mydb_schema.sql"
$options.IncludeHeaders = $true
$options.ToFileOnly = $true

$transfer = new-object ("Microsoft.SqlServer.Management.Smo.Transfer") $sqlDb
$transfer.options = $options
$transfer.ScriptTransfer()
Run Code Online (Sandbox Code Playgroud)