2011-08-05 24 views
6

我有一個XML這樣的:T-SQL XML從節點問題中獲取值?

<?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> 

我試圖使用獲得CPProjectId作爲唯一標識符:

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 

所有我能夠接收到NULL =/ 我試過很多的組合on @ myDoc.value但沒有結果=/

如何從我的XML中檢索值?

謝謝!

- EDIT: 我注意到,當我從XML中刪除名稱空間聲明它工作正常! 問題是我需要這個命名空間! =/

+0

請參閱:http://stackoverflow.com/questions/4081906/sql-server-xml-namespace-querying-problem技巧是「WITH NAMESPACES」,然後使用「ns:」形成。 – 2011-08-05 20:46:37

回答

4

你是對的命名空間是問題。您正在查詢的是查找節點ExportProjectDetailsMessage,但這樣的節點不存在於您的文檔中,因爲在您的文檔中聲明瞭一個默認名稱空間。既然你無法刪除(也不應該知道),你應該包括在你的XPath查詢,像這樣:

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

您也可以考慮不使用VARCHAR(最大值),但也許是唯一標識符

+0

男人..很多謝謝! ;)PS:我正在使用varchar僅用於其他字段的測試=] – renanlf

1

一更好的方式來做到這一點是每個查詢的前簡單地聲明命名空間:

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

它就像一個臨時的默認。當您在批處理中運行下一個查詢時,如果您未在每次選擇之前指定此值,則會再次得到空值。

因此,而不是使用「SET」,可以用「選擇」設置值,像這樣:

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

同樣的結果,只是更具可讀性和可維護性。 我在這裏找到了解決方案:http://www.sqlservercentral.com/Forums/Topic967100-145-1.aspx#bm967325

+1

我看到第一個答案在此響應之前被接受。但是對於它的價值,我發現這是一個更好的技術(假設你可以依賴名稱空間是一致的)。 – cBlaine