Ich schreibe ein SQL-Skript zum Löschen der Spalte und eine Standardeinschränkung. Das folgende Skript funktioniert gut, aber ich würde gerne wissen, ob es die richtige Vorgehensweise ist.
Kann ich eine Standardeinschrä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
Ab SQL Server 2005 können Sie sowohl die Einschränkung als auch die Spalte in einer Anweisung löschen.
Die Syntax lautet
ALTER TABLE [ database_name . [ schema_name ] . | schema_name . ] table_name
DROP { [ CONSTRAINT ] constraint_name | COLUMN column } [ ,...n ]
Der Schwerpunkt liegt auf [ ... n] , wobei mehrere Begriffe angegeben werden.
NB! Da die Terme sequentiell verarbeitet werden, muss die Einschränkung der erste Begriff sein, gefolgt von dem Spaltenbegriff, wenn die Spalte, die gelöscht wird, Teil der Einschränkung ist, die gelöscht wird.
In deinem Beispiel:
ALTER TABLE [dbo].[Employees] DROP CONSTRAINT [DF_Employees_EmpID], COLUMN [EmpID]
Ihr Code wäre also:
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 wurde die IF EXISTS-Klausel eingeführt, durch die zunächst die Existenz der Einschränkung überprüft werden muss, z.
ALTER TABLE [dbo].[Employees] DROP CONSTRAINT IF EXISTS [DF_Employees_EmpID], COLUMN IF EXISTS [EmpID]
Hier ist eine weitere Möglichkeit, eine Spalte und Standardeinschränkungen zu löschen, indem Sie prüfen, ob sie vorhanden sind, bevor Sie sie löschen:
-------------------------------------------------------------------------
-- 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
Wie du es hast, ist gut.
Eine Alternative wäre
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
Falls die Einschränkung existiert, werden die beiden Operationen in einer Anweisung/Transaktion zusammengefasst.
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