2016-10-27 33 views
1

我運行此查詢來獲取所有包含特定列名的表運行在每個表的查詢,它包含一個特定的列

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

然後,對於每一個表,我想運行就像一個查詢這一個:

SELECT * FROM table WHERE myColumn = xxx 

有沒有辦法自動做到這一點,並從第一個查詢運行第二個查詢的所有表?

我有一個相當大的數據庫,我想檢查是否有任何存儲在myColumn上的特定Id的東西。這個專欄用在大約200張表格中。

回答

1

我想你需要爲此使用動態查詢。在此我將Schema結果保存在表變量中,然後遍歷它們以生成所需的查詢。請嘗試以下操作:

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

您可以這樣做,如下所示。該腳本在VARCHAR中構建所有SELECT語句,然後動態執行。適用於整數和變種。


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 
相關問題