使用XQuery参数编写SQL函数

时间:2009-07-29 11:48:45

标签: sql xml linq sql-function

继续本线程中的一个答案; Using XQuery in Linq To SQL?

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

问题是我有的;

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

  2. 如果我使用 sp_executesql 编写自己的函数,那么我会得到一个“只能在函数内执行函数和扩展存储过程。”

  3. 这是我的功能;

    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."
    

1 个答案:

答案 0 :(得分:1)

您无法执行动态xpath,您应该编写一个通常的查询,其中xpath函数参数是文字字符串,并使用sql:variable(@var)将参数嵌入到这些字符串中。请查看this thread以获取更多信息。