我已经在其他地方尝试了一段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进行搜索。那有什么变通方法吗?
任何想法?
答案 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
)。
如果有帮助,请告诉我们。