将xml文件导入到具有相同格式的SQL Server

时间:2018-05-17 07:04:15

标签: sql-server xml ssis

我一直在尝试将ssis dtsx(xml文件)导入SQL服务器表。表格中的格式正在变化。如源文件中的<更改为&lt;,源中的多行将成为目标中的单行。

Create table #XMLFilesTable(XMLData xml)

INSERT INTO #XMLFilesTable(XMLData)
SELECT Convert(XML,BulkColumn) As BulkColumn
FROM Openrowset( Bulk 'C:\Users\myFile.dtsx', Single_Blob) as Image

有没有办法在不改变目标的情况下导入xml。我需要此字段作为目标中的xml数据类型。还有其他办法吗?

1 个答案:

答案 0 :(得分:2)

你的问题不是很清楚。但是我的神奇水晶球告诉我,你的问题可能是在导入后读取XML 的方式。

如果您提供的代码段确实有效,则似乎可以将文件的内容加载到本机XML类型的列中。如果文件存在任何问题,XML格式,XML格式不正确 - 无论如何 - 这都会失败。

由于显而易见的原因,有些字符不能包含在XML内容中,因为它们用于标记部分,即<, > and &(但还有更多)。

这些角色需要逃避。在XML中,我们谈论实体。正确完成所有这些魔法是隐含的,你根本不必为此烦恼。

一些可能的想法:

错误的编码

字符串copy & paste将转换为copy &amp; paste。我看过案例,开发人员是否通过字符串连接构建了XML。如果值已预编码(copy &amp; paste)但XML的创建已更改为真实的XML引擎,您将获得copy &amp;amp; paste

读错了

如果使用字符串方法(SUBSTRING等)读取正确编码的XML,则此类编码实体将保持原样。

CDATA个部分

如果您的XML包含CDATA部分,那么SQL Server的开发人员决定不再支持这一部分。实际上没有理由CDATA,因为正确转义的内容在语义上是相同的:

<root><![CDATA[test with <, > and &]]></root>

is eaxctly the same as this

<root>test with &lt;, &gt; and &amp;</root>

CDATA部分会自动删除。试试吧:

DECLARE @xml XML='<root><![CDATA[test with <, > and &]]></root>';
SELECT @xml;

你能做什么

这将有助于提供XML(减少!)的XML样本(某些部分包含此类字符)。

如果XML不是双重编码的,我很确定您的问题是在阅读方面。

检查这个的一个例子

DECLARE @value VARCHAR(100)='copy & paste';
DECLARE @tbl TABLE(Explanation VARCHAR(100),theXml XML);
INSERT INTO @tbl VALUES('encodig by engine'    ,(SELECT @value FOR XML PATH('root')))
                      ,('correct pre-encoding' ,'<root>copy &amp; paste</root>') 
                      ,('double encodig'       ,'<root>copy &amp;amp; paste</root>')
                      /*,('not well formed','<root>copy & paste</root>') --have to exclude this as it would fail*/
SELECT Explanation
      ,theXml
      ,theXml.value(N'(/root/text())[1]',N'nvarchar(max)') AS TheContent
FROM @tbl

结果

Explanation              theXml                             TheContent
encodig by engine       <root>copy &amp; paste</root>       copy & paste
correct pre-encoding    <root>copy &amp; paste</root>       copy & paste
double encodig          <root>copy &amp;amp; paste</root>   copy &amp; paste

最后一个技巧,你可以&#34;纠正&#34;错误的结果,如果你不能改变上面的内容:

DECLARE @value VARCHAR(100)='copy &amp; paste';
SELECT CAST('<x>' + @value + '</x>' AS XML).value('.','nvarchar(max)')