2011-01-25 16 views
5

Mam tabelę z kolumną XMLTYPE o nazwie "InvoiceXML".Jak usunąć nazwę kolumny podczas wybierania z kolumny XMLTYPE przy użyciu FOR XML PATH

Dane w tej kolumnie jest XML w postaci:

<Invoice CustomerNum="1234" > 
<CustomDeliveryDetails /> 
</Invoice> 

Kiedy zrobić

SELECT ... FOR XML PATH(''), ROOT('Invoices') 

I skończyć z:

<Invoices> 
<InvoiceXML> 
    <Invoice CustomerNum="1234" > 
    <CustomDeliveryDetails /> 
    </Invoice> 
</InvoiceXML> 
</Invoices> 

Jak mogę zatrzymać nazwa kolumny InvoiceXML pojawia się w danych wyjściowych?

Odpowiedz

1

Spróbuj:

SELECT cast(cast(InvoiceXML as nvarchar(max)) + '' as XML) 
FROM whatever 
FOR XML PATH(''), ROOT('Invoices') 
+0

Nie myśl, że możesz łączyć łańcuch bezpośrednio z kolumną XML. Musisz podwoić obsadę: 'cast (cast (InvoiceXML as nvarchar (max)) + '' jako XML)' –

+0

+1 Po dalszej analizie myślę, że można ją jeszcze bardziej uprościć. Wygląda na to, że 'cast (InvoiceXML as XML)' jest wystarczający. –

+0

Zgłaszałbym, gdybym miał wystarczającą liczbę powtórzeń, ponieważ rzut na nvarchar (max) zasadniczo przełamuje typ XML ze względu na ograniczenia długości. varchar (max), nvarchar (max) i xml mogą przechowywać 2 GB, ale nvarchar używa 2x storge na znak. Odniesienia: http://technet.microsoft.com/en-us/library/ms186939.aspx i http://msdn.microsoft.com/en-us/library/ms187339.aspx – rainabba

0

Spróbuj tego:

SELECT InvoiceXML.query('//Invoice') 
    FROM <YOUR_TABLE> 
FOR XML PATH('') 
Spróbuj określić kwerendę XPath do faktury w XML PATH FPR np: `FOR XML PATH ('// InvoiceXML') "
+0

Czy to działa? Kiedy próbowałem, to daje mi: 'Nazwa wiersza '// InvoiceXML' zawiera niepoprawny identyfikator XML wymagany przez FOR XML; "/" (0x002F) jest pierwszym znakiem wady. "Usunięcie podwójnego ukośnika powoduje' 'zawijanie każdego wiersza dwa razy. – Tadmas

+0

Nie przetestowałem wcześniejszej wersji odpowiedzi, w przypadku weryfikacji nie udało się :). Zaktualizowano wpis wersją roboczą. Thx – Chandu

4
declare @T table (invoiceXML xml) 

insert into @T values (
    '<Invoice CustomerNum="1234" > 
    <CustomDeliveryDetails /> 
    </Invoice> 
    ') 

insert into @T values (
    '<Invoice CustomerNum="4321" > 
    <CustomDeliveryDetails /> 
    </Invoice> 
    ') 

select (select T.invoiceXML) 
from @T as T 
for xml path(''), root('Invoices') 

Edytuj 1 Podzapytowanie (select T.invoiceXML) nie ma nazwy kolumny, więc zostanie usunięte.

+0

Nice. Powinieneś prawdopodobnie dodać, dlaczego działa twoje rozwiązanie: podzapytanie nie ma nazwy, więc nie ma nazwy kolumny do umieszczenia w elemencie zawierającym, powodując jej usunięcie. – Tadmas

+0

Dzięki, zrobię to. –