在PowerShell中获取SQL Server URN对象脚本到变量并解决持久化空值问题
解决思路
1. 处理Smo Script方法的返回值问题
$scrp.Script($tb.Urn)返回的是StringCollection集合类型,不是单个字符串。直接用Write-Output赋值再拼接SQL,会导致内容无法正确展开。正确的做法是把集合转为换行分隔的字符串:
# 直接传入表对象比Urn更可靠,避免Urn解析异常 $scriptLines = $scrp.Script($tb) $Script = $scriptLines -join "`r`n"
2. 修正表名字段的错误赋值
你代码里$Table = $tb后直接插入$Table,实际插入的是Smo表对象的类型字符串(而非真实表名),应该改用表的Name属性:
$TableName = $tb.Name
3. 用参数化查询替代字符串拼接
直接拼接SQL语句会因为脚本中的单引号、换行等字符触发语法错误,同时可能丢失内容。改用参数化查询彻底解决这个问题:
$insertquery = @" INSERT INTO $tableInsertName ([VersionDate], [DBName], [TableName], [Script]) VALUES (@VersionDate, @DBName, @TableName, @Script) "@ $Command.CommandText = $insertquery # 清空旧参数,添加新参数 $Command.Parameters.Clear() $Command.Parameters.AddWithValue("@VersionDate", $DateInsert) $Command.Parameters.AddWithValue("@DBName", $db.Name) $Command.Parameters.AddWithValue("@TableName", $tb.Name) $Command.Parameters.AddWithValue("@Script", $Script) $Command.ExecuteNonQuery()
4. 确认Scripter对象的配置
如果$scrp(Scripter实例)的ScriptingOptions配置不全,可能生成空脚本。确保开启必要的脚本生成选项:
# 初始化Scripter时配置选项示例 $scrp = New-Object Microsoft.SqlServer.Management.Smo.Scripter($yourServerInstance) $scrp.Options.ScriptDrops = $false $scrp.Options.IncludeHeaders = $true $scrp.Options.DriAll = $true # 包含主键、外键等约束 $scrp.Options.Indexes = $true # 包含索引
5. 调试验证脚本内容
在插入前添加调试输出,确认脚本是否生成成功:
Write-Host "=== 调试信息 ===" Write-Host "表名: $($tb.Name)" Write-Host "脚本长度: $($Script.Length) 字符" if ($Script.Length -gt 0) { Write-Host "脚本前100字符:`n$($Script.Substring(0, [Math]::Min(100, $Script.Length)))" }
内容的提问来源于stack exchange,提问作者Vssmm
相关产品推荐
相关产品推荐

