是否可以使用SQL Server中的XQuery从输出中实现下表?
编辑:我的要求发生了变化,请考虑我有一个存储以下xml和UserID的表
DECLARE @XML xml
set @XML = '<Security>
<FiscalYear Name="2012">
<Country Id="204">
<State Id="1">
<City Id="10"></City>
</State>
<State Id="2">
<City Id="20"></City>
<City Id="30"></City>
</State>
<State Id ="3"></State>
</Country >
</FiscalYear>
</Security>'
CREATE TABLE #tmp_user
(UserID INT,SecurityXML XML)
INSERT INTO #tmp_user
( UserID, SecurityXML )
VALUES ( 1,
@XML
)
现在我怎么能得到一个类似
的o / p输出:
UserID StateID CityID
1 1 10
1 2 20
1 2 30
1 3 0
有可能实现吗?
答案 0 :(得分:4)
我稍微修改了你的XML,因为它无效。将结束标记</Subsidiary>
更改为</Country>
。
declare @XML xml
set @XML =
'<Security>
<FiscalYear Name="2012">
<Country Id="204">
<State Id="1">
<City Id="10"></City>
</State>
<State Id="2">
<City Id="20"></City>
<City Id="30"></City>
</State>
<State Id ="3"></State>
</Country>
</FiscalYear>
</Security>'
select S.N.value('@Id', 'int') as StateID,
coalesce(C.N.value('@Id', 'int'), 0) as CityID
from @XML.nodes('/Security/FiscalYear/Country/State') as S(N)
outer apply S.N.nodes('City') as C(N)
使用表而不是XML变量的版本
select T.UserID,
S.N.value('@Id', 'int') as StateID,
coalesce(C.N.value('@Id', 'int'), 0) as CityID
from #tmp_user as T
cross apply T.SecurityXML.nodes('/Security/FiscalYear/Country/State') as S(N)
outer apply S.N.nodes('City') as C(N)