У меня есть XML, содержащий xsi: nil = "true" для определенных строковых и числовых элементов. Вот пример:
declare @data xml
set @data = '<?xml version="1.0" encoding="utf-8"?>
<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<item>
<stringprop1>foo</stringprop1>
<stringprop2 xsi:nil="true" />
<decimalprop3 xsi:nil="true" />
</item>
</collection>'
Я хочу запросить этот XML в SQL Server 2008 R2. Я использую OPENXML, но он не очень хорошо работает с десятичными типами. Вот код, который я хотел бы написать:
declare @doc int
exec sp_xml_preparedocument @doc OUTPUT, @data;
select
stringprop1,
stringprop2,
decimalprop3
from openxml(@doc, '/collection/item', 2)
with
(
stringprop1 nvarchar(50)
,stringprop2 nvarchar(50)
,decimalprop3 decimal(18, 5)
)
exec sp_xml_removedocument @doc;
Это жалуется на преобразование nvarchar в десятичное число. После некоторого взлома я пришел к этому:
exec sp_xml_preparedocument @doc OUTPUT, @data;
select
nullif(stringprop1, '') as stringprop1,
nullif(stringprop2, '') as stringprop2,
convert(decimal(18, 5), nullif(decimalprop3, '')) as decimalprop3
from openxml(@doc, '/collection/item', 2)
with
(
stringprop1 nvarchar(50)
,stringprop2 nvarchar(50)
,decimalprop3 nvarchar(50)
)
exec sp_xml_removedocument @doc;
Что хорошо, я думаю. Но есть ли способ сказать OPENXML, что xsi: nil означает NULL и что это нормально для десятичных чисел и строк?