Leggi XSI: Tipo da T-SQL
-
13-11-2019 - |
Domanda
Vorrei leggere l'attributo XSI: Type dal nodo "corrente" in un'istruzione SELECT.Il mio XML sembra questo:
<ns2:data xmlns:ns2="http://mynamespace">
<OrderLineItems>
<OrderLineItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:DeactivationLineItem" id="1">
<Product>
<Id>5300</Id>
<Description>DUMMY</Description>
<Domain>ddd</Domain>
</Product>
<Quantity>1</Quantity>
</OrderLineItem>
<OrderLineItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:ActivationLineItem" id="4">
<Product>
<Id>5340</Id>
<Description>DUMMY</Description>
<Domain>aaa</Domain>
</Product>
<Quantity>1</Quantity>
</OrderLineItem>
<OrderLineItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:DeactivationLineItem" id="12">
<Product>
<Id>53200</Id>
<Description>DUMMY</Description>
<Domain>ccc</Domain>
</Product>
<Quantity>21</Quantity>
</OrderLineItem>
</OrderLineItems>
</ns2:data>
.
La mia istruzione Select è la seguente:
;WITH XMLNAMESPACES('http://mynamespace' AS ns)
SELECT
,OrderLineItemID = ref.value('@id', 'int')
,OrderLineItemParentID = ref.value('@parentId', 'int')
,ProductID = NULLIF(ref.query('Product/Id').value('.', 'varchar(255)'),'')
,ProductDescription = NULLIF(ref.query('Product/Description').value('.', 'varchar(255)'),'')
,ProductDomain = NULLIF(ref.query('Product/Domain').value('.', 'varchar(255)'),'')
,ProductAdditionalInfo = NULLIF(ref.query('Product/AdditionalInfo').value('.', 'varchar(255)'),'')
,Quantity = ref.query('Quantity').value('.', 'int')
,LineItemType = ref.value('@xsi:type','varchar(max)')
FROM tTEMP_XMLTABLE
CROSS APPLY xmlFile.nodes('/ns:data/OrderLineItems/OrderLineItem') R(ref)
.
Il mio problema è la linea lineitemtype mentre getta un errore: La sintassi Xquery '@ {http://www.w3.org/2001/xmlschema-instance}: Tipo' non è supportato
È strano, perché sono in grado di leggere un singolo tipo se non uso la croce applicabile:
WITH XMLNAMESPACES ('http://mynamespace' as p)
SELECT CAST(xmlFile as XML).value('(/p:data/OrderLineItems/OrderLineItem/@xsi:type)[1]','nvarchar(max)')
from tTEMP_XMLTABLE;
.
La seconda istruzione funziona su SQL Server 2005. Esiste una possibilità di leggere l'attributo XSI: tipo quando si utilizza Cross Applica?
Grazie per l'aiuto
Soluzione
Questo ha funzionato per me in SQL Server 2008 SP1 (non hai specificato la versione, quindi non sono sicuro che sia ciò che hai o meno).Non sono sicuro che sia possibile per te ottenere il tuo XML o una copia del tuo XML in un campo XML non adulo come ho qui, ma questo potrebbe aiutarti a aggirare il problema legata al link che ti ho dato sopra.