Wie kann ich einen Parameter in SQL OpenQuery verwenden, z.
SELECT * FROM OPENQUERY([NameOfLinkedSERVER], 'SELECT * FROM TABLENAME
where field1=@someParameter') T1 INNER JOIN MYSQLSERVER.DATABASE.DBO.TABLENAME
T2 ON T1.PK = T2.PK
sql
parameters
openquery
gaponte69
quelle
quelle
Antworten:
Aus der OPENQUERY- Dokumentation geht hervor, dass:
In diesem Artikel finden Sie eine Problemumgehung.
AKTUALISIEREN:
Wie vorgeschlagen, füge ich die Empfehlungen aus dem folgenden Artikel hinzu.
Grundwerte übergeben
Wenn die grundlegende Transact-SQL-Anweisung bekannt ist, Sie jedoch einen oder mehrere bestimmte Werte übergeben müssen, verwenden Sie Code, der dem folgenden Beispiel ähnelt:
Übergeben Sie die gesamte Abfrage
Wenn Sie die gesamte Transact-SQL-Abfrage oder den Namen des Verbindungsservers (oder beider) übergeben müssen, verwenden Sie Code, der dem folgenden Beispiel ähnelt:
Verwenden Sie die gespeicherte Prozedur Sp_executesql
Verwenden Sie Code, der dem folgenden Beispiel ähnelt, um mehrschichtige Anführungszeichen zu vermeiden:
quelle
INSERT INTO @TableVariable EXEC sp_executeSql @TSQL
SELECT * FROM tab WHERE col = 'Y'
. Um diese Anweisung als Zeichenfolge an OpenQuery zu übergeben, müssen alle einfachen Anführungszeichen maskiert werden :SELECT * FROM OPENQUERY(Server, 'SELECT * FROM tab WHERE col = ''Y'' ')
. Um dann SELECT mit OpenQuery an Dynamic SQL zu übergeben, müssen DIESE Anführungszeichen maskiert werden :EXEC sp_executeSQL 'SELECT * FROM OPENQUERY(Server, ''SELECT * FROM tab WHERE col = ''''Y'''' '')'
. Hoffe das hilft!SET @DAX = REPLACE(@DAX, '''', '''''')
Sie können einen String mit OPENQUERY ausführen, sobald Sie ihn aufgebaut haben. Wenn Sie diesen Weg gehen, denken Sie an die Sicherheit und achten Sie darauf, vom Benutzer eingegebenen Text nicht in Ihr SQL zu verketten!
quelle
if
zum Beispiel inif (SELECT Col1 FROM OPENQUERY('Select ...') > 0 ) BEGIN ... END
Von der MSDN-Seite :
Grundsätzlich bedeutet dies, dass Sie keine dynamische Abfrage ausgeben können. Versuchen Sie Folgendes, um das zu erreichen, was Ihre Probe versucht:
Wenn Ihre TABLENAME-Tabelle eine große Datenmenge enthält, wird dies natürlich auch über das Netzwerk übertragen und die Leistung ist möglicherweise schlecht. Auf der anderen Seite funktioniert dies für eine kleine Datenmenge gut und vermeidet die dynamischen SQL-Konstruktionskosten (SQL-Injection, Escape-Anführungszeichen), die ein
exec
Ansatz möglicherweise erfordert.quelle
Eigentlich haben wir einen Weg gefunden, dies zu tun:
Dadurch wird das Ergebnis der OpenQuery-Ausführung in der Variablen @Output zugewiesen.
Wir haben die Store-Prozedur in MSSQL 2012 getestet, sollten aber mit MSSQL 2008+ funktionieren.
Microsoft sagt, dass sp_executesql (Transact-SQL): Gilt für: SQL Server (SQL Server 2008 bis aktuelle Version), Windows Azure SQL-Datenbank (Erstversion bis aktuelle Version). ( http://msdn.microsoft.com/en-us/library/ms188001.aspx )
quelle
quelle
quelle
Kombinieren Sie Dynamic SQL mit OpenQuery. (Dies geht an einen Teradata-Server)
quelle
Im folgenden Beispiel übergebe ich einen Abteilungsparameter an eine gespeicherte Prozedur (spIncreaseTotalsRpt) und erstelle gleichzeitig eine temporäre Tabelle aus einer OPENQUERY. Die Temp-Tabelle muss ein globales Temp (##) sein, damit außerhalb ihrer Intance auf sie verwiesen werden kann. Mit exec sp_executesql können Sie den Abteilungsparameter übergeben.
Hinweis: Seien Sie vorsichtig, wenn Sie sp_executeSQL verwenden. Möglicherweise steht Ihrem Administrator diese Option auch nicht zur Verfügung.
Hoffe das hilft jemandem.
Ergebnisse
Dept Erhöhung Cnt 0 1 2 3 4 5 6 0,0000 1,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000
quelle
Ich habe einen Weg gefunden, der für mich funktioniert. Es erfordert jedoch die Verwendung einer Arbeitstabelle, auf die ein Verbindungsserver Zugriff hat.
Ich habe eine Tabelle erstellt und sie mit den benötigten Werten gefüllt. Dann verweise ich über einen Verbindungsserver auf diese Tabelle.
quelle
quelle
openquery
sollte diesen Ansatz ebenfalls kennen. Es ist auch viel sauberer. Also +1 von meiner Seite.Wir können
execute
Methode anstelle von verwendenopenquery
. Der Code ist viel sauberer. Ich musste daslinked server
Abfrageergebnis in einer Variablen erhalten. Ich habe folgenden Code verwendet.Hinweis:
quelle
Einfaches Beispiel basierend auf dem obigen Beispiel von @Tuan Zaidi, das am einfachsten zu sein schien. Ich wusste nicht, dass Sie den Filter außerhalb von OPENQUERY ausführen können ... so viel einfacher!
In meinem Fall musste ich es jedoch in eine Variable einfügen, sodass ich eine zusätzliche Unterabfrageebene erstellte, um einen einzelnen Wert zurückzugeben.
quelle