2009-02-27 14 views
4

Ich bin mit der folgenden T-SQL-Abfrage in SQL Server 2005 (Management Studio IDE) weitergeben müssen:Wie Parameterwerte an eine T-SQL-Abfrage

DECLARE @id int; 
DECLARE @countVal int; 
DECLARE @sql nvarchar(max); 
SET @id = 1000; 
SET @sql = 'SELECT COUNT(*) FROM owner.myTable WHERE id = @id'; 
EXEC (@sql) AT oracleServer -- oracleServer is a lined server to Oracle 

Ich bin nicht sicher, wie die Eingabeparameter übergeben @id an die EXEC-Abfrage und übergibt das Ergebnis an @countVal. Ich sah einige Beispiele für Microsoft SQL Server wie:

EXEC (@sql, @id = @id) 

ich dies für Oracle versucht, aber ich habe eine Anweisung Fehler:

OLE DB provider "OraOLEDB.Oracle" for linked server "oracleServer" 
returned message "ORA-00936: missing expression" 

Antwort

14

Try this:

EXEC sp_executesql @sql, N'@id int', @id 

Mehr Informationen zu diesem großen Artikel: http://www.sommarskog.se/dynamic_sql.html


Wie für die Ausgabe der SELECT-Bedürfnisse etwa so aussehen:

SELECT @countVal = COUNT(id) FROM owner.myTable WHERE id = @id 

I 'id' anstelle von '*' mir die Auswahl nicht mehr benötigten Daten zu vermeiden, ziehen ...

Dann dynamischer SQL so etwas wie dies sein sollte:

EXEC sp_executesql @sql, 
        N'@id int, @countVal int OUTPUT', 
        @id, 
        @countVal OUTPUT 

Dieses Beispiel angepasst ist, aus dem gleichen Artikel oben verlinkt, im Abschnitt sp_executesql.


Wie für Ihre Oracle-Fehler, müssen Sie die genaue SQL, um herauszufinden, die Oracle Sp_executesql sendet. Wenn ein Profiler oder Abfrageprotokoll in Oracle vorhanden ist, kann das hilfreich sein. Ich habe wenig Erfahrung mit Oracle, aber das wäre der nächste logische Schritt zur Problembehandlung.

+0

Das EXEC() Beispiel funktioniert nicht mit Oracle, sehr traurig. Wenn nicht Parameter in @sql, läuft es gut. Ich habe keine Ahnung, Pass-Through-Abfrage für Oracle-Datenbank mit Ausgabeparameter zurück zu SQL zu verwenden. –

+0

SET @sql = 'auswählen? = count (*) von owner.mytable '; Exec (@ sql, @ countVal-Ausgabe) bei Oracle-Server - Fehler für Oracle-Fall –

+0

Das Problem mit diesem Ansatz ist, dass Sie die Ergebnismenge nicht innerhalb einer anderen Stored Procedure zurückgeben können, ohne eine temporäre Tabelle zu erstellen (nicht möglich mit einer dynamischen Abfrage) ... gibt es dafür keine Funktion? –

0

Ich weiß nicht, warum Sie Pass-ID sind getrennt.

Sie könnten Sie wie folgt vor
SET @sql = 'SELECT COUNT(*) FROM owner.myTable WHERE id = ' + @id

+0

Eingangsparameter sind auf diese Weise in Ordnung, aber Wie steht es mit dem Ergebnis? –

0

Der schnelle und schmutzige Weg besteht darin, den String vor der Verwendung der EXEC-Anweisung zu erstellen, dies ist jedoch nicht die empfohlene Vorgehensweise, da Sie sich möglicherweise für SQL Injection öffnen.

DECLARE @id int; 
DECLARE @countVal int; 
DECLARE @sql nvarchar(max); 
SET @id = 1000; 
SET @sql = 'SELECT COUNT(*) FROM owner.myTable WHERE id = ' + @id 
EXEC (@sql) AT oracleServer -- oracleServer is a lined server to Oracle 

Der richtige Weg, dies zu tun ist, um die System gespeicherte Prozedur sp_executesql zu verwenden, wie von magnifico detailliert und von Microsoft in der Onlinedokumentation ist zu empfehlen:

EXEC sp_executesql @sql, N'@id int', @id 
Verwandte Themen