2013-12-17 10 views
6

Tôi đang viết một kịch bản lệnh sql để thả cột và ràng buộc mặc định. Kịch bản sau đây hoạt động tốt nhưng tôi muốn biết nếu nó là một cách đúng đắn để làm điều đó.Thả một cột có ràng buộc mặc định trong SQL Server (IF EXISTS)

Tôi có thể bỏ ràng buộc mặc định bằng một cột trong một câu lệnh thay vì sử dụng hai câu lệnh riêng biệt không?

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

Tôi nghĩ bạn phải làm một cách riêng biệt - và bạn làm thế, ** nếu ** bạn cần có kiểm tra điều kiện. Nếu ràng buộc chắc chắn sẽ tồn tại, thì nó có thể được thực hiện như một 'ALTER TABLE' duy nhất. –

+0

cách tôi đã làm là đúng? – user1263981

+0

Có, nếu bạn cần kiểm tra có điều kiện, không có cách nào thực sự để rút ngắn mã này. –

Trả lời

0

Làm thế nào bạn có nó là tốt.

Một thay thế sẽ là

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 

Trong trường hợp hạn chế tồn tại này kết hợp hai hoạt động vào một tuyên bố đơn/giao dịch.

5

Đây là một cách khác để thả một cột & hạn chế mặc định với việc kiểm tra nếu chúng tồn tại trước khi thả chúng:

------------------------------------------------------------------------- 
-- 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

Trong SQL Server 2005 trở lên bạn có thể thả cả các hạn chế và cột trong một tuyên bố .

Cú pháp là

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

Nhấn mạnh về [, ... n], cho thấy nhiều điều khoản.

NB! Vì các thuật ngữ được xử lý tuần tự, nếu cột bị loại bỏ là một phần của ràng buộc bị loại bỏ, thì ràng buộc phải là thuật ngữ đầu tiên, theo sau là từ khóa.

Trong ví dụ của bạn:

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

Vì vậy, mã của bạn sẽ là:

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 

Trong SQL Server 2016 chúng tôi đã giới thiệu IF EXISTS khoản mà loại bỏ sự cần thiết phải kiểm tra sự tồn tại của ràng buộc đầu tiên ví dụ

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

Một giải pháp:

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 
Các vấn đề liên quan