1

このスレッドの回答の1つに続いて; Linq To SQLでXQueryを使用していますか?

xmlデータに対してクエリを実行するためにパラメータを受け取るSQLテーブル関数を作成しようとしています。この関数は、linqクエリで使用できます。

私が持っている問題は;

  1. 前述のスレッドからコードを取得すると、「xmlデータ型メソッド「value」の引数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 に答える