sql-server - check - t-sql




如何檢查SQL Server表中是否存在列? (16)

SQL Server 2005起:

IF EXISTS(SELECT 1 FROM sys.columns 
          WHERE Name = N'columnName'
          AND Object_ID = Object_ID(N'schemaName.tableName'))
BEGIN
    -- Column Exists
END

馬丁史密斯的版本更短:

IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL
BEGIN
    -- Column Exists
END

如果它不存在,我需要添加一個特定的列。 我有這樣的東西,但它總是返回false:

IF EXISTS(SELECT *
          FROM   INFORMATION_SCHEMA.COLUMNS
          WHERE  TABLE_NAME = 'myTableName'
                 AND COLUMN_NAME = 'myColumnName') 

如何檢查SQL Server數據庫表中是否存在列?


一個更簡潔的版本

 IF COL_LENGTH('table_name','column_name') IS NULL
 BEGIN
 /*Column does not exist or caller does not have permission to view the object*/
 END

有關查看元數據的權限的觀點適用於所有答案,而不僅僅是這一點。

請注意,根據需要, COL_LENGTH的第一個參數表名稱可以是一個,兩個或三個零件名稱格式。

引用不同數據庫中的表的示例是

COL_LENGTH('AdventureWorks2012.HumanResources.Department','ModifiedDate')

與使用元數據視圖相比,與此答案相比,一個區別是像COL_LENGTH這樣的元數據函數始終只會返回有關已提交更改的數據,而與隔離級別COL_LENGTH


又一個變化......

SELECT Count(*) AS existFlag FROM sys.columns 
WHERE [name] = N'ColumnName' AND [object_id] = OBJECT_ID(N'TableName')

嘗試這個

SELECT COLUMNS.*
FROM   INFORMATION_SCHEMA.COLUMNS COLUMNS,
       INFORMATION_SCHEMA.TABLES TABLES
WHERE  COLUMNS.TABLE_NAME = TABLES.TABLE_NAME
       AND Upper(COLUMNS.COLUMN_NAME) = Upper('column_name') 

對於正在檢查列存在的人來說,將其刪除。

SQL Server 2016中,您可以使用新的DIE語句而不是大的IF包裝器

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

小麥的答案很好,但假設在任何模式或數據庫中沒有任何相同的表名/列名對。 為了保證這種狀況的安全,請使用...

select *
from Information_Schema.Columns
where Table_Catalog = 'DatabaseName'
  and Table_Schema = 'SchemaName'
  and Table_Name = 'TableName'
  and Column_Name = 'ColumnName'

我更喜歡在系統表上使用INFORMATION_SCHEMA.COLUMNS ,因為Microsoft不保證在版本之間保留系統表。 例如, dbo.syscolumns在SQL 2008中仍然有效,但它已被棄用,並且可能在將來隨時刪除。


我的一位好朋友和同事向我展示瞭如何在SQL SERVER 2005+中使用帶有SQL函數OBJECT_IDCOLUMNPROPERTYIF塊來檢查列。 您可以使用類似於以下內容的內容:

你可以在這裡看到

IF (OBJECT_ID(N'[dbo].[myTable]') IS NOT NULL AND
    COLUMNPROPERTY( OBJECT_ID(N'[dbo].[myTable]'), 'ThisColumnDoesNotExist', 'ColumnId') IS NULL)
BEGIN
    SELECT 'Column does not exist -- You can add TSQL to add the column here'
END

接受答案的臨時表版本:

if (exists(select 1 
             from tempdb.sys.columns  
            where Name = 'columnName'
              and Object_ID = object_id('tempdb..#tableName')))
begin
...
end

最簡單易懂的解決方案之一是:

IF COL_LENGTH('Table_Name','Column_Name') IS NULL
 BEGIN
    -- Column Not Exists, implement your logic
 END 
ELSE
 BEGIN
    -- Column Exists, implement your logic
 END

根據您的具體要求調整以下內容:

if not exists (select
                     column_name
               from
                     INFORMATION_SCHEMA.columns
               where
                     table_name = 'MyTable'
                     and column_name = 'MyColumn')
    alter table MyTable add MyColumn int

編輯處理編輯問題 :這應該工作 - 仔細看看你的代碼的愚蠢的錯誤; 例如,您是否在插入數據庫的同一數據庫上查詢INFORMATION_SCHEMA? 兩種語句中的表/列名稱中是否有拼寫錯誤?


試試像這樣:

CREATE FUNCTION ColumnExists(@TableName varchar(100), @ColumnName varchar(100))
RETURNS varchar(1) AS
BEGIN
DECLARE @Result varchar(1);
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = @TableName AND COLUMN_NAME = @ColumnName)
BEGIN
    SET @Result = 'T'
END
ELSE
BEGIN
    SET @Result = 'F'
END
RETURN @Result;
END
GO

GRANT EXECUTE ON  [ColumnExists] TO [whoever]
GO

然後像這樣使用它:

IF ColumnExists('xxx', 'yyyy') = 'F'
BEGIN
  ALTER TABLE xxx
  ADD yyyyy varChar(10) NOT NULL
END
GO

它應該可以在SQL Server 2000和SQL Server 2005上運行。不確定SQL Server 2008,但不明白為什麼不。


首先檢查dbo.syscolumns (包含字段定義的內部SQL Server表)是否存在table / columnid / name )組合,如果不是,則發出適當的ALTER TABLE查詢以添加它。 例如:

IF NOT EXISTS ( SELECT  *
            FROM    syscolumns
            WHERE   id = OBJECT_ID('Client')
                    AND name = 'Name' ) 
ALTER TABLE Client
ADD Name VARCHAR(64) NULL

IF NOT EXISTS( SELECT NULL
            FROM INFORMATION_SCHEMA.COLUMNS
           WHERE table_name = 'tablename'
             AND table_schema = 'db_name'
             AND column_name = 'columnname')  THEN

  ALTER TABLE `TableName` ADD `ColumnName` int(1) NOT NULL default '0';

END IF;

if exists (select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='<table_name>' and COLUMN_NAME='<column_name>')
  begin
    print 'Column you have specified exists'
  end
else
  begin
    print 'Column does not exists'
  end

select distinct object_name(sc.id)
from syscolumns sc,sysobjects so  
where sc.name like '%col_name%' and so.type='U'




sql-server-2016