疑难杂症--导出对象创建脚本

朋友在折腾导出数据库对象的创建脚本时,遇到一个问题,表结构相同,但不同服务器上导出的脚本却不相同:

一台服务器上的脚本如下:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[testb](
    [id] [varchar](40) NOT NULL,
    [mobile] [varchar](11) NULL,
    [name] [varchar](20) NULL,
    [address_id] [int] NULL,
    [work] [varchar](100) NULL,
 CONSTRAINT [PK_testb] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (
    PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
    IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
    ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
) ON [PRIMARY]

GO

另一台服务器上的脚本如下:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[testb]
(
  [id] [varchar](40) NOT NULL ,
  [mobile] [varchar](11) NULL ,
  [name] [varchar](20) NULL ,
  [address_id] [int] NULL
)ON[PRIMARY]

SET ANSI_PADDING OFF

ALTER TABLE [dbo].[testb] ADD [work] [varchar](100) NULL
CONSTRAINT [PK_testb] PRIMARY KEY CLUSTERED 
(
[id] ASC
)WITH 
(
    PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
    IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
    ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO

为什么会这样呢?以前也发现过类似问题,一直认为这两种脚本运行结果都一样,因此没有深入思考。

对比前后代码,会发现除表创建脚本不同外,SET 选项也略有不同,后者有关于ANSI_PADDING的设置,哪究竟是不是这个选项导致的呢?

我们在SSMS工具中进行如下设置:

进入 SSMS>>工具>>选项 中,对SET ANSI_PADDING OFF 分别设置为TURE和FALSE,然后依次生成同一对象的脚本,会先后导出的脚本不同。

 

通过上面的选项,我们可以导出不同的对象创建脚本,节省很多人力,如

1>修改"编写索引脚本"为TRUE, 在生成表创建脚本时附带生成索引的创建脚本,

2>修改"检查是否存在对象"为TURE,可以生成带IF NOT EXISTS的检查脚本;

 

--=================================================================

当然,如果想自动化,PowerShell是最好的选择,下面是摘抄自网络的一段代码,供各位参考:

<#===========================================#>
##生成创建表的脚本,包含Constraints,Indexes,Triggers
##Link:http://www.cnblogs.com/wghao/archive/2011/11/04/2235220.html

$serverInstance="." 
$userName="sa"
$password="1234"
$DataBase="Test_Sub"
$SrciptOutputPath="D:\SC\"
$TableList="TB_Lock","TB002"

<#===========================================#>
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | Out-Null

$ServerConnection =new-object "Microsoft.SqlServer.Management.Common.ServerConnection" $serverInstance,$userName, $password  

Try
{
    $ServerConnection.Connect()
}
Catch
{
    Write-Error $_
}

if($ServerConnection.IsOpen)
{    
    #腳本选项设置
    $ScriptingOptions = New-Object "Microsoft.SqlServer.Management.Smo.ScriptingOptions"
    $ScriptingOptions.DriAllKeys         = $True
    $ScriptingOptions.DriClustered       = $True
    $ScriptingOptions.DriAllConstraints  = $True     
    $ScriptingOptions.DriDefaults        = $True
    $ScriptingOptions.DriIndexes         = $True
    $ScriptingOptions.DriNonClustered    = $True
    $ScriptingOptions.DriPrimaryKey      = $True
    $ScriptingOptions.DriUniqueKeys      = $True     
    $ScriptingOptions.AnsiFile           = $False
    $ScriptingOptions.ClusteredIndexes   = $True
    $ScriptingOptions.IncludeHeaders     = $False
    $ScriptingOptions.Indexes            = $True
    $ScriptingOptions.SchemaQualify      = $False
    $ScriptingOptions.Triggers           = $True
    $ScriptingOptions.XmlIndexes         = $True
    $ScriptingOptions.ExtendedProperties = $True
    $ScriptingOptions.NoFileGroup        = $True
    $ScriptingOptions.NoCollation        = $True
    $ScriptingOptions.IncludeIfNotExists = $True
    $ScriptingOptions.NoIdentities       = $True

    #获得数据库中的用户表
    $Tables=((New-Object "Microsoft.SqlServer.Management.Smo.Server" $ServerConnection).databases[$DataBase]).tables | Where-Object -FilterScript{$_.IsSystemObject -eq $False}
  
    if($Tables)
    {
        [System.Text.StringBuilder]$Sript="Use ["+$DataBase+"]`nGo`n"
        [int]$count=1
        
        #刪除腳本
        foreach($tb In $Tables | Sort-Object -Property CreateDate,ID -Descending)
        {
            $i=$Sript.AppendLine("If object_id('[" +$Tb.Name+ "]') Is Not null `n`t  Drop Table ["+ $Tb.Name+ "]")
        }
        
        #创建脚本
        foreach($tb In $Tables | Sort-Object -Property CreateDate,ID)
        {
            if($TableList -contains $tb.Name)
            {
                foreach($s In $tb.Script($ScriptingOptions))
                {    
                    $i=$Sript.AppendLine($s)
                }
                
                Write-Host "處理完表 (" $count "/" $Tables.Count ")"  ": " $tb.Name 
            }
            $count+=1       
        }
        
        $i=$Sript.AppendLine("Go")
        
        Write-Host $Sript.ToString()
        #输出脚本
        [string]$Path=$SrciptOutputPath+$DataBase+"-"+(Get-Date -format yyyyMMdd)+".sql"
        $Sript.ToString() | Out-File -FilePath $Path            
    }
    Else
    {
        Write-Error "无效的数据库: $DataBase 。或在数据库中找不到对应的表!"
    }

}

 

--===================================================================

妹子后续补上

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值