T-SQL с использованием нулевого значения в XML - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть хранимая процедура с входным параметром XML.Я хотел бы использовать нулевое значение в XML, но когда я пытаюсь выбрать, используя OpenXML, я получаю ошибку преобразования.

Сообщение 8114, уровень 16, состояние 5, строка 22 * ​​1004 * Ошибка преобразования типа данных nvarchar в числовой тип.

IF (OBJECT_ID('tempdb..#Migracio') IS NOT NULL)
DROP TABLE #Migracio
CREATE TABLE #Migracio
(
    Fee DECIMAL(16, 4) NULL,
    Percentage DECIMAL(6, 3)
)

    DECLARE @XML XML =
<Elelments xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <Elelment>
   <Fee xsi:nil="true"/>
   <Percentage>50</Percentage>
 </Elelment>
</Elelments>

DECLARE @h INT

EXEC sp_xml_preparedocument @h OUT, @XML

INSERT INTO [#Migracio] (Fee, Percentage)
 SELECT Fee, Percentage  FROM OPENXML(@h, '/Elelments/Elelment', 6)
 WITH(Fee DECIMAL(16, 4), Percentage DECIMAL(6, 3))

EXEC sp_xml_removedocument @h

SELECT * FROM #Migracio

Как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

FROM OPENXML вместе с хранимой процедурой открытия и удаления XML устарели и больше не должны использоваться ... Вместо этого используйте собственные XML-методы , предоставляемые типом данных XML.

Этот маркер NULL с xsi:nil на самом деле не нужен.Отсутствующий элемент неявно принимается как значение NULL.Если существование элемента вызвано схемой или каким-либо правилом, это можно использовать для различения пустой строки или NULL.Проверьте это:

DECLARE @XML XML =
'<Elelments xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <!-- your example -->
  <Elelment>
    <Fee xsi:nil="true" />
    <Percentage>50</Percentage>
  </Elelment>

  <!-- both values are set -->
  <Elelment>
    <Fee>100</Fee>
    <Percentage>50</Percentage>
  </Elelment>

  <!-- Fee is missing -->
  <Elelment>
    <Percentage>50</Percentage>
  </Elelment>
</Elelments>';

- Это вернет желаемый результат - не беспокоясь о NULL значениях

SELECT e.value('(Fee/text())[1]','decimal(10,4)') AS Fee
      ,e.value('(Percentage/text())[1]','decimal(10,4)') AS Percentage
FROM @XML.nodes('/Elelments/Elelment') A(e);

- Так в чем же разница?Это вернет все узлы <Elelment>, где есть узел <Fee>.Вы получаете два узла обратно.Отсутствующий <Elelment> не найден.

SELECT @XML.query('Elelments/Elelment[Fee]');

- с этим вы можете найти все <Fee> с явным значением xsi:nil="true"

WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema-instance' AS xsi)
SELECT @XML.query('Elelments/Elelment[Fee/@xsi:nil="true"]');

Кстати: выдействительно назвать это <Elelment>?Вторая буква "L" как-то меня беспокоит ...

0 голосов
/ 18 сентября 2018

Я думаю, я мог бы Google ответить:

Как проанализировать XML на сервере SQL для обработки значения NULL в DateTime DataType

"Что вам нужно сделать, этопросто чтобы пропустить те атрибуты, которые приведут к значению NULL. "

Может ли это быть единственным способом?

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