0

我正在粉碎视图中的 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 方法似乎需要一个常量字符串。有没有办法解决?

4

1 回答 1

1

您不能使用列或变量来代替 XQuery 表达式。您可以在 XQuery 表达式中使用列或变量,但我认为在这种情况下这对您没有多大帮助。

sql:column()
sql:变量()

您只能使用一次调用 . value()像这样。

xdata.value('(
              /Person/PersonGuid/Personnel/@UserName,
              /Component/ComponentGuid/Component/@Number
             )[1]', 'varchar(50)')
于 2012-05-24T05:40:50.447 回答