在将列添加到SQL表之前检查列是否存在,而不更改每个列的表

DoI*_*oIt 4 sql-server

我正在尝试更改一个表以添加三个新列,但是我想在添加之前检查这些列的名称以及该名称是否已经存在,只是跳过其他添加列,

 ALTER TABLE TESTTABLE
 ADD [ABC] [int] ,
     [XYZ] [ [int] ,
     [PQR]  [int] 
GO
Run Code Online (Sandbox Code Playgroud)

我有以下脚本

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
Run Code Online (Sandbox Code Playgroud)

但这必须针对每一列完成, 是否有更好的方法来实现?

小智 5

如果您确定这些列将始终且仅在同一时间被添加在一起,则可以使用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
Run Code Online (Sandbox Code Playgroud)

请注意,如果您的任一列已存在,则此操作将不会执行。如果有这种可能,您需要像已经做的那样分别进行每项检查。


CPH*_*hon 2

简单又肮脏,您可以直接在条件中使用列名COL_LENGTH(如果列不存在则返回NULL,即“错误”):

DECLARE @tb varchar(30) = 'TESTTABLE'
IF  COL_LENGTH(@tb, 'ABC') IS NULL
AND COL_LENGTH(@tb, 'XYZ') IS NULL
AND COL_LENGTH(@tb, 'PQR') IS NULL
BEGIN
    ALTER TABLE TESTTABLE
    ADD [ABC] int, [XYZ] int, [PQR] int
END
Run Code Online (Sandbox Code Playgroud)