如何将SSIS DTSX(XML文件)原样导入SQL Server且格式不变?
解决方案:原样导入DTSX XML文件到SQL Server XML字段
我之前也碰到过类似的XML导入异常问题,给你几个靠谱的方案,既能保证目标字段保留xml数据类型,又能原样还原原文件的内容和格式:
方案1:调整OpenRowSet读取方式与XML转换参数
你的原代码用Single_Blob读取二进制再转XML,有时候会因为文件编码(比如UTF-8带/不带BOM、ANSI)导致标签转义异常。可以试试以下两种调整方式:
CREATE TABLE #XMLFilesTable(XMLData xml) -- 方法A:指定UTF-8编码解析(适用于无BOM的UTF-8格式DTSX) INSERT INTO #XMLFilesTable(XMLData) SELECT CONVERT(XML, BulkColumn, 2) AS BulkColumn FROM OPENROWSET(BULK 'C:\Users\myFile.dtsx', Single_Blob) AS Image -- 方法B:用字符流读取(适用于ANSI编码的DTSX) INSERT INTO #XMLFilesTable(XMLData) SELECT CONVERT(XML, BulkColumn) AS BulkColumn FROM OPENROWSET(BULK 'C:\Users\myFile.dtsx', Single_CLOB) AS Image
说明:
CONVERT(XML, ..., 2)参数会强制按UTF-8编码解析二进制数据,能有效避免因编码不匹配导致的<被转成<的问题。
方案2:先读为纯文本再转XML(精准控制格式)
如果方案1还是有问题,可以先把文件内容读取为Unicode字符串,再转换为XML,这样能绕过二进制读取的编码歧义:
CREATE TABLE #XMLFilesTable(XMLData xml) CREATE TABLE #TempText(Content nvarchar(max)) -- 第一步:读取原文件为纯文本 INSERT INTO #TempText(Content) SELECT BulkColumn FROM OPENROWSET(BULK 'C:\Users\myFile.dtsx', Single_NCLOB) AS Image -- 第二步:将文本转换为XML(此时会正确解析标签,不会自动转义) INSERT INTO #XMLFilesTable(XMLData) SELECT CONVERT(xml, Content) FROM #TempText DROP TABLE #TempText
注意:
Single_NCLOB会按Unicode格式读取文件,适合包含特殊字符或非英文字符的DTSX文件。
方案3:验证原DTSX文件的XML合法性
如果以上方案都无效,大概率是你的DTSX文件本身不是有效的XML(比如存在未闭合的标签、非法字符、不规范的命名空间)。SQL Server为了保证存储的XML合法,会自动转义有问题的标签。你可以用Visual Studio的XML编辑器或者在线XML校验工具检查文件,修复语法错误后再尝试导入。
关于“多行变单行”的说明
SQL Server的xml数据类型是结构化存储,会自动忽略空白字符(包括换行)来优化存储体积。如果需要查询时显示原文件的换行格式,可以用XMLData.value('.', 'nvarchar(max)')提取带格式的文本,或者用XMLData.query('.')保留结构化的同时显示换行。
内容的提问来源于stack exchange,提问作者Pintu Kawar
相关产品推荐
相关产品推荐

