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


19

我正在运行SQL Server 2012。

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

有没有一种方法可以通过命令行以某种方式使其自动化?

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

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

Answers:


20

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

另外,与Powershell配合使用时,SQL Server PowerShell扩展(SQLPSX)具有很大的价值。所有模块都有帮助文件,例如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

对于第三方工具,强烈建议您检出(那里有很多第三方工具,但在我使用过的下面,它们很棒):


9

我编写了一个名为SchemaZen的开源命令行实用程序来完成此任务。它比Management Studio中的脚本要快得多,并且输出的版本控制更友好。它支持脚本的架构和数据。

要生成脚本,请运行:

schemazen.exe脚本--server localhost-数据库db --scriptDir c:\ somedir

然后要通过脚本重新创建数据库,请运行:

schemazen.exe创建--server本地主机-数据库db --scriptDir c:\ somedir

9

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脚本(默认),并将其输出到stdout

$ mssql-scripter -S localhost -d AdventureWorks -U sa

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

$ mssql-scripter -S localhost -d AdventureWorks -U sa schema-and-data  > ./output.sql


0

只是更新:在当前版本的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"

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

$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"

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

一个单个表

($Database.Tables | Where Name -eq "MyTableName").EnumScript($scriptOptions)

所有视图,每个视图保存一个文件,DROP和CREATE脚本:

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
}

希望这可以帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.