将 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 时唯一标识符转换失败的主要内容,如果未能解决你的问题,请参考以下文章

将xml文件导入sql server表

在将新文件主动写入源目录时,如何安全地将文件导入 ssis 中的 sql server?

如何将带有 xml 后代的 XElement 导入 SQL Server

如何将 XML 文件(在本例中为业务流程事件日志)导入和查询到 SQL Server Express?

将大型 XML 导入 SQL-Server 表的最快方法

将 Excel 导入 SQL Server