2013-12-17 2 views
6

Ich schreibe ein SQL-Skript zum Löschen einer Spalte und eine Standardbedingung. Das folgende Skript funktioniert gut, aber ich möchte wissen, ob es ein richtiger Weg ist.Eine Spalte mit einer Standardeinschränkung in SQL Server löschen (IF EXISTS)

Kann ich eine Standardbeschränkung mit einer Spalte in einer Anweisung löschen, anstatt zwei separate zu verwenden?

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

Ich dachte, sie separat zu tun hatte - und Sie tun, wenn ** ** Sie, dass bedingte Scheck benötigen. Wenn die Einschränkung definitiv existiert, kann sie als eine einzelne "ALTER TABLE" ausgeführt werden. –

+0

die Art, wie ich es tat, ist richtig? – user1263981

+0

Ja, wenn Sie die bedingte Prüfung benötigen, gibt es keine Möglichkeit, diesen Code zu verkürzen. –

Antwort

0

Wie Sie es haben, ist in Ordnung.

wäre eine Alternative

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 

Für den Fall, dass die Beschränkung gibt es diese, die zwei Operationen in einem einzigen Statement/Transaktion kombiniert. Hier

5

ist ein weiterer Weg, um eine Spalte & Standardeinschränkungen fallen mit prüft wird, ob sie existieren, bevor sie fallen:

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

In SQL Server 2005 nach oben können Sie sowohl die Einschränkung und die Spalte in einer Anweisung löschen .

Die Syntax ist

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

Der Schwerpunkt liegt auf [, ... n], was anzeigt, mehrere Begriffe.

Achtung! Da die Terme sequenziell verarbeitet werden, muss, wenn die Spalte, die gelöscht wird, Teil der Einschränkung ist, die gelöscht wird, die Einschränkung der erste Term sein, gefolgt vom Spaltenbegriff.

In Ihrem Beispiel:

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

So würde Ihr Code sein:

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 

In SQL Server 2016 sie eingeführt haben, die IF EXISTS-Klausel, die die Notwendigkeit für die Existenz der prüfen entfernt Einschränkung zuerst z

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

Eine andere Lösung:

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