2011-03-29 69 views
8

如何在使用T-SQL查詢數據時刪除/忽略xml文件中的XML名稱空間?忽略T-SQL中的XML名稱空間

我正在加載一個xml文件到一個變量,它工作得很好。但是XML有一個命名空間設置,除非我刪除它,否則我的查詢會變空。

T-SQL:

DECLARE @xml xml 
SELECT @xml = BulkColumn FROM OPENROWSET(BULK 'C:\myfile.xml', SINGLE_BLOB) AS A 

SELECT X.z.value('ID[1]', 'VARCHAR(3)') FROM @xml.nodes('myroot/element') AS X(z) 

XML示例:

<?xml version="1.0" encoding="utf-8"?> 
<myroot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <element> 
    <ID>1</ID> 
    </element> 
    <element> 
    <ID>2</ID> 
    </element> 
    <element> 
    <ID>3</ID> 
    </element> 
</myroot> 

這工作,查詢將返回此:

但XML還包含了默認命名空間:

<myroot xmlns="http://XXX" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

xmlns="http://XXX"完全搞砸了我的查詢。不幸的是,在加載之前手動修改xml並不是真正的選擇。

問題:

  • 如何刪除或忽略的命名空間時,我的數據加載到變量?
  • 或者如何修改我的查詢來處理命名空間?

回答

19

只要使用此:

;WITH XMLNAMESPACES(DEFAULT 'http://XXX') 
SELECT 
    X.z.value('ID[1]', 'VARCHAR(3)') 
FROM 
    @xml.nodes('/myroot/element') AS X(z) 

WITH XMLNAMESPACES允許你定義命名空間aliasses爲你的查詢,如果你不關心具體的XML命名空間前綴,你可以把它定義爲DEFAULT命名空間並完成它。

+0

非常好,它完美的作品。謝謝。 :) – 2011-03-29 06:59:40

3

我在我的XML查詢中遇到了同樣的問題。 Namespace "xmlns="urn:tradefeed-xsd"正在創建問題,我的查詢返回空。

<?xml version="1.0" encoding="UTF-8" ?> 
<BatchFeed xmlns="urn:tradefeed-xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

一旦我在select語句之前使用;WITH XMLNAMESPACES(DEFAULT 'urn:tradefeed-xsd')語句,它將返回數據。