我正在开发一个项目,我有两个存储XML值的小表。我的要求是根据条件提取列。
我有一个变量tempvar。当tempvar =' H'时,我希望这两个表中的所有节点都以XML方式显示
当tempvar =' P'时,我希望第一个表中的所有节点和第二个表中只有一个节点以XML方式显示
Rexter链接:http://rextester.com/BSRX9069
我只创建了临时表。并包含了rexter中每个条件的所需输出。
无从何处开始。有什么帮助吗?
答案 0 :(得分:1)
我不知道我是否正确得到了这个:
create table #temp1(xml_data xml)
insert into #temp1
select
xml_data =
(select
cid = '1001',
name = 'tim',
age = '15',
req = '1',
part = '1'
for xml path(''),type)
create table #temp2(xml_data xml)
insert into #temp2
select
xml_data =
(select
cid = '1001',
education = '5',
resi = 'Yes',
active = '1'
for xml path(''),type);
- 声明你的变量
DECLARE @YourVar CHAR(1)='H';
- XML将省略任何NULL值。最终CASE
中的SELECT
会将所有不需要的值设置为NULL。效果:它们不会出现在最终的XML中:
WITH t1 AS
(
SELECT xml_data.value(N'(cid/text())[1]',N'int') AS cid
,xml_data.value(N'(name/text())[1]',N'nvarchar(max)') AS [name]
,xml_data.value(N'(age/text())[1]',N'int') AS age
,xml_data.value(N'(req/text())[1]',N'int') AS req
,xml_data.value(N'(part/text())[1]',N'int') AS part
FROM #temp1
)
,t2 AS
(
SELECT xml_data.value(N'(cid/text())[1]',N'int') AS cid
,xml_data.value(N'(education/text())[1]',N'int') AS education
,xml_data.value(N'(resi/text())[1]',N'nvarchar(max)') AS resi
,xml_data.value(N'(active/text())[1]',N'int') AS active
FROM #temp2
)
SELECT t1.*
,CASE WHEN @YourVar='H' THEN t2.education END AS education
,CASE WHEN @YourVar='H' THEN t2.resi END AS resi
,CASE WHEN @YourVar='H' THEN t2.active END AS active
FROM t1
INNER JOIN t2 ON t1.cid=t2.cid
FOR XML PATH('root');
--clean-up
go
drop table #temp1, #temp2