2017-02-22 42 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行,这就是为什么我需要动态。 –