Ошибка преобразования уникального идентификатора при импорте файла XML на сервер SQL - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь импортировать данные из файла XML в таблицу SQL Server. Тем не менее я получаю сообщение об ошибке:

Преобразование не удалось при преобразовании из символьной строки в уникальный идентификатор

Он говорит, что он находится в состоянии 2 строки 6 (Id3), но я предполагаю, что преобразование не выполняется в других местах.

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 ', кажется, не работает.

Совершенно неуверенно здесь - любая помощь очень ценится!

Ответы [ 3 ]

0 голосов
/ 29 апреля 2020

Вы можете код ниже, чтобы найти, какие значения не могут быть преобразованы в 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, если данные не могут быть преобразованы.

0 голосов
/ 29 апреля 2020
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);
0 голосов
/ 29 апреля 2020

Как насчет того, чтобы иметь MyTable с автоматически импортированным идентификатором и не импортировать его? Будет ли это работать на то, что вы хотите?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...