我一直在尝试将ssis dtsx(xml文件)导入SQL服务器表。表格中的格式正在变化。如源文件中的<
更改为<
,源中的多行将成为目标中的单行。
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数据类型。还有其他办法吗?
答案 0 :(得分:2)
你的问题不是很清楚。但是我的神奇水晶球告诉我,你的问题可能是在导入后读取XML 的方式。
如果您提供的代码段确实有效,则似乎可以将文件的内容加载到本机XML类型的列中。如果文件存在任何问题,XML格式,XML格式不正确 - 无论如何 - 这都会失败。
由于显而易见的原因,有些字符不能包含在XML内容中,因为它们用于标记部分,即<, > and &
(但还有更多)。
这些角色需要逃避。在XML中,我们谈论实体。正确完成所有这些魔法是隐含的,你根本不必为此烦恼。
一些可能的想法:
字符串copy & paste
将转换为copy & paste
。我看过案例,开发人员是否通过字符串连接构建了XML。如果值已预编码(copy & paste
)但XML的创建已更改为真实的XML引擎,您将获得copy &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 <, > and &</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 & paste</root>')
,('double encodig' ,'<root>copy &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 & paste</root> copy & paste
correct pre-encoding <root>copy & paste</root> copy & paste
double encodig <root>copy &amp; paste</root> copy & paste
最后一个技巧,你可以&#34;纠正&#34;错误的结果,如果你不能改变上面的内容:
DECLARE @value VARCHAR(100)='copy & paste';
SELECT CAST('<x>' + @value + '</x>' AS XML).value('.','nvarchar(max)')