继续本线程中的一个答案; Using XQuery in Linq To SQL?
我正在尝试创建一个sql表函数,它将获取参数以便对xml数据执行查询。然后,该函数可以由linq查询使用。
问题是我有的;
如果我从前面提到的线程中获取代码,我得到一个“xml数据类型方法的参数1”值“必须是字符串文字”错误。
如果我使用 sp_executesql 编写自己的函数,那么我会得到一个“只能在函数内执行函数和扩展存储过程。”
这是我的功能;
CREATE FUNCTION fnGetOpManualXMLDataFromInt
(
-- Add the parameters for the function here
@valueXPath varchar(255),
@criteriaXPath varchar(255),
@intCriteriaVal int
)
RETURNS @returntable TABLE
(
omId int,
xmlNodes xml
)
AS
BEGIN
DECLARE @strExecute nvarchar(4000), @SingleQuote varchar(1)
SET @SingleQuote = char(39)
SET @strExecute = 'insert into @returntable select omID,
omText.query(' + @SingleQuote + @valueXPath + @SingleQuote + ') as Value
from dbo.htOperationsManuals
where omText.value(' + @SingleQuote + @criteriaXPath + @SingleQuote + ', ' + @SingleQuote + 'int' + @SingleQuote + ') = ' + ltrim(str(@intCriteriaVal))
exec sp_executesql @strExecute
return
end
这是我对它的考验;
DECLARE
@valueXPath varchar(255),
@criteriaXPath varchar(255),
@intCriteriaVal int
SET @valueXPath = '/operationsManual/sections/section/contentItem'
SET @criteriaXPath = '(/operationsManual/sections/section/contentItem/imageContentItem/imageId)[1]'
SET @intCriteriaVal = 131
select * from fnGetOpManualXMLDataFromInt(@valueXPath, @criteriaXPath, @intCriteriaVal)
有人能想出实现这个目标的方法吗?
编辑:BTW,我不是直接在linq中这样做的原因是我得到了一个错误; Dim imageUsage = From opmanual In dc.OperationsManuals _
Where opmanual.OutOfService = False _
And opmanual.omText.<sections>.<section>.<contentItem>.<imageContentItem>.<imageId>.Value = imageId _
Select opmanual
错误;
Message = "Method 'System.Collections.Generic.IEnumerable`1[System.Xml.Linq.XElement] Elements(System.Xml.Linq.XName)' has no supported translation to SQL."
答案 0 :(得分:1)
您无法执行动态xpath,您应该编写一个通常的查询,其中xpath函数参数是文字字符串,并使用sql:variable(@var)
将参数嵌入到这些字符串中。请查看this thread以获取更多信息。