XML数据类型方法“nodes”的参数1必须是字符串文字

时间:2014-02-04 16:50:45

标签: sql-server xml

我已经在其他地方尝试了一段sql查询来从XML字符串中获取值并且它可以工作,但是当我尝试在几乎类似的情况下在其他地方实现它时,我收到此错误:

XML数据类型方法节点的参数1必须是字符串文字

我的查询是这样的:

        Select * into #ContentItemsOnStaging from ( SELECT A.id as
        NodeID,A.text as NodeName,B.text as Parent , A.createDate as
        DateCreated ,
-- Problem is from here
        ( SELECT pref.value('(/' + E.alias
        +'/@updateDate)[1]', 'datetime') AS LastUpdatedDate FROM   
(SELECT  CAST(xml AS xml) AS XmlCol FROM [ContentXml] WHERE nodeId = A.id )  
AS XmlStuff CROSS APPLY XmlCol.nodes('/' + E.alias) AS x(pref) ) 
-- To Here
        FROM [Node] as A left join Node B on A.parentID = B.id left join [ContentXml] as C on 
    A.id = C.nodeId  left join [Content] as D on A.id = D.nodeId  left join [cmsContentType] 
    as E on D.contentType = E.nodeId) as test2

问题来自E.Alias。 我需要的是发送一个可定制的Header进行搜索。那有什么变通方法吗?

任何想法?

1 个答案:

答案 0 :(得分:4)

您正在尝试将cmsContentType.Alias中的关系数据绑定到xml元素名称。出错的原因是您正在通过字符串连接构建xquery路径,这不会起作用。

要从xquery引用该列,您需要使用sql:column()函数。下面是一个简单的示例,more info here

declare @tab table (Alias varchar(100));
insert into @tab
    select 'one' union all
    select 'two'


declare @x xml;
set @x = '<root><one updateDate="01-01-2014" /><two updateDate="01-01-2013" /></root>';

select  Alias,
        @x.value('(//*[local-name(.)=sql:column("t.Alias")])[1]/@updateDate', 'datetime')
from    @tab t;

这将为您提供加入<root>值的Alias下面的第一个元素,然后检索属性值(updateDate)。

如果有帮助,请告诉我们。