Answers:
最好是使用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
对于第三方工具,强烈建议您检出(那里有很多第三方工具,但在我使用过的下面,它们很棒):
我编写了一个名为SchemaZen的开源命令行实用程序来完成此任务。它比Management Studio中的脚本要快得多,并且输出的版本控制更友好。它支持脚本的架构和数据。
要生成脚本,请运行:
schemazen.exe脚本--server localhost-数据库db --scriptDir c:\ somedir
然后要通过脚本重新创建数据库,请运行:
schemazen.exe创建--server本地主机-数据库db --scriptDir c:\ somedir
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
您可以使用xSQL Schema Compare和xSQL Data Compare的命令行版本。使用命令行版本,您可以计划对空数据库的定期数据和架构比较,并且始终具有脚本来从头开始构建数据库最新版本的精确副本。
披露:我隶属于xSQL。
只是更新:在当前版本的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
}
希望这可以帮助。