1

继此线程中的一个答案之后; 在 Linq To SQL 中使用 XQuery?

我正在尝试创建一个 sql 表函数,该函数将接受参数以便对 xml 数据执行查询。然后,该函数可以由 linq 查询使用。

我遇到的问题是;

  1. 如果我从前面提到的线程中获取代码,我会得到“xml 数据类型方法“值”的参数 1 必须是字符串文字”错误。

  2. 如果我使用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)

谁能想到实现这一目标的方法?

编辑:顺便说一句,我没有直接在 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."
4

1 回答 1

1

您不能执行动态 xpath,您应该使用 xpath 函数参数作为文字字符串编写一个常规查询,并将您的参数嵌入到这些字符串中,并使用sql:variable(@var). 看看这个线程以获取更多信息。

于 2009-07-29T12:10:10.540 回答