2010-11-11 90 views
0
declare @myDoc xml 
set @myDoc = '<Form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.mydomain.org/MySchema.xsd" SectionId="ABCD" Description="Some stuff"> 
<ProductDescription ProductID="1" ProductName="Road Bike"> 
<Features> 
    <Warranty>1 year parts and labor</Warranty> 
    <Maintenance>3 year parts and labor extended maintenance is available</Maintenance> 
</Features> 
</ProductDescription> 
</Form>' 

;WITH XMLNAMESPACES( 'http://www.w3.org/2001/XMLSchema-instance' as xsi, 'http://www.w3.org/2001/XMLSchema' as xsd, DEFAULT 'http://www.mydomain.org/MySchema.xsd') 
SELECT @myDoc.value('/Form[@SectionId][0]', 'varchar') 

我需要獲取SectionId的屬性值作爲nvarchar嗎? ?既然你從未使用屬性的XML DML查詢

;WITH XMLNAMESPACES(DEFAULT 'http://www.mydomain.org/MySchema.xsd') 
SELECT @myDoc.value('(/Form/@SectionId)[1]', 'VARCHAR(100)') AS SectionId 

/提及任何的:我怎麼辦呢?

T和R 馬克

回答

1

你可以寫它更簡單xsixsd名稱空間,不需要聲明這些名稱空間。

而且由於您只從一個元素中獲取一個屬性,因此使用.nodes()函數創建內部「虛擬表」也是沒有意義的。

+0

感謝marc,但我沒有添加命名空間,xml的生產者這樣做,我必須保留它們作爲SELECT沒有它們返回NULL。真正的XML實際上存儲在一個無類型的xml列而不是xml類型的變量。 我正在使用.nodes(),因爲我不能保證只有一個。但我明白你的觀點。 – 2010-11-11 17:51:34

0
;WITH XMLNAMESPACES( 'http://www.w3.org/2001/XMLSchema-instance' as xsi, 'http://www.w3.org/2001/XMLSchema' as xsd, DEFAULT 'http://www.mydomain.org/MySchema.xsd') 
SELECT Node.value('@SectionId', 'VARCHAR(100)') AS SectionId 
FROM @myDoc.nodes('/Form') TempXML (Node);