2013-05-06 50 views
1

我正在使用SQL Server 2008.我在一個名爲RequestParameters的字段中使用XML數據稱爲Requests。一個例子是:SQL - 從表字段中讀取XML節點

<RequestParameters xmlns="http://schemas.datacontract.org/2004/07/My.Name.Space" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/" z:Id="1"> 
    <Data z:Id="2" i:type="CheckoutRequest"> 
    <UserGuid>7ec38c44-5aa6-49e6-9fc7-25e9028f2148</UserGuid> 
    <DefaultData i:nil="true" /> 
    </Data> 
</RequestParameters> 

我最終想要檢索UserGuid的值。爲此,我這樣做:

SELECT RequestParameters.value('(/RequestParameters/Data/UserGuid)[0]', 'uniqueidentifier') as UserGuid 
FROM Requests 

但是,我看到的結果都是NULL。我究竟做錯了什麼?

回答

2

您可以指定默認的命名空間,並使用[1]代替[0]

WITH XMLNAMESPACES(default 'http://schemas.datacontract.org/2004/07/My.Name.Space') 
SELECT RequestParameters.value('(/RequestParameters/Data/UserGuid)[1]', 'uniqueidentifier') as UserGuid 
FROM Requests; 

SQL Fiddle

+0

它的功能就像一個魅力。請問爲什麼1而不是0? – 2013-05-06 06:15:27

+0

是的,指定nanespace是必要的。 +1 – 2013-05-06 06:16:15

+1

@Noobie'[1]'用於指定所需值的第一個實例。如果在XML中有多個UserGuid,那麼可以使用'[2]'獲取第二個實例。 '[0]'在第一個和第一個之前指定了值*。在第一個之前沒有任何東西,所以你沒有得到任何回報。 – 2013-05-06 06:19:35

-1
declare @XML xml 

    set @XML = "<RequestParameters  xmlns="http://schemas.datacontract.org/2004/07/My.Name.Space"  xmlns:i="http://www.w3.org/2001/XMLSchema-instance"  xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/" z:Id="1"> 
    <Data z:Id="2" i:type="CheckoutRequest"> 
     <UserGuid>7ec38c44-5aa6-49e6-9fc7-25e9028f2148</UserGuid> 
     <DefaultData i:nil="true" /> 
    </Data> 
    </RequestParameters>" 

select @XML.value('(/RequestParameters/Data /UserGuid)[1]', 'varchar') 
    ' 
+0

爲什麼投下來? – 2013-05-06 06:09:41

+1

這可能是因爲這個答案不起作用。你試過了嗎?如果不是,你可以測試它[** here **](http://sqlfiddle.com/#!3/d41d8/13179) – 2013-05-06 11:49:24