我正在粉碎视图中的 xml 列,并从该列中提取信息。我的视图当前正在 local-name((/*)[1] 上运行大型 CASE 语句以获取 XML 中根节点的名称,然后我正在钻入 xml 以根据 CASE 获取特定值.
例如
CASE xdata.value('local-name((/*)[1])', 'sysname')
WHEN 'Person' THEN xdata.value('(/*/PersonGuid/Personnel/@UserName)[1]', 'varchar(50)')
WHEN 'Component' THEN xdata.value('(/*/ComponentGuid/Component/@Number)[1]', 'varchar(50)')
END
这个案例陈述非常庞大且笨拙。
我试图做的是在 CTE 中构建一个字典,其中包含我在 CASE 中评估的项目,然后是我想提供给 XML value 方法的参数值。例如,对于上面的示例,CTE 字典将包含以下内容(并且 CTE 正确连接到主外部查询中):
;WITH CTE_Selector (TableName, Selector) AS
(
SELECT 'Person', '(/*/PersonGuid/Personnel/@UserName)[1]'
UNION SELECT 'Component' ,'(/*/ComponentGuid/Component/@Number)[1]'
)
当我尝试在我的视图中使用 CTE 来避免 case 语句时,例如:
, xdata.value(CTE_Selector.Selector, 'varchar(50)')
我收到以下错误: XML 数据类型方法“查询”的参数 1 必须是字符串文字。
所以简而言之,XML value 方法似乎需要一个常量字符串。有没有办法解决?