2015-03-16 7 views
0

Мне нужно создать скрипт изменения sql, который проверяет наличие двух столбцов в таблице. Если эти столбцы существуют, скрипт будет запускать таблицу alter, чтобы добавить их. Ниже приведен пример того, как мы проверяем 1 столбец.Проверить наличие нескольких столбцов

IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Table' AND COLUMN_NAME = 'ColumnC') 

Мне нужен этот скрипт, чтобы проверить наличие ColumnC и ColumnD.

+0

Просто написать этот скрипт дважды. – abatishchev

+1

Или проверьте 'if (выберите count (1) из COLUMNS, где COLUMN_NAME в ('ColumnC', 'ColumnD')) = 2)' – abatishchev

+0

не работал для меня – Ronnie

ответ

0

Вы хотите выполнить запрос один раз для каждого столбца, если нет абсолютно никакого способа, чтобы таблица могла иметь один из столбцов, но не другой. Потому что, если вы проверяете наличие обоих столбцов одновременно и только один из них существует, то если вы попытаетесь добавить оба столбца, ALTER TABLE вызовет исключение, так как один из столбцов уже существует. Либо придерживайтесь того, что у вас есть, и делайте это один раз для каждого столбца, или если производительность имеет решающее значение, напишите 3 оператора ... один для обоих столбцов одновременно, а затем по одному для каждого столбца. Псевдокод будет выглядеть примерно так:

If neither column exists 
    Alter table...add both columns 
else if ColumnA exists and ColumnB does not 
    Alter Table...add ColumnB 
else if ColumnB exists and ColumnA does not 
    Alter Table...add ColumnA 

что-то, как это будет возвращать таблицы, которые отсутствуют обе колонки ...

SELECT * 
FROM INFORMATION_SCHEMA.TABLES T 
WHERE TABLE_TYPE = 'BASE TABLE' 
AND NOT EXISTS (
    SELECT * 
    FROM INFORMATION_SCHEMA.COLUMNS C 
    WHERE C.TABLE_CATALOG = T.TABLE_CATALOG 
    AND C.TABLE_SCHEMA = T.TABLE_SCHEMA 
    AND C.TABLE_NAME = T.TABLE_NAME 
    AND C.COLUMN_NAME IN ('Column1', 'Column2')); 

Обязательно ссылку TABLES, чтобы вы случайно не пытаться изменить вид.

0

Это просто альтернативный способ, не эффективен один

IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE COLUMN_NAME = '<column_name1>' AND TABLE_NAME ='<table_name>') 
    IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS 
     WHERE COLUMN_NAME = '<column_name2>' AND TABLE_NAME = '<table_name>') 
     BEGIN 
      // .... 
      // .... 
     END 
GO 
Смежные вопросы