使用PowerShell和SSMS生成数据种子脚本

时间:2019-02-11 11:12:49

标签: sql powershell tsql ssms

Here我找到了手动创建数据种子脚本的解决方案。手动解决方案使我可以选择要为其生成 inserts

的表。

我想知道是否可以通过PowerShell运行同一进程?

到目前为止,我已经成功管理了如何创建SQL脚本,该脚本创建了数据库 schema 播种器:

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null 

$s = new-object ('Microsoft.SqlServer.Management.Smo.Server') "(localdb)\mssqlLocalDb"  

$dbs=$s.Databases 

#$dbs["HdaRoot"].Script() 
$dbs["HdaRoot"].Script() | Out-File C:\sql-seeding\HdaRoot.sql  

#Generate script for all tables

foreach ($tables in $dbs["HdaRoot"].Tables) 
{
    $tables.Script() + "`r GO `r " | out-File C:\sql-seeding\HdaRoot.sql  -Append
} 

有什么类似的方法来生成数据种子脚本?

有什么想法吗?干杯

1 个答案:

答案 0 :(得分:4)

您可以使用SMO scripter class。这将使您可以对表创建的脚本以及表中数据的INSERT语句进行脚本编写。

在我的示例中,我直接针对TempDB并定义了要脚本化而不是脚本化每个表的表名数组。

Scripter有很多可用的选项,因此在此示例中,我仅做了很少的事情-此任务最重要的一个是Options.ScriptData。没有它,您将只获得已经获得的架构脚本。

最后的EnumScript方法完成了生成脚本,输出脚本并将脚本附加到选项中指定的文件中的实际工作。

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null 

## target file
$outfile = 'f:\scriptOutput.sql' 

## target server
$s = new-object ('Microsoft.SqlServer.Management.Smo.Server') "localhost"  

## target database
$db = $s.databases['tempdb'] 

## array of tables that we want to check
$tables = @('Client','mytable','tablesHolding')

## new Scripter object
$tableScripter = new-object ('Microsoft.SqlServer.Management.Smo.Scripter')($s) 

##define options for the scripter
$tableScripter.Options.AppendToFile = $True
$tableScripter.Options.AllowSystemObjects = $False
$tableScripter.Options.ClusteredIndexes = $True
$tableScripter.Options.Indexes = $True
$tableScripter.Options.ScriptData = $True
$tableScripter.Options.ToFileOnly = $True
$tableScripter.Options.filename = $outfile

## build out the script for each table we defined earlier
foreach ($table in $tables) 
{
    $tableScripter.enumscript(@($db.tables[$table])) #enumscript expects an array. this is ugly, but it gives it what it wants.
}