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 UNIONs 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

Schreibe einen Kommentar