在以下链接中 https://msdn.microsoft.com/en-us/library/ms175178.aspx 我发现这个cote"然后在查询正文中使用此前缀而不是命名空间URI"
这让我感到沮丧,如果我没有指定前缀,那么我必须使用uri代替前缀。那么请给我一个使用uri代替前缀的例子, 因为在上面的链接中没有给出。只有他们给出带前缀的例子。
你自己以来
答案 0 :(得分:1)
这个问题不是一个好问题:请阅读How to ask a good SQL question和How to create a MCVE
但我会尽力回答......
命名空间旨在分隔具有相同名称的元素。通常,XML片段只是粘合在一起。 非常可能,具有相同名称的不同元素聚集在一起。通过使用命名空间,命名空间和元素名称的组合用于标识元素。但它并不重要,别名用于指向命名空间!
您必须区分“命名空间”和给定的“别名”。
以下示例包含两种风格的元素<a>
。看看这个:
DECLARE @xml XML=
N'<root xmlns="DefaultNS" xmlns:dns="DerivedNS">
<a>This is default</a>
<dns:a>This is derived</dns:a>
</root>';
- 没有结果
SELECT a.value(N'(text())[1]',N'nvarchar(max)')
FROM @xml.nodes(N'/root/a') AS A(a);
- wildcard-namespace:Everything
SELECT a.value(N'(text())[1]',N'nvarchar(max)')
FROM @xml.nodes(N'/*:root/*:a') AS A(a);
- 仅声明默认名称空间:仅返回默认元素
WITH XMLNAMESPACES(DEFAULT 'DefaultNS')
SELECT a.value(N'(text())[1]',N'nvarchar(max)')
FROM @xml.nodes(N'/root/a') AS A(a);
- .nodes()调用派生命名空间:仅返回派生元素
WITH XMLNAMESPACES(DEFAULT 'DefaultNS'
,'DerivedNS' AS xyz) --Other prefix, doesn't matter
SELECT a.value(N'(text())[1]',N'nvarchar(max)')
FROM @xml.nodes(N'/root/xyz:a') AS A(a); --prefix "dns" would not work, the alias is now "xyz"
- 这里我使用随机前缀。我把“dns”作为默认的别名!
WITH XMLNAMESPACES('DefaultNS' AS dns
,'DerivedNS' AS dns2) --random prefixes for the namespaces, took even dns for the wrong one!
SELECT a.value(N'(text())[1]',N'nvarchar(max)')
FROM @xml.nodes(N'/dns:root/dns:a') AS A(a); --prefix "dns" returns the default ns now! And you need the prefix at `root` too!
- 使用内联声明
SELECT a.value(N'(text())[1]',N'nvarchar(max)')
FROM @xml.nodes(N'declare namespace x="DefaultNS"; /x:root/x:a') AS A(a); --The alias "x" is now bound to the default namespace!