2013-12-17 107 views
6

我在寫一個用於刪除列和默認約束的sql腳本。下面的腳本工作正常,但我想知道這是否是正確的方式。在SQL Server中刪除一個具有默認約束的列(IF EXISTS)

我可以在一個語句中刪除一個列的默認約束,而不是使用兩個單獨的列嗎?

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[DF_Employees_EmpID]') AND type = 'D') 

BEGIN  
    ALTER TABLE [dbo].[Employees] DROP CONSTRAINT [DF_Employees_EmpID]  
END  
GO  
BEGIN 
    ALTER TABLE [dbo].[Employees] DROP COLUMN [EmpID]  
END 
+0

我想你必須單獨做他們 - 和你做,如果** **你需要的條件檢查。如果約束肯定存在,那麼它可以作爲一個單獨的「ALTER TABLE」來完成。 –

+0

我做的方式是對的? – user1263981

+0

是的,如果你需要條件檢查,沒有真正的方法來縮短這段代碼。 –

回答

0

你是怎麼過的很好。

另一種方法是

IF OBJECT_ID('DF_Employees_EmpID', 'D') IS NULL 
    BEGIN 
     ALTER TABLE dbo.Employees 
     DROP COLUMN EmpID 
    END 
ELSE 
    BEGIN 
     ALTER TABLE dbo.Employees 
     DROP CONSTRAINT DF_Employees_EmpID, 
       COLUMN EmpID 
    END 

倘若約束確實存在這種結合了兩個操作成一個單獨的語句/事務。

5

這裏是另一種方式來刪除列&默認約束與檢查,如果他們放棄這些之前存在:

------------------------------------------------------------------------- 
-- Drop COLUMN 
-- Name of Column: Column_EmployeeName 
-- Name of Table: table_Emplyee 
-------------------------------------------------------------------------- 
IF EXISTS (
      SELECT 1 
      FROM INFORMATION_SCHEMA.COLUMNS 
      WHERE TABLE_NAME = 'table_Emplyee' 
       AND COLUMN_NAME = 'Column_EmployeeName' 
      ) 
    BEGIN 

     IF EXISTS (SELECT 1 
        FROM sys.default_constraints 
        WHERE object_id = OBJECT_ID('[dbo].[DF_table_Emplyee_Column_EmployeeName]') 
         AND parent_object_id = OBJECT_ID('[dbo].[table_Emplyee]') 
       ) 
      BEGIN 
       ------ DROP Contraint 

       ALTER TABLE [dbo].[table_Emplyee] DROP CONSTRAINT [DF_table_Emplyee_Column_EmployeeName] 
      PRINT '[DF_table_Emplyee_Column_EmployeeName] was dropped' 
      END 
    -- ----- DROP Column -----------------------------------------------------------------  
     ALTER TABLE [dbo].table_Emplyee 
      DROP COLUMN Column_EmployeeName 
     PRINT 'Column Column_EmployeeName in images table was dropped'  
    END 

-------------------------------------------------------------------------- 
-- ADD COLUMN Column_EmployeeName IN table_Emplyee table 
-------------------------------------------------------------------------- 
IF NOT EXISTS (
       SELECT 1 
       FROM INFORMATION_SCHEMA.COLUMNS 
       WHERE TABLE_NAME = 'table_Emplyee' 
        AND COLUMN_NAME = 'Column_EmployeeName' 
       ) 
    BEGIN 
    ----- ADD Column & Contraint    
     ALTER TABLE dbo.table_Emplyee 
      ADD Column_EmployeeName BIT NOT NULL 
      CONSTRAINT [DF_table_Emplyee_Column_EmployeeName] DEFAULT (0) 
     PRINT 'Column [DF_table_Emplyee_Column_EmployeeName] in table_Emplyee table was Added' 
     PRINT 'Contraint [DF_table_Emplyee_Column_EmployeeName] was Added'  
    END 

GO 
8

在SQL Server 2005中向上您可以在一個語句刪除這兩個約束和列。

的語法是

ALTER TABLE [ database_name . [ schema_name ] . | schema_name . ] table_name 
DROP { [ CONSTRAINT ] constraint_name | COLUMN column } [ ,...n ] 

強調的是[,... n]的,表示多個術語。

注意!由於條款是按順序處理的,如果要刪除的列是要刪除的約束的一部分,那麼約束必須是第一項,後面是列項。

在您的例子:

ALTER TABLE [dbo].[Employees] DROP CONSTRAINT [DF_Employees_EmpID], COLUMN [EmpID] 

所以,你的代碼是:

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[DF_Employees_EmpID]') AND type = 'D') 
BEGIN 
    ALTER TABLE [dbo].[Employees] DROP CONSTRAINT [DF_Employees_EmpID], COLUMN [EmpID] 
END 
GO 

在SQL Server 2016年時已經介紹了IF EXISTS子句它不需要檢查的存在先約束,例如

ALTER TABLE [dbo].[Employees] DROP CONSTRAINT IF EXISTS [DF_Employees_EmpID], COLUMN IF EXISTS [EmpID] 
0

另一種解決方案:

DECLARE @TableName sysname, 
     @Schema sysname, 
     @colname sysname, 
     @sql VARCHAR(1000) 

SELECT @Schema = 'dbo', 
     @TableName = 'mytable', 
     @colname = 'mycol' 


IF COL_LENGTH(@Schema+'.'[email protected], @colname) IS NULL 
BEGIN 
    PRINT 'Column does not exist!' 
END 
ELSE 
BEGIN 
    SET @sql = '' 
    SELECT @sql += N' ALTER TABLE ' + @TableName + ' DROP CONSTRAINT ' + default_constraints.name + ';' 
    FROM sys.all_columns 
     INNER JOIN sys.tables 
      ON all_columns.object_id = TABLES.object_id 
     INNER JOIN sys.schemas 
      ON TABLES.schema_id = schemas.schema_id 
     INNER JOIN sys.default_constraints 
      ON all_columns.default_object_id = default_constraints.object_id 
    WHERE schemas.name = @Schema 
      AND tables.name = @TableName 
      AND all_columns.name = @colname 


    SET @sql += N' ALTER TABLE ' + @TableName + ' DROP COLUMN ' + @colname + ';' 




    PRINT ISNULL(@sql, 'NULL') 

     EXECUTE(@sql) 


END