admin

从具有动态指定的数据字段的XML标记中获取值

sql

我有2张表:

表1列出了我想从XML字段中提取的XML标记名称。我通过运行此查询来模拟

SELECT 'CLIENT' UNION SELECT 'FEE' UNION SELECT 'ADDRESS'

这将导致单列中包含3行,其名称将用于从XML标记中提取相应的数据。

第二个表有一个名为的列ClientData,它是XML格式,并且具有成千上万的数据行。我的任务是从Table1中指定的XML标记中提取值,在这种情况下,我希望从3个xml标记中获取值:客户端,FEE和ADDRESS。

所以,如果XML是这个

<XML>
    <CLIENT>some client</CLIENT>
    <FEE>some fee</FEE>
    <ADDRESS>some address</ADDRESS>
 </XML>

运行查询后,我应该得到这个:

Client, FEE, ADDRESS

some client, some fee, some address

现在我有一个查询:

SELECT coalesce(Cast(ClientData as xml).value('(/XML/CLIENT)[1]', 'varchar(max)'), ''), coalesce(Cast(ClientData as xml).value('(/XML/FEE)[1]', 'varchar(max)'), ''), coalesce(Cast(ClientData as xml).value('(/XML/ADDRESS)[1]', 'varchar(max)'), '') FROM dbo.Table2 WITH(NOLOCK)

这给了我必要的结果,但是它不是动态的。意思是,如果我想包含第四个xml值,可以说PHONE,我需要将其添加coalesce(Cast(ClientData as xml).value('(/XML/PHONE)[1]', 'varchar(max)'), '')到SELECT中。

我的问题是,如何使查询动态化,以代替将要从Table2中的XML中提取的标记名进行硬编码,而是使用Tabl1作为要提取的标记名的来源?

我希望我的解释足够好:)

谢谢!


阅读 138

收藏
2021-06-07

共1个答案

admin

您可以使用 DYNAMIC SQL

TagsTable应该具有所有可能的标签

然后,我们可以SQL使用标签名称进行构造并执行它

create table TagsTable
(  tagName varchar(256)
)

insert into TagsTable values ('CLIENT')
insert into TagsTable values ('FEE')
insert into TagsTable values ('ADDRESS')

declare @query nvarchar(max)

SELECT @query = STUFF((select  ',' + 'coalesce(Cast(ClientData as xml).value(''(/XML/' 
                                   + tagName + ')[1]'', ''varchar(max)''), '''') as ' + tagName +' '
FROM TagsTable
FOR XML PATH ('') ), 1,1,'')


SET @query = 'SELECT ' +  @query + 'FROM dbo.Table2 WITH(NOLOCK)'
select @query

exec sp_executesql @query
2021-06-07