2017-02-22 5 views
-1

У меня есть набор запросов для добавления 4 разных столбцов в разные таблицы с несколькими похожими именами. Итак, я сделал объединение всех 4 запросов, вызвав INFORMATION_SCHEMA.COLUMNS в наборе динамических 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 на дне и un-comment 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

Спасибо за ответ, но я получаю ошибку в этом подходе, так как «Subquery возвратил более 1 значения. Это недопустимо, когда подзапрос следует за =,! =, <, <= , >,> = или когда подзапрос используется как выражение . ". Я ничего не изменил в вашем запросе и просто изменил имена таблиц и столбцов. –

+0

Сколько строк вы вернетесь, если вы просто запустите 'SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '% tbl_PPT_Query_Order%'?' – 3BK

+0

Как я уже сказал, это варьируется от db до db, в одном DB я получаю 4 строки, в другом я получаю 5 строк, вот почему я хочу динамически. –

Смежные вопросы