WEF*_*EFX 39 sql sql-server sql-server-2008
我正在尝试在SQL中创建升级和回退脚本.升级脚本添加如下列:
IF NOT EXISTS (SELECT * FROM sys.columns WHERE Name = N'ColumnName'
AND object_id = OBJECT_ID(N'[dbo].[TableName]'))
ALTER TABLE TableName
ADD ColumnName bit NOT NULL DEFAULT(0)
Run Code Online (Sandbox Code Playgroud)
回退脚本会删除列,如下所示:
IF EXISTS (SELECT * FROM sys.columns WHERE Name = N'ColumnName'
AND object_id = OBJECT_ID(N'[dbo].[TableName]'))
ALTER TABLE TableName
DROP COLUMN ColumnName
Run Code Online (Sandbox Code Playgroud)
但是,回退脚本会抛出此错误:
Msg 5074, Level 16, State 1, Line 5
The object 'DF__TableName__ColumnName__1BF3D5BD' is dependent on column 'ColumnName'.
Msg 4922, Level 16, State 9, Line 5
ALTER TABLE DROP COLUMN ColumnName failed because one or more objects access this column.
Run Code Online (Sandbox Code Playgroud)
我知道如何删除约束,但约束的名称每次都会更改(后缀更改).我要么需要SQL Server来停止创建这个随机命名的约束,要么我需要能够使用通配符字符删除我的脚本中的约束,因为名称会更改.
Mar*_*ith 74
这是default由于DEFAULT(0)新添加的列中添加的约束.
您可以自己命名,因此它具有已知的固定名称,而不是依赖于自动生成名称.
ALTER TABLE TableName
ADD ColumnName bit NOT NULL CONSTRAINT DF_Some_Fixed_Name DEFAULT(0)
Run Code Online (Sandbox Code Playgroud)
然后一起删除列和约束
ALTER TABLE dbo.TableName
DROP CONSTRAINT DF_Some_Fixed_Name, COLUMN ColumnName
Run Code Online (Sandbox Code Playgroud)
小智 5
运行这个:
declare @name as nvarchar(255);
SELECT @name = name FROM dbo.sysobjects
WHERE name LIKE 'DF__XXX__YYY__%' and type = 'D'
IF @name IS NOT NULL BEGIN
EXEC('ALTER TABLE XXX DROP CONSTRAINT ' + @name);
END
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
38051 次 |
| 最近记录: |