检查是否存在多列

时间:2015-03-16 19:10:10

标签: sql sql-server tsql

我需要创建一个sql更改脚本来检查表中是否存在两列。如果这些列确实存在,则脚本将运行alter table以添加它们。我们如何检查1列的示例如下。

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

所以我需要这个脚本来检查ColumnC和ColumnD是否存在。

2 个答案:

答案 0 :(得分: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,以免意外尝试更改视图。

答案 1 :(得分: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