Wie-EXEC, eine Abfrage generiert, die in einem Allgemeinen Tabellenausdruck
Ich habe einen CTE in dem ein SELECT
- Anweisung generiert, aber SQL-Server (2012) lässt nicht aufrufen EXEC
. Hier ist die Abfrage:
DECLARE @guidToFind uniqueidentifier = 'E4069560-091A-4026-B519-104F1C7693B3';
WITH GuidCols (TableName, ColName, Query) As
(
SELECT
C.TABLE_NAME,
C.COLUMN_NAME,
'SELECT ' +
QUOTENAME(C.TABLE_NAME) + '.' +
QUOTENAME(C.COLUMN_NAME) + '
FROM ' +
QUOTENAME(C.TABLE_NAME) + '
WHERE ' +
QUOTENAME(C.COLUMN_NAME) + ' = ''' + cast(@guidToFind AS VARCHAR(50))+
''''
FROM
INFORMATION_SCHEMA.COLUMNS C
INNER JOIN INFORMATION_SCHEMA.TABLES T
ON C.TABLE_NAME = T.TABLE_NAME AND
T.TABLE_TYPE = 'BASE TABLE'
WHERE
C.DATA_TYPE = 'uniqueidentifier'
)
-- SELECT * FROM
EXEC( GuidCols.Query )
Das problem nicht lösen, wenn ich die Auskommentierung der SELECT
Anweisung nach CTE.
Den Zweck dieser Abfrage ist nach allen Instanzen einer GUID in eine Datenbank. Derzeit bin ich der Lösung dieses problem mit einem Skript wie diese. Allerdings würde ich glücklicher sein, dieses problem zu lösen, ohne das Durchlaufen der Zeilen, die mithilfe von set-Operationen und anderen Techniken.
EXISTS
möglicherweise effizienter Weg zu finden, Instanzen der GUID wenn Sie nur wanto, um zu wissen, die Tabellen und Spalten enthalten dann den Wert. Sie montieren könnte eine einzelne Abfrage, die UNION
s alle Ergebnisse und dann EXECUTE
string.Danke für den Tipp. Können Sie bitte erklären, wo kann ich
EXISTS
? Und im zweiten Teil meinst du, um eine Zeichenfolge von hard-codiert Tisch und col Namen wie z.B. 'SELECT ''[table1]'', ''[Col5]'' UNION ALL SELECT ''[table3]'', ''[Col8]'''
?Ich bin derzeit erreichen dieses in dieser Art: gist.github.com/3180402, Aber ich wäre glücklicher, wenn ich könnte, verwenden Sie set-Operationen anstelle von loop
In Ihrem github-Beispiel, das Sie Hinzugefügt haben
DISTINCT
so, dass Sie nur eine Zeile, wenn die GUID gefunden wurde, ein oder mehrere Male in einer bestimmten Tabelle und Spalte. select C.Table_Name, C.Column_Name from C.Table_Name where exists ( select 42 from C.Table_Name where C.Column_Name = @GuidToFind )
zurück, die Tabellen-und Spaltennamen, wenn die Spalte enthält eine Instanz der GUID. Es macht klar, dass der Optimierer, dass Sie don ' T care, wie oft der Wert gefunden wird, nur, dass es vorhanden ist. Wenn Sie UNION
zusammen eine Reihe von diese Abfragen für jede Tabelle und Spalte, die Sie haben eine Liste wo die GUID gefunden wurde.InformationsquelleAutor Sina Iravanian | 2012-07-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht verwenden
exec
als Teil einesCTE
.Vom Unter WITH common_table_expression (Transact-SQL)
Was Sie tun können, anstatt zu speichern das Ergebnis der Abfrage in eine temporäre Tabelle, Schleife über die Zeilen und führen Sie eine Anweisung zu einem Zeitpunkt.
InformationsquelleAutor Mikael Eriksson
Den EXEC () - Funktion verfügbar ist von T-SQL, aber es ist nicht zugänglich von innerhalb einer SQL-Anweisung. Ich würde davon ausgehen, ist dies der Fall, da SQL ausgeführt wird, in mehreren Schritten... so etwas wie:
Die EXEC () - Funktion wurde entwickelt, um dynamisch eine Anweisung auszuführen, um also das zu tun, was Sie Fragen, SQL Server zum ausführen der ersten zwei Schritte, und dann während der Ausführung der Anweisung, es hätte um zurück zu dem ersten Schritt zu Parsen/ausführen der dynamischen Anweisung. Diese müssten wiederholt werden, für jede Zeile in Ihren Ergebnissen.
Ich nehme an, diese Art von "feature" ist nicht verfügbar, weil es könnte sich negativ auf die performance und die Komplexität von db-engine; also lassen Sie es uns zur Ausführung der ersten Anweisung, dann eine Schleife durch jeden Datensatz ausführen, die dynamische Anweisungen einzeln.
InformationsquelleAutor Glen Hughes
Exec-führt einen T-SQL-Befehl, den Sie einbetten, in seiner Klammern. Der Unterschied ist, dass die EXEC () - Funktion ausführen können, eine Zeichenfolge oder string-variable, wie Sie sah in der preceiding code. Das argument für die Funktion EXEC() kann ein literal string, aber die wirkliche macht der EXEC() zum Vorschein kommt, wenn Sie eine variable verwenden.
Führt er den Befehl enthalten, der in der Variablen, aber in einem anderen Kontext aus der Sitzung Aufruf der Funktion. Das ist wichtig, denn es führt einige erhebliche Einschränkungen. Alle Tabellen, die Sie erstellen, angezeigt werden die EXEC () - Kontext, aber deklarierten Variablen von der aufrufenden session nicht sichtbar sind, auf die EXEC () - Kontext, und Umgekehrt.
Fand ich einen interessanten Artikel zu diesem Zusammenhang : http://msdn.microsoft.com/en-us/library/aa175921(v=sql.80).aspx
Obwohl oben ist autark, Sie können auch durch gehen : http://blog.sqlauthority.com/2007/09/13/sql-server-difference-between-exec-and-execute-vs-exec-use-execexecute-for-sp-always/
InformationsquelleAutor NG.
Können Sie OPENQUERY verwenden anstelle von EXEC:
Referenz: https://docs.microsoft.com/en-us/sql/t-sql/functions/openquery-transact-sql?view=sql-server-2017
InformationsquelleAutor José Ricardo Júnior