2016-05-02 11 views
0

Folgendes ist die Abfrage, die ich ausführe. Ich erhalte XML-Eingabe von C# in @ XMLdata Parameter.XML-Fehler in SQL-Server

CREATE TABLE #TablesList 
(
    TableName VARCHAR(500), 
    RefTable VARCHAR(500), 
    RefTableIDColumn VARCHAR(500) 
) 


SET @Query = @Query + ' INSERT INTO #TablesList SELECT ref.value(''tablename[1]'',''nvarchar(500)'') AS tablename,' 
SET @Query = @Query + ' ref.value(''refTable[1]'',''nvarchar(500)'') AS refTable, ref.value(''refTableIDColumn[1]'',''nvarchar(500)'') AS refTableIDColumn FROM ' 
SET @Query = @Query + @XMLdata+'.nodes(''//Table[@name="'[email protected]+'"]'') AS R(ref)' 
EXEC(@Query) 

Wenn ich die Abfrage ausführen, erhalte ich den folgenden Fehler. Fehler ist für die 2. letzte Zeile

The data types varchar(max) and xml are incompatible in the add operator. 
+0

Was die Datentypen von '@ Query' und' @ XMLdata' sind? – Adwaenyth

+0

varchar (max) und XML bzw. – user2998990

+0

Dann wird es nicht funktionieren, weil Sie versuchen, einen XML-Datentyp implizit in ein Varchar zu konvertieren, das nicht definiert ist. Wenn Sie in der konstruierten Abfrage auf den XML-Code als XML-Datentyp zugreifen müssen, müssen Sie ihn übergeben, auswählen oder anderweitig in der Abfrage erstellen, die Sie erstellen möchten. – Adwaenyth

Antwort

2

Statt Inhalt @XMLdata in die dynamische SQL-Zeichenfolge Injektion, versuchen @XMLdata als Parameter sp_executesql weitergeben müssen:

..... 
SET @Query = @Query + '@XMLdata.nodes(''//Table[@name="'[email protected]+'"]'') AS R(ref)' 
EXEC sp_executesql @Query, N'@XMLdata XML', @XMLdata 

Soweit dynamische SQL in der entsandte Wenn Sie sich fragen, können Sie die Verwendung von dynamischem SQL vollständig vermeiden. Der einzige ‚dynamische‘ Teil des dynamischen SQL kommt vom Wert des @DataItem Variable, die beiläufig sql:variable() mit behandelt werden können, wie folgt:

INSERT INTO #TablesList 
SELECT 
    ref.value('tablename[1]','nvarchar(500)') AS tablename, 
    ref.value('refTable[1]','nvarchar(500)') AS refTable, 
    ref.value('refTableIDColumn[1]','nvarchar(500)') AS refTableIDColumn 
FROM @XMLdata.nodes('//Table[@name=sql:variable("@DataItem")]') AS R(ref) 
+1

Ich denke, Sie magische Glaskolben zeigt in die richtige Richtung (+1 von meiner Seite), aber meine Frage war, warum braucht es dynamische SQL und 'sp_executesql' überhaupt? – Shnugo

+0

@Shnugo Sie haben Recht. Die SQL, die OP gepostet hat, kann ohne dynamisches SQL überhaupt ausgeführt werden (meine Antwort wurde aktualisiert, um diesen Punkt einzuschließen). Vielleicht gibt es einen Teil des dynamischen SQL, der nicht in Frage ist, der * er * gezwungen hat, diese Route zu gehen, nicht sicher .... – har07

+0

Sie sind Genie .... das hat funktioniert ... – user2998990