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

如何将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编码解析二进制数据,能有效避免因编码不匹配导致的<被转成&lt;的问题。

方案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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:15:11