2016-07-15 3 views
2

Я пытаюсь изменить таблицу, чтобы добавить три новых столбца, но я хотел бы проверить, не имена столбцов перед добавлением и если они уже существуют , просто пропустите еще добавить столбец,Проверьте, существует ли столбец перед добавлением таблицы в таблицу SQL без изменения таблицы для каждого столбца

ALTER TABLE TESTTABLE 
ADD [ABC] [int] , 
    [XYZ] [ [int] , 
    [PQR] [int] 
GO 

у меня есть ниже сценарий

IF NOT EXISTS(
    SELECT * 
    FROM sys.columns 
    WHERE Name  = N'ABC' 
     AND Object_ID = Object_ID(N'TESTTABLE')) 
BEGIN 
    ALTER TABLE TESTTABLE 
    ADD [ABC] int 
END 

, но это должно быть сделано для каждого столбца есть лучший способ для достижения этой цели?

+2

Вы хотите автоматизировать создание таблицы или просто слишком ленивы для просмотра в SSMS/'sys.columns'? –

+0

Я пытаюсь автоматизировать изменение таблицы – DoIt

+1

Возможный дубликат [Как проверить, существует ли столбец в таблице SQL Server] (http://stackoverflow.com/questions/133031/how-to-check-if-a-column -exists-in-sql-server-table) –

ответ

1

Простой и загрязнен, можно использовать непосредственно имена столбцов в состоянии с COL_LENGTH (который возвращает NULL, если столбец не существует, то есть «по ошибке»):

DECLARE @tb varchar(30) = 'TESTTABLE' 
IF COL_LENGTH(@tb, 'ABC') IS NOT NULL 
AND COL_LENGTH(@tb, 'XYZ') IS NOT NULL 
AND COL_LENGTH(@tb, 'PQR') IS NOT NULL 
BEGIN 
    ALTER TABLE TESTTABLE 
    ADD [ABC] int 
END 
3

Если вы уверены, эти колонки всегда и только будут просуммированы в то же время, вы можете использовать IN, чтобы проверить наличие каких-либо, а затем добавить их все, если ни один не существует:

IF NOT EXISTS(
    SELECT * 
    FROM sys.columns 
    WHERE Name IN (N'ABC',N'XYZ',N'PQR') 
     AND Object_ID = Object_ID(N'TESTTABLE')) 
BEGIN 
    ALTER TABLE TESTTABLE 
    ADD [ABC] int, 
     [XYZ] int, 
     [PQR] int 
END 

Обратите внимание, что это не будет выполняться, если какой-либо одной ваших столбцов уже существует. Если есть вероятность, что это произойдет, вам нужно будет сделать каждый чек индивидуально, как вы уже делаете.