2011-08-05 14 views
6

Mam XML jak:T-SQL XML uzyskać wartość z problemu węzła?

<?xml version="1.0" encoding="utf-16"?> 
<ExportProjectDetailsMessage xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Project"> 
<CPProjectId>7665699f-6772-424c-8b7b-405b9220a8e7</CPProjectId> 
</ExportProjectDetailsMessage> 

Próbuję uzyskać CPProjectId jako uniqueidentifier używając:

DECLARE @myDoc xml 
DECLARE @ProdID varchar(max) 

SET @myDoc = '<ExportProjectDetailsMessage xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Project"><CPProjectId>7665699f-6772-424c-8b7b-405b9220a8e7</CPProjectId></ExportProjectDetailsMessage>' 

SET @ProdID = @myDoc.value('(ExportProjectDetailsMessage/CPProjectId)[1]', 'varchar(max)') 
SELECT @ProdID 

Wszystko mogę otrzymać NULL =/ Próbowałem wielu kombinacji na @ myDoc.value, ale bez wyników =/

Jak mogę pobrać wartość z mojego XML?

Dzięki!

--EDIT: Coś, co zauważyłem, kiedy usunę deklarację przestrzeni nazw z pliku XML, to działa dobrze! Problem polega na tym, że potrzebuję tych przestrzeni nazw! =/

+0

Patrz: http://stackoverflow.com/questions/4081906/sql-server-xml-namespace-querying-problem Sztuką jest „przestrzeni nazw”, a następnie za pomocą „NS” Formularz. –

Odpowiedz

4

Masz rację, przestrzeń nazw to problem. Zapytanie szuka węzła ExportProjectDetailsMessage, ale taki węzeł nie istnieje w dokumencie, ponieważ w dokumencie jest zadeklarowana domyślna przestrzeń nazw. Ponieważ nie można usunąć, że (nie trzeba), należy umieścić go w swojej kwerendy XPath tak:

set @ProdId = @myDoc.value(' 
    declare namespace PD="http://schemas.datacontract.org/2004/07/Project";   
(PD:ExportProjectDetailsMessage/PD:CPProjectId)[1]', 'varchar(max)') 

Można również rozważyć nie używając varchar (max), ale być może uniqueidentifier

+0

Man ... Many Thanks! ;) PS: Używałem varchar tylko do testów z innymi polami =] – renanlf

1

A lepszy sposób to zrobić, to po prostu zadeklarować nazw przed każdym z zapytaniami:

;WITH XMLNAMESPACES(DEFAULT 'http://schemas.datacontract.org/2004/07/Project') 

to jak tymczasowej domyślnie. Po uruchomieniu następnego zapytania wsadowego otrzymasz ponownie wartości null, jeśli nie określisz tego przed każdym z wybranych.

Więc zamiast używać "SET", można użyć "SELECT", aby ustawić wartość tak:

;WITH XMLNAMESPACES(DEFAULT 'http://schemas.datacontract.org/2004/07/Project') 
SELECT @ProdID = @myDoc.value('(ExportProjectDetailsMessage/CPProjectId)[1]', 'VarChar(MAX)') 
SELECT @ProdID 

same wyniki, tylko bardziej czytelne i utrzymaniu. znalazłem rozwiązanie tutaj: http://www.sqlservercentral.com/Forums/Topic967100-145-1.aspx#bm967325

+1

Widzę, że pierwsza odpowiedź została przyjęta przed tą odpowiedzią. Ale za to, co jest warte, uznałem, że jest to o wiele lepsza technika (zakładając, że możesz polegać na spójności przestrzeni nazw). – cBlaine

Powiązane problemy