【问题标题】:Get values from XML tags with dynamically specified data fields使用动态指定的数据字段从 XML 标记中获取值
【发布时间】:2014-12-04 22:33:07
【问题描述】:

我有 2 张桌子:

Table1 有一个我想从 XML 字段中提取的 XML 标记名称列表。我通过运行这个查询来模拟这个

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

这会产生一个包含 3 行的列,其名称将用于从 XML 标记中提取相应的数据。

第二个表有一个名为ClientData 的列,它是XML 格式,它有数千行数据。我的任务是从 Table1 中指定的 XML 标记中提取值,在这种情况下,我想要来自 3 个 xml 标记的值:Client、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)

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

我的问题是, 如何使我的查询动态化,而不是硬编码我想从 Table2 中的 XML 中提取的标签名称,而是使用 Tabl1 作为要提取的标签名称的来源?

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

谢谢!

【问题讨论】:

    标签: sql sql-server xml tsql select


    【解决方案1】:

    您可以使用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-12-14
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-20
      • 2020-08-20
      相关资源
      最近更新 更多