SQL Server 2012:从命令行生成脚本

Har*_*ald 24 sql-server scripting

我正在运行 SQL Server 2012。

SQL Server Management Studio 可以选择右键单击数据库,然后选择任务和生成脚本。

有没有办法通过命令行以某种方式自动化?

我想创建一个包含整个数据库的架构和数据的脚本。

之类的工具ScriptDB,并sqlpubwiz.exe似乎都针对SQL Server 2005的什么有关SQL Server 2012?

Kin*_*hah 21

最好是使用 Powershell - 如果您要经常使用它。您可以参考使用Powershell和 SMO自动生成脚本

此外,SQL Server PowerShell 扩展 (SQLPSX)在使用 Powershell 时非常有价值。所有模块都有帮助文件,例如Get-SqlScripter

Get-SqlDatabase -dbname database1 -sqlserver server | Get-SqlTable | Get-SqlScripter | Set-Content -Path D:\scripts\script.sql
Get-SqlDatabase -dbname database1 -sqlserver server | Get-SqlStoredProcedure | Get-SqlScripter
Get-SqlDatabase -dbname database1 -sqlserver server | Get-SqlView | Get-SqlScripter
Run Code Online (Sandbox Code Playgroud)

对于第三方工具,强烈建议查看(那里有很多第三方工具,但以下是我使用过的,它们很棒):


Bra*_*adC 13

来自 Microsoft 的 Tara Raj最近宣布 Microsoft SQL 团队发布了一组命令行工具来生成 T-SQL 脚本,这些脚本似乎完全按照您的要求执行:

mssql 脚本程序

Mssql-scripter 是多平台命令行等效于 SSMS 中广泛使用的生成脚本向导体验。

可以在 Linux、macOS 和 Windows 上使用 mssql-scripter 为在任何地方运行的 SQL Server、Azure SQL 数据库和 Azure SQL 数据仓库中的数据库对象生成数据定义语言 (DDL) 和数据操作语言 (DML) T-SQL 脚本. 您可以将生成的 T-SQL 脚本保存到 .sql 文件或通过管道将其传输到标准 *nix 实用程序(例如,sed、awk、grep)以进行进一步转换。您可以编辑生成的脚本或将其签入源代码管理,然后使用标准多平台 SQL 命令行工具(例如 sqlcmd)在现有 SQL 数据库部署流程和 DevOps 管道中执行脚本。

Mssql-scripter 是使用 Python 构建的,并结合了新 Azure CLI 2.0 工具的可用性原则。源代码可以在 Github 上找到,网址为https://github.com/Microsoft/sql-xplat-cli,我们欢迎您的贡献和拉取请求!

一些使用示例:

为 Adventureworks 数据库中的所有数据库对象(默认)生成 DDL 脚本并输出到标准输出

$ mssql-scripter -S localhost -d AdventureWorks -U sa
Run Code Online (Sandbox Code Playgroud)

为 Adventureworks 数据库中的所有数据库对象和 DML 脚本(INSERT 语句)生成 DDL 脚本并将脚本保存到文件

$ mssql-scripter -S localhost -d AdventureWorks -U sa –schema-and-data  > ./output.sql
Run Code Online (Sandbox Code Playgroud)

  • 听起来非常好而且“官方风格”,但自 2018 年以来没有提交给我一种不好的感觉..? (3认同)

Set*_*eno 9

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

要生成脚本,请运行:

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

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

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


小智 5

只是更新:在当前版本的 SQL Server powershell 模块(我相信 SQL Server 2014 及更高版本。在 SSMS 17 上测试)中,大多数选项都是本机命令和方法。

例如,您可以使用Get-SqlDatabase以及.Script()和.EnumScript()等方法它确实非常有用且简单,特别是如果您想要更精细的方法(特定表和其他对象)。

例如,这将为用户定义的函数生成 CREATE 脚本并将其保存到文件中:

$Database = Get-SqlDatabase -ServerInstance $YourSqlServer -Name $YourDatabaseName

$MyFuncs = $Database.UserDefinedFunctions | Where Schema -eq "dbo"
$MyFuncs.Script() | Out-File -FilePath ".\SqlScripts\MyFunctions.sql"
Run Code Online (Sandbox Code Playgroud)

如果您想对数据和元素(如索引、键、触发器等)编写脚本,则必须指定脚本选项,如下所示:

$scriptOptions = New-Object -TypeName Microsoft.SqlServer.Management.Smo.ScriptingOptions

$scriptOptions.NoCollation = $True
$scriptOptions.Indexes = $True
$scriptOptions.Triggers = $True
$scriptOptions.DriAll = $True
$scriptOptions.ScriptData = $True

$Database.Tables.EnumScript($scriptOptions) | Out-File -FilePath ".\AllMyTables.sql"
Run Code Online (Sandbox Code Playgroud)

请注意,Script() 方法不支持脚本数据。对表使用 EnumScript()。

单个

($Database.Tables | Where Name -eq "MyTableName").EnumScript($scriptOptions)
Run Code Online (Sandbox Code Playgroud)

所有视图,每个视图保存一个文件,删除并创建脚本:

ForEach ($view in $($Database.Views | Where Schema -eq "dbo")) {

    "`nIF OBJECT_ID('$($view.Name)') IS NOT NULL DROP VIEW $($view.Name);`n`n" | Out-File -FilePath ".\SqlScripts\$($view.Name).sql"    
    $view.Script() | Out-File -FilePath ".\SqlScripts\$($view.Name).sql" -Append
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。