将 XML 文件导入 SQL Server 时唯一标识符转换失败
Posted
技术标签:
【中文标题】将 XML 文件导入 SQL Server 时唯一标识符转换失败【英文标题】:Uniqueidentifier conversion failed when Importing XML file to SQL Server 【发布时间】:2020-04-29 09:52:24 【问题描述】:我正在尝试将数据从 XML 文件导入 SQL Server 表。但是,我收到了错误:
从字符串转换为唯一标识符时转换失败
它说它处于第 6 行 (Id3) 的状态 2,但我认为转换在其他地方失败。
XML:
<ImportExportObject>
<Objects>
<MyObject>
<Id>123e5c8c-a7fc-40da-440e-12348bc612e8</Id>
<Id2>123e5c8c-a7fc-40da-440e-12348bc612e8</Id2>
<Name>en</Name>
<Id3>123e5c8c-a7fc-40da-440e-12348bc612e8</Id3>
</MyObject>
</Objects>
</ImportExportObject>
SQL 代码:
INSERT INTO MyTable(ID, Id2, Name, Id3)
SELECT
MyXMLDocument.query('Id').value('.', 'uniqueidentifier'),
MyXMLDocument.query('Id2').value('.', 'uniqueidentifier'),
MyXMLDocument.query('Name').value('.', 'NVARCHAR(50)'),
MyXMLDocument.query('Id3').value('.', 'uniqueidentifier'),
FROM (SELECT CAST(MyXMLDocument AS xml)
FROM OPENROWSET(BULK 'C:\Users\myUser\Documents\MyXMLDocument.xml', SINGLE_BLOB) AS T(MyXMLDocument)) AS T(MyXMLDocument)
CROSS APPLY MyXMLDocument.nodes('ImportExportObject/Objects/MyObject') AS MyXMLDocument (MyObject);
如何解决此错误?
我一直无法让 Select Cast 和 Convert 工作 - 并且 .value() 需要字符串文字,所以 '@Id' 似乎不起作用。
这里不太确定 - 非常感谢任何帮助!
【问题讨论】:
SQL Server 的版本是多少? @gotqn 这是 SQL Server 15.0.2 【参考方案1】:让 MyTable 具有自动导入的 id 并且不导入该 ID 怎么样?这对你想要的有用吗?
【讨论】:
【参考方案2】:您可以通过下面的代码找出哪些值不能转换为uniqueidentifier
:
SELECT
MyXMLDocument.query('Id').value('.', 'NVARCHAR(50)'),
MyXMLDocument.query('Id2').value('.', 'NVARCHAR(50)'),
MyXMLDocument.query('Id3').value('.', 'NVARCHAR(50)')
FROM (SELECT CAST(MyXMLDocument AS xml)
FROM OPENROWSET(BULK 'C:\Users\myUser\Documents\MyXMLDocument.xml', SINGLE_BLOB) AS T(MyXMLDocument)) AS T(MyXMLDocument)
CROSS APPLY MyXMLDocument.nodes('ImportExportObject/Objects/MyObject') AS MyXMLDocument (MyObject)
WHERE TRY_CAST(MyXMLDocument.query('Id').value('.', 'NVARCHAR(50)') AS uniqueidentifier) IS NULL
OR TRY_CAST(MyXMLDocument.query('Id2').value('.', 'NVARCHAR(50)') AS uniqueidentifier) IS NULL
OR TRY_CAST(MyXMLDocument.query('Id3').value('.', 'NVARCHAR(50)') AS uniqueidentifier) IS NULL
这个想法是使用TRY_CAST
,如果数据无法转换,它将返回NULL
。
【讨论】:
【参考方案3】:declare @x xml = N'<ImportExportObject>
<Objects>
<MyObject>
<Id>123e5c8c-a7fc-40da-440e-12348bc612e8</Id>
<Id2>123e5c8c-a7fc-40da-440e-12348bc612e8</Id2>
<Name>en</Name>
<Id3>123e5c8c-a7fc-40da-440e-12348bc612e8</Id3>
</MyObject>
</Objects>
</ImportExportObject>';
SELECT
MyXML.MyObject.value('Id[1]', 'uniqueidentifier'),
MyXML.MyObject.value('Id2[1]', 'uniqueidentifier'),
MyXML.MyObject.value('Name[1]', 'NVARCHAR(50)'),
MyXML.MyObject.value('Id3[1]', 'uniqueidentifier')
FROM
(
SELECT @x
-- CAST(MyXMLDocument AS xml) FROM OPENROWSET(BULK 'C:\Users\myUser\Documents\MyXMLDocument.xml', SINGLE_BLOB)
) AS T(MyXMLDocument)
CROSS APPLY MyXMLDocument.nodes('./ImportExportObject/Objects/MyObject') AS MyXML(MyObject);
【讨论】:
以上是关于将 XML 文件导入 SQL Server 时唯一标识符转换失败的主要内容,如果未能解决你的问题,请参考以下文章
在将新文件主动写入源目录时,如何安全地将文件导入 ssis 中的 sql server?
如何将带有 xml 后代的 XElement 导入 SQL Server