使用Export-DbaDbTableData导出数据时单引号未转义的解决咨询
解决dbatools导出INSERT语句单引号未转义的问题
方法1:改用Export-DbaScript(推荐)
Export-DbaDbTableData主打CSV/JSON这类格式的数据导出,生成SQL INSERT语句并非它的核心场景。而Export-DbaScript是专门用来生成数据库对象(含数据)脚本的工具,会自动处理单引号转义逻辑,完全匹配你要的效果。
示例代码:
# 配置目标实例、库、表信息 $sqlInstance = "YourSQLInstanceName" $targetDb = "YourDatabase" $targetTable = "MyTable" # 导出带单引号转义的INSERT脚本 Export-DbaScript -SqlInstance $sqlInstance -Database $targetDb -Table $targetTable -ScriptData -NoPrefix -NoHeader | Out-File "D:\ExportedScripts\MyTable_Inserts.sql"
关键参数说明:
-ScriptData:指定导出数据对应的INSERT语句-NoPrefix:移除脚本里多余的实例/数据库前缀-NoHeader:去掉脚本头部的注释信息,让输出更简洁
方法2:手动处理Export-DbaDbTableData的输出文件
如果一定要用Export-DbaDbTableData,可以在导出后对文件内容做替换处理,把单个单引号换成两个:
# 先导出原始INSERT脚本 Export-DbaDbTableData -SqlInstance $sqlInstance -Database $targetDb -Table $targetTable -OutputType InsertScript -Path "D:\ExportedScripts\Temp_MyTable.sql" # 读取文件并精准替换字符串内部的单引号 $rawContent = Get-Content "D:\ExportedScripts\Temp_MyTable.sql" -Raw # 用正则匹配仅在两个单引号之间的单个单引号,避免替换语句边界的引号 $processedContent = $rawContent -replace "(?<=')'(?=')", "''" # 保存处理后的最终脚本 $processedContent | Out-File "D:\ExportedScripts\MyTable_Inserts.sql" -Force
方法3:自定义生成INSERT语句
通过查询数据后手动拼接语句,完全掌控转义逻辑,适合需要定制化输出的场景:
# 查询目标表的所有数据 $tableData = Invoke-DbaQuery -SqlInstance $sqlInstance -Database $targetDb -Query "SELECT * FROM $targetTable" # 获取表的列名列表 $columnList = ($tableData[0].PSObject.Properties.Name) -join ", " # 逐行生成INSERT语句 $insertStatements = $tableData | ForEach-Object { $valueList = $_.PSObject.Properties.Value | ForEach-Object { if ($null -eq $_) { "NULL" } else { # 转义单引号后用单引号包裹 "'$($_.ToString().Replace("'", "''"))'" } } -join ", " "INSERT INTO $targetTable ($columnList) VALUES ($valueList);" } # 保存最终脚本 $insertStatements | Out-File "D:\ExportedScripts\MyTable_Inserts.sql" -Force
内容的提问来源于stack exchange,提问作者peter88uk
相关产品推荐
相关产品推荐

