2017-02-22 75 views
-1

我有一組查詢,在不同的表中添加4個不同的列,名稱有些類似。因此,我通過在一組動態sql中調用INFORMATION_SCHEMA.COLUMNS來創建所有4個查詢的聯合,這些動態sql具有所有表的名稱和所有4個列。 現在我想一次執行所有這些查詢,而不是逐個執行每個查詢。那麼我該如何實現呢?直接運行SQL查詢的輸出

這是我作出的查詢:這是給我的輸出作爲

SELECT * FROM (SELECT 
'IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =''' + TABLE_NAME + ''' AND COLUMN_NAME = ''FromDays'') ALTER TABLE '+ TABLE_NAME +' ADD FromDays varchar(50) NULL; ' AS qry 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '%tbl_PPT_Query_Order%' 
UNION ALL 
SELECT 
'IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =''' + TABLE_NAME + ''' AND COLUMN_NAME = ''ToDays'') ALTER TABLE '+ TABLE_NAME +' ADD ToDays varchar(50) NULL; ' AS qry 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '%tbl_PPT_Query_Order%' 
UNION ALL 
SELECT 
'IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =''' + TABLE_NAME + ''' AND COLUMN_NAME = ''FromDays_Top'') ALTER TABLE '+ TABLE_NAME +' ADD FromDays_Top varchar(50) NULL; ' AS qry 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '%tbl_PPT_Query_Order%' 
UNION ALL 
SELECT 
'IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =''' + TABLE_NAME + ''' AND COLUMN_NAME = ''ToDays_Top'') ALTER TABLE '+ TABLE_NAME +' ADD ToDays_Top varchar(50) NULL; ' AS qry 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '%tbl_PPT_Query_Order%') x 

output

+1

什麼是阻止你一批又一批地運行它們? – iamdave

+0

@iamdave如果按批處理,您的意思是複製輸出並直接運行,那麼我無法這樣做,因爲表名在不同的數據庫中有所不同。 –

回答

2
DECLARE @SQL NVARCHAR(MAX); 
SELECT @SQL = (
    (
     SELECT 
     'IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =''' + TABLE_NAME + ''' AND COLUMN_NAME = ''MyColumn1'') ALTER TABLE '+ TABLE_NAME +' ADD MyColumn1 varchar(50) NULL; ' AS qry 
     FROM INFORMATION_SCHEMA.TABLES 
     WHERE TABLE_NAME LIKE '%myTable%' 
    ) 
    + CHAR(13) + 
    (
     SELECT 
     'IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =''' + TABLE_NAME + ''' AND COLUMN_NAME = ''MyColumn2'') ALTER TABLE '+ TABLE_NAME +' ADD MyColumn2 varchar(50) NULL; ' AS qry 
     FROM INFORMATION_SCHEMA.TABLES 
     WHERE TABLE_NAME LIKE '%myTable%' 
    ) 
    + CHAR(13) + 
    (
     SELECT 
     'IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =''' + TABLE_NAME + ''' AND COLUMN_NAME = ''MyColumn3'') ALTER TABLE '+ TABLE_NAME +' ADD MyColumn3 varchar(50) NULL; ' AS qry 
     FROM INFORMATION_SCHEMA.TABLES 
     WHERE TABLE_NAME LIKE '%myTable%' 
    ) 
) 
; 
SELECT @SQL 
--EXECUTE SP_ExecuteSQL @SQL 
; 

如果結果是根據自己的喜好,刪除SELECT @SQL在底部,取消註釋EXECUTE SP_ExecuteSQL @SQL以執行這些命令。

首先編輯:

好吧,我爲有此誤解了這個問題的背景下道歉。這樣的事情如何:

DECLARE @SQL NVARCHAR(MAX); 
SELECT @SQL = REPLACE(SUBSTRING(
    (
    SELECT CHAR(10) 
    + 'IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =''' 
    + TABLE_NAME 
    + ''' AND COLUMN_NAME = ''FromDays'') ALTER TABLE ' 
    + TABLE_NAME 
    +' ADD FromDays varchar(50) NULL; ' 
    FROM INFORMATION_SCHEMA.Tables 
    WHERE TABLE_NAME LIKE '%tbl_PPT_Query_Order%' 
    ORDER BY TABLE_NAME 
    FOR XML PATH('') 
    ) 
,1,4000),'#x0D',CHAR(10)) 
    + 
    REPLACE(SUBSTRING(
     (
     SELECT CHAR(10) 
     + 'IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =''' 
     + TABLE_NAME 
     + ''' AND COLUMN_NAME = ''ToDays'') ALTER TABLE ' 
     + TABLE_NAME 
     +' ADD ToDays varchar(50) NULL; ' 
     FROM INFORMATION_SCHEMA.Tables 
     WHERE TABLE_NAME LIKE '%tbl_PPT_Query_Order%' 
     ORDER BY TABLE_NAME 
     FOR XML PATH('') 
     ) 
    ,1,4000),'#x0D',CHAR(10)) 
    + 
    REPLACE(SUBSTRING(
     (
     SELECT CHAR(10) 
     + 'IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =''' 
     + TABLE_NAME 
     + ''' AND COLUMN_NAME = ''FromDays_Top'') ALTER TABLE ' 
     + TABLE_NAME 
     +' ADD FromDays_Top varchar(50) NULL; ' 
     FROM INFORMATION_SCHEMA.Tables 
     WHERE TABLE_NAME LIKE '%tbl_PPT_Query_Order%' 
     ORDER BY TABLE_NAME 
     FOR XML PATH('') 
     ) 
    ,1,4000),'#x0D',CHAR(10)) 
    + 
     REPLACE(SUBSTRING(
     (
     SELECT CHAR(10) 
     + 'IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =''' 
     + TABLE_NAME 
     + ''' AND COLUMN_NAME = ''ToDays_Top'') ALTER TABLE ' 
     + TABLE_NAME 
     +' ADD ToDays_Top varchar(50) NULL; ' 
     FROM INFORMATION_SCHEMA.Tables 
     WHERE TABLE_NAME LIKE '%tbl_PPT_Query_Order%' 
     ORDER BY TABLE_NAME 
     FOR XML PATH('') 
     ) 
    ,1,4000),'#x0D',CHAR(10)) 
SELECT @SQL 
--EXECUTE SP_ExecuteSQL @SQL 
; 
+0

感謝您的回覆,但我在這種方法中出現錯誤,因爲「子查詢返回的值超過1個。當子查詢跟隨=,!=,<, <= , >,> =或子查詢用作表達式時,這是不允許的「。我沒有改變任何你的查詢,只是改變了表和列的名稱。 –

+0

如果你只是運行SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE'%tbl_PPT_Query_Order%'?' – 3BK

+0

就像我說的,這個從db到db不等,在一個DB中,我得到4行,在另一個我得到5行,這就是爲什麼我需要動態。 –