You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 10:35:21