使用PowerShell导出SQL Server存储过程定义至文件时内容错误
问题解决:PowerShell批量导出SQL Server存储过程到单独文件
你的问题出在循环逻辑上:你遍历的是$data.name(所有存储过程名称的集合),每次循环里$content = $data.content取的是所有存储过程的定义,自然每个文件都会写入全部内容。
修改后的代码如下:
$query = "select o.name, cast(m.definition as varchar(max)) as content from sys.objects as o inner join sys.sql_modules as m on o.object_id = m.object_id where o.type = 'p' and o.schema_id = 7" $data = Invoke-Sqlcmd -ConnectionString "Data Source=server;Initial Catalog=db; Integrated Security=True;" -Query $query $folderloc = "\output\folder" # 遍历查询结果的每一行对象,而不是只遍历名称 foreach ($proc in $data) { # 用Join-Path拼接路径,避免手动拼接的分隔符问题 $fullname = Join-Path -Path $folderloc -ChildPath "$($proc.name).sql" # 直接取当前行的content属性 $content = $proc.content # 用Set-Content一步完成创建文件并写入内容(如果文件已存在会覆盖) Set-Content -Path $fullname -Value $content }
关键修改点:
- 循环对象从
$data.name改为$data,这样每次循环的$proc是包含当前存储过程名称和定义的完整对象 - 使用
Join-Path拼接文件路径,比手动拼接更可靠,避免出现类似\output\foldername.sql这种路径错误 - 用
Set-Content替代New-Item + Add-Content,简化代码逻辑,一步完成文件创建和内容写入
内容的提问来源于stack exchange,提问作者roostorx
相关产品推荐
相关产品推荐

