【发布时间】: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