在T-SQL中忽略XML命名空间

Jak*_*ade 9 t-sql sql-server-2005 xml-namespaces

使用T-SQL查询数据时,如何删除/忽略xml文件中的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)
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

这有效,查询返回:

1
2
3

但XML还包含一个默认命名空间:

<myroot xmlns="http://XXX" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
Run Code Online (Sandbox Code Playgroud)

xmlns="http://XXX"完全搞砸了我的查询.不幸的是,在加载之前手动修改xml并不是一个真正的选择.

问题:

  • 将数据加载到变量中时,如何删除或忽略命名空间?
  • 或者如何修改我的查询来处理命名空间?

mar*_*c_s 20

只要用这个:

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

WITH XMLNAMESPACES允许您定义命名空间aliasses为你的查询,如果你不关心具体的XML命名空间前缀,你可以把它定义为DEFAULT命名空间,并用它做.