2011-06-01 111 views
2

我已經編寫了一個接口與CubeIQ BlackBox(www.magiclogic.com)進行交互,並且我有一個SQL Server 2005數據庫表,其中存儲了一些常規文本字段,日期和具有XML數據類型的列中的兩段XML。從存儲在XML數據類型中的XML查詢屬性和節點值

我想從XML中挑出一些值,但我無法弄清楚如何查詢XML或該XML內節點的屬性。

這裏是我想要做的查詢類型:

SELECT 
    [regular_table_field1], 
    [regular_table_field2], 
    [opt_resposne_xml][email protected]('someattribute') AS 'someattribute', 
    [opt_resposne_xml][email protected]('someattribute2') AS 'someattribute2' 
FROM [optimizations] WHERE [opt_concept_id] = '1234' 

回答

2

不知道你的XML是什麼樣子,這裏有一個通用的代碼給你的將是什麼樣子的想法:

SELECT 
    [regular_table_field1], 
    [regular_table_field2], 
    [opt_resposne_xml].value('(/rootnode/wrapper/child/@someattribute)[1]', 'int') AS 'someattribute', 
    [opt_resposne_xml].value('(/rootnode/wrapper/child/@someattribute2)[1]', 'varchar(50)') AS 'someattribute2' 
FROM 
    [optimizations] 
WHERE 
    [opt_concept_id] = '1234' 

如果您需要「到達」XML列並獲取單個值(來自XML元素或屬性),則基本上需要將XPath定義爲您感興趣的信息位置in位於,並且您需要將其轉換爲給定的SQL Server數據類型。

如果您需要將單個關係行交叉連接到來自單個XML字段的多個元素,則可能需要其他方法(CROSS APPLY)。

另外:您可能需要注意涉及的XML名稱空間 - 嘗試解析SQL Server中的XML時常見的錯誤。

+0

非常感謝你。我找到了解釋過程如何工作但無法使查詢正常工作的語法的MSDN文章。你能解釋一下爲什麼你必須把XPath查詢放在(parens)中,爲什麼最後有一個[1]?這是在一組節點中指定該屬性的第一個,第二個第三個等外觀的方式嗎? – DirtyBirdNJ 2011-06-01 20:42:16

+0

爲什麼選擇parens?我不知道 - 你得問問定義這一點的微軟設計師。 '[1]'表示第一次出現 - 如果您想將其轉換爲單個數據值,則需要確保它只是返回一個XML節點/屬性。是的 - 你也可以使用'[2]'獲得第二個 - 但要小心,以確保有第二個.... – 2011-06-01 20:43:49

+0

我實際上是在試圖看看它會如何工作......如果我離開[1]我得到一個錯誤......因爲沒有[2]它會返回NULL,如果我使用它。我基本上是寫這個完全相同的查詢,但沒有額外的parens和括號內的索引指標。 – DirtyBirdNJ 2011-06-01 20:51:03