根据SQL

时间:2018-06-13 19:42:48

标签: sql-server xml

我正在开发一个项目,我有两个存储XML值的小表。我的要求是根据条件提取列。

  1. 我有一个变量tempvar。当tempvar =' H'时,我希望这两个表中的所有节点都以XML方式显示

  2. 当tempvar =' P'时,我希望第一个表中的所有节点和第二个表中只有一个节点以XML方式显示

  3. Rexter链接:http://rextester.com/BSRX9069

    我只创建了临时表。并包含了rexter中每个条件的所需输出。

    无从何处开始。有什么帮助吗?

1 个答案:

答案 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