2013-12-17 13 views
6

Piszę skrypt sql dla upuszczania kolumny i domyślnego ograniczenia. Poniższy skrypt działa dobrze, ale lubię wiedzieć, czy jest to właściwy sposób.Upuść kolumnę z domyślnym ograniczeniem w SQL Server (JEŻELI ISTNIEJĄ)

Czy mogę usunąć domyślne ograniczenie z kolumną w jednej instrukcji, zamiast użyć dwóch oddzielnych?

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

Myślałem, trzeba było zrobić je oddzielnie - i robisz, ** ** jeśli trzeba, że ​​czek warunkowego. Jeśli wiązanie z pewnością istnieje, może być wykonane jako pojedynczy "ALTER TABLE". –

+0

tak jak ja to zrobiłem, prawda? – user1263981

+0

Tak, jeśli potrzebujesz kontroli warunkowej, nie ma realnego sposobu na skrócenie tego kodu. –

Odpowiedz

0

To, jak się masz, jest w porządku.

Alternatywą byłoby

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 

W przypadku, gdy nie istnieje ograniczenie ten łączy w sobie dwie operacje w jednym rachunku/transakcji.

5

Oto kolejny sposób na upuść kolumnę & domyślne ograniczenia z sprawdzenie czy istnieją przed upuszczając je:

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

W SQL Server 2005 w górę można upuścić zarówno ograniczenia i kolumny w jednej instrukcji .

Składnia

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

Nacisk jest [... n], co wskazuje wielu warunkach.

NB! Ponieważ warunki są przetwarzane sekwencyjnie, jeśli opuszczana kolumna jest częścią ograniczenia, które zostało usunięte, wówczas ograniczenie musi być pierwszym terminem, po którym następuje kolumna.

W przykładzie:

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

Tak Twój kod będzie:

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 

W SQL Server 2016 mają wprowadzony IF EXISTS klauzuli, która usuwa potrzebę sprawdzenia istnienia ograniczenie najpierw np

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

Innym rozwiązaniem:

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