2009-07-29 5 views
1

Im Anschluss an eine der Antworten in diesem Thread; Using XQuery in Linq To SQL?SQL-Funktion mit XQuery-Parametern schreiben

Ich versuche eine SQL-Tabellenfunktion zu erstellen, die Parameter nimmt, um Abfragen auf XML-Daten durchzuführen. Die Funktion kann dann von einer linq-Abfrage konsumiert werden.

Ausgabe ist ich sind;

  1. Wenn i den Code aus dem zuvor erwähnten Faden i erhalte ein „1 Das Argument des XML-Datentyp-Methode‚Fehlerwert‘muss ein String Literal“.

  2. Wenn ich meine eigene Funktion schreibe mit sp_executesql dann bekomme ich ein "Nur Funktionen und erweiterte gespeicherte Prozeduren können aus einer Funktion heraus ausgeführt werden."

Hier ist meine Funktion;

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 

Und hier ist mein Test dafür;

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) 

Kann jemand an einen Weg denken, dies zu erreichen?

EDIT: BTW, der Grund, warum ich dies nicht direkt in Linq tun, ist, dass ich einen Fehler erhalten;

Dim imageUsage = From opmanual In dc.OperationsManuals _ 
        Where opmanual.OutOfService = False _ 
        And opmanual.omText.<sections>.<section>.<contentItem>.<imageContentItem>.<imageId>.Value = imageId _ 
        Select opmanual 

Fehler;

Message = "Method 'System.Collections.Generic.IEnumerable`1[System.Xml.Linq.XElement] Elements(System.Xml.Linq.XName)' has no supported translation to SQL." 

Antwort

1

Sie können nicht dynamisch XPath ausführen, sollten Sie eine übliche Abfrage mit XPath-Funktion Argumente sind Zeichenketten und betten Sie Ihre Parameter in diesen Strings mit sql:variable(@var) schreiben. Werfen Sie einen Blick auf this thread für weitere Informationen.

+0

Ok, kann ich SQL sehen: Die Variablen sind wahrscheinlich der Weg zu gehen .... ich nicht viele ähnliche Beispiele, wo die SQL-Variable enthält den gesamten Pfad finden kann ... Nur dort, wo es im traditionellen Sinn verwendet wird wird Halten einer Variablen zum Vergleich mit fest codierten XML-Elementen/Attributpfaden. Irgendwelche Ideen? – GordonB

+0

Ich bin mir nicht sicher, ob das überhaupt möglich ist, ich musste es nie tun. Ich denke, selbst wenn das möglich ist, könntest du es mit etwas cleverem dynamischem Quasseln oder so etwas erreichen. –

+0

Am Ende auf diesem, habe ich eine gespeicherte Prozedur ... verwiesen sie dann in Linq und verwendet, um die Ergebnismenge zu den anderen Linq Tabellen i zu verwenden, benötigt beizutreten. Einfach. – GordonB