我有2张表:
表1列出了我想从XML字段中提取的XML标记名称。我通过运行此查询来模拟
SELECT 'CLIENT' UNION SELECT 'FEE' UNION SELECT 'ADDRESS'
这将导致单列中包含3行,其名称将用于从XML标记中提取相应的数据。
第二个表有一个名为的列ClientData,它是XML格式,并且具有成千上万的数据行。我的任务是从Table1中指定的XML标记中提取值,在这种情况下,我希望从3个xml标记中获取值:客户端,FEE和ADDRESS。
ClientData
所以,如果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中。
PHONE
coalesce(Cast(ClientData as xml).value('(/XML/PHONE)[1]', 'varchar(max)'), '')
我的问题是,如何使查询动态化,以代替将要从Table2中的XML中提取的标记名进行硬编码,而是使用Tabl1作为要提取的标记名的来源?
我希望我的解释足够好:)
谢谢!
您可以使用 DYNAMIC SQL
DYNAMIC SQL
TagsTable应该具有所有可能的标签
然后,我们可以SQL使用标签名称进行构造并执行它
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