如何使用SMO脚本编写器生成sql脚本

时间:2013-10-17 18:35:06

标签: sql-server powershell smo

我的数据库有表格,视图和所有内容。我需要一种以自动方式为所有DDL生成SQL脚本的方法。不需要数据。

存在FK约束,因此应正确排序表创建脚本。某些视图使用另一个视图,因此视图创建脚本也必须正确排序。

MSDN Blog上提供的脚本开始,我得到以下内容:

function Generate-SqlScript
{
    param(
    [string]$srvname,
    [string]$database,
    [string]$ScriptOutputFileName
    )

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

    $srv =  New-Object ("Microsoft.SqlServer.Management.SMO.Server") ($srvname)

    $allUrns = @()
    $allUrns += $srv.Databases[$database].Tables |  foreach { $_.Urn}
    $allUrns += $srv.Databases[$database].Views |  foreach { $_.Urn}

    $scriptingOptions = New-Object ("Microsoft.SqlServer.Management.SMO.ScriptingOptions") 
    $scriptingOptions.WithDependencies = $true
    $scriptingOptions.AllowSystemObjects = $false
    $scriptingOptions.ToFileOnly = $true
    $scriptingOptions.Permissions = $true
    $scriptingOptions.FileName = "$ScriptOutputFileName"

    $scripter = New-Object ("Microsoft.SqlServer.Management.SMO.Scripter") ($srv)
    $scripter.Options = $scriptingOptions;

    $scripter.Script($allUrns)
}

Generate-SqlScript .\sqlexpress <MyDbName> <FilePath>

现在的问题是,WithDependencies选项会导致视图脚本包含其先前已包含的依赖表。如果我取出WithDependencies选项,则生成的脚本不会反映正确的顺序。

所以最终结果包含所有信息,但它不可运行。它会引发错误,因为它无法创建表两次。

我找到太多帖子谈论SMO脚本编写器,所以我认为必须有一些我错过的东西。或者......所有这些帖子都错过了这个问题吗?

4 个答案:

答案 0 :(得分:5)

在编写对象脚本之前,您需要在PowerShell脚本中按依赖顺序发现和排序表。在以下博客中查看此实现: http://patlau.blogspot.com/2012/09/generate-sqlserver-scripts-with.html

C#中的概念对我来说更清晰。查看: http://sqlblog.com/blogs/ben_miller/archive/2007/10/18/scripting-tables-views-and-data-using-smo-part-3.aspx

答案 1 :(得分:5)

  1. 编写没有外键的所有表,然后只输出外键。您可以使用脚本选项来执行此操作,这样由于FK而导致的表之间的依赖关系无关紧要。
  2. 使用DependencyWalker SMO对象。您可以为视图添加URN,然后请求依赖项的线性列表。我对类似问题的回答here包含了如何使用它的示例。

答案 2 :(得分:1)

您可以采用不同的方法并编写表格,然后查看视图。通常按顺序,事情有效,但不是100%。

我会将WithDependencies设置为false

答案 3 :(得分:1)

这无疑是一个黑客攻击,但您可以在运行之前通过添加错误处理来修补脚本。你可以利用V3中的新解析器来自动化它。