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;
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“.
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."
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
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. –
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