2016-12-14 3 views
0

Может кто-нибудь дать некоторые рекомендации по наиболее эффективному способу извлечения некоторых значений из столбца XML? Я пробовал использовать подстроку и charindex в case case, но это становится очень грязным и не лучшим исполнителем. Я бы подумал, что есть функция XML, которая будет работать лучше, но изо всех сил пытается найти какие-либо примеры в Интернете, которые используют XML что-то вроде этого;Извлечь значения из XML в SQL Server

<pro:Import xmlns:pro="http://thenamespace/"> 
<pro:Control DatabaseName="varchar" UserName="varchar" Password="varchar" Company="varchar" Version="varchar" ErrorHandlingMode="varchar" /> 
<pro:Invoice RegisterInvoiceEvenIfParentOrdersAreInvalid="Bool" Tray="Varchar" Template="varchar" Supplier="varchar" SupplierInvoiceNumber="int" InvoiceDate="datetime" GrossValue="decimal" TaxValue="decimal" ImageReference="uniqueidentifier"> 
    <pro:References> 
     <pro:Reference Code="varchar" Value="datetime" /> 
     <pro:Reference Code="varchar" Value="varchar" /> 
    </pro:References> 
    <pro:ParentOrders> 
     <pro:ParentOrder OrderNumber="varchar" /> 
    </pro:ParentOrders> 
    <pro:TaxDetails> 
     <pro:Tax Band="varchar" Code="varchar" GrossValue="decimal" TaxValue="decimal" /> 
    </pro:TaxDetails> 
    <pro:Comments> 
     <pro:Comment>varchar</pro:Comment> 
    </pro:Comments> 
</pro:Invoice> 

Значения я хочу, чтобы извлечь будет меняться, как будет XML. Это один из примеров, но могут быть случаи, когда значения, которые я хочу извлечь для некоторого XML, отсутствуют в других.

Пример:

Там всегда может быть Supplier="xxxx", но не SupplierInvoiceNumber="xxxx" и его положение будет меняться.

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

Supplier="varchar" & SupplierInvoiceNumber="int"

Спасибо всем :)

~ D

ответ

1

Ваш XML пропускает закрытие конечный тег ...

Я попытался использовать подстроку и charindex в case case, но это становится очень грязным и не лучшим исполнителем.

Это очень плохая идея пытаться читать из XML на уровне строки ...

Попробуй так:

DECLARE @xml XML= 
N'<pro:Import xmlns:pro="http://thenamespace/"> 
    <pro:Control DatabaseName="varchar" UserName="varchar" Password="varchar" Company="varchar" Version="varchar" ErrorHandlingMode="varchar" /> 
    <pro:Invoice RegisterInvoiceEvenIfParentOrdersAreInvalid="Bool" Tray="Varchar" Template="varchar" Supplier="varchar" SupplierInvoiceNumber="int" InvoiceDate="datetime" GrossValue="decimal" TaxValue="decimal" ImageReference="uniqueidentifier"> 
    <pro:References> 
     <pro:Reference Code="varchar" Value="datetime" /> 
     <pro:Reference Code="varchar" Value="varchar" /> 
    </pro:References> 
    <pro:ParentOrders> 
     <pro:ParentOrder OrderNumber="varchar" /> 
    </pro:ParentOrders> 
    <pro:TaxDetails> 
     <pro:Tax Band="varchar" Code="varchar" GrossValue="decimal" TaxValue="decimal" /> 
    </pro:TaxDetails> 
    <pro:Comments> 
     <pro:Comment>varchar</pro:Comment> 
    </pro:Comments> 
    </pro:Invoice> 
</pro:Import>'; 

--clean

WITH XMLNAMESPACES(DEFAULT 'http://thenamespace/') 
SELECT @xml.value('(/Import/Invoice/@Supplier)[1]','nvarchar(max)') AS Supplier 
     ,@xml.value('(/Import/Invoice/@SupplierInvoiceNumber)[1]','nvarchar(max)') AS SupplierInvoiceNumber 

--Lazy

SELECT @xml.value('(//@Supplier)[1]','nvarchar(max)') AS Supplier 
     ,@xml.value('(//@SupplierInvoiceNumber)[1]','nvarchar(max)') AS SupplierInvoiceNumber 
+0

Прекрасное спасибо! Я пробовал с xml.Value, но я пытался прочитать его так: на основе того, что я нашел в Интернете, (/ ns: Import/ns: Invoice) [1] ',' varchar (max) ') в качестве «поставщика», и вместо этого вернулись комментарии. Спасибо за очень быстрый ответ! –

Смежные вопросы