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

ken*_*thc 8 sql-server powershell smo

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

存在FK约束,因此应该正确地订购表创建脚本.某些视图使用另一个视图,因此还必须正确排序视图创建脚本.

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

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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

Der*_*ell 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


muh*_*mud 5

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