2016-10-27 3 views
1

ich diese Abfrage ausführen, alle Tabellen zu erhalten, die einen bestimmten SpaltennamenFühren Sie eine Abfrage in jeder Tabelle, die eine bestimmte Spalte enthält

SELECT COLUMN_NAME, TABLE_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE COLUMN_NAME LIKE '%myColumn%' 

Dann sind für jede einzelne Tabelle, möchte ich eine Abfrage auszuführen, wie diese:

SELECT * FROM table WHERE myColumn = xxx 

gibt es eine Möglichkeit, es automatisch zu tun, und die zweite Abfrage an alle Tabellen aus der ersten Abfrage ausführen?

Ich habe eine ziemlich große Datenbank und ich möchte überprüfen, ob irgendwo etwas über die spezifische ID auf myColumn gespeichert ist. Und diese Spalte wird in ungefähr 200 Tabellen verwendet.

Antwort

1

Ich denke, Sie müssen dynamische Abfrage dafür verwenden. In diesem habe ich das Schema-Ergebnis in einer Tabellenvariablen gespeichert und dann durchlaufen, um die erforderliche Abfrage zu generieren. Bitte versuchen Sie die unten:

DECLARE @Template varchar(max)='SELECT * FROM [TABLE_NAME] WHERE [COLUMN_NAME] = ''xxx'''; 
DECLARE @CMD varchar(max); 
DECLARE @id int=1, @TABLE_NAME varchar(255), @COLUMN_NAME varchar(255) 

declare @Table table(id int identity(1,1), COLUMN_NAME varchar(255), TABLE_NAME varchar(255)) 

    INSERT INTO @Table (TABLE_NAME, COLUMN_NAME) 
    SELECT TABLE_NAME, COLUMN_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE COLUMN_NAME LIKE '%Label%' 


    SELECT @id=ID, @TABLE_NAME = TABLE_NAME, @COLUMN_NAME = COLUMN_NAME FROM @Table WHERE ID = @id 
    While @@ROWCOUNT>0 BEGIN 
     SET @CMD = REPLACE(@Template, '[TABLE_NAME]', @TABLE_NAME) 
     SET @CMD = REPLACE(@CMD, '[COLUMN_NAME]', @COLUMN_NAME) 
     Print @cmd 
     EXEC (@CMD) 
     SELECT @id=ID, @TABLE_NAME = TABLE_NAME, @COLUMN_NAME = COLUMN_NAME FROM @Table WHERE ID = @id + 1 
    End 
0

Sie könnten dies wie folgt tun. Das Skript erstellt alle SELECT-Anweisungen in einem VARCHAR und führt sie anschließend dynamisch aus. Funktioniert, wenn Sie für ganze Zahlen sowie Varchars.


DECLARE @col_name SYSNAME='myColumn'; 
DECLARE @expected_value NVARCHAR(256)='xxx'; 
DECLARE @sel_stmts NVARCHAR(MAX) = (
    SELECT 
     ';SELECT '+ 
      '* '+ 
     'FROM '+ 
      QUOTENAME(t.TABLE_SCHEMA)+'.'+QUOTENAME(t.TABLE_NAME) + 
     'WHERE '+ 
      QUOTENAME(c.COLUMN_NAME)+'='''+REPLACE(@expected_value,'''','''''')+'''' 
    FROM 
     INFORMATION_SCHEMA.TABLES AS t 
     INNER JOIN INFORMATION_SCHEMA.COLUMNS AS c ON 
      c.TABLE_SCHEMA=t.TABLE_SCHEMA AND 
      c.TABLE_NAME=t.TABLE_NAME 
    WHERE 
     t.TABLE_TYPE='BASE TABLE' AND 
     c.COLUMN_NAME LIKE '%'[email protected]_name+'%' 
    FOR 
     XML PATH('') 
)+';'; 

--SELECT @sel_stmts; -- review 
EXEC sp_executesql @sel_stmts; -- execute it 
Verwandte Themen