我正在尝试删除一些在我添加默认值时自动生成的约束。
我使用以下脚本向我返回约束的名称:
SELECT 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 tables.name = 'TrainingType'
AND default_constraints.name like 'DF__TrainingT__Soft__%'
OR default_constraints.name like 'DF__TrainingT__EndUs__%'
OR default_constraints.name like 'DF__TrainingC__Compu__%'
这将返回以下内容:
| name
---------------------------------
1 | DF__TrainingC__Compu__2058C9F1
2 | DF__TrainingT__EndUs__1559B68C
3 | DF__TrainingT__Softw__05CD5A39
现在我试图删除这些值的约束,但它不允许我做DROP CONSTRAINT ( ... )
ALTER TABLE TrainingType
DROP CONSTRAINT (
SELECT 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 tables.name = 'TrainingType'
AND default_constraints.name like 'DF__TrainingT__Soft__%'
OR default_constraints.name like 'DF__TrainingT__EndUs__%'
OR default_constraints.name like 'DF__TrainingC__Compu__%'
)
那么如何正确删除约束呢?
答案 0 :(得分:1)
动态Sql使用select ... for xml path ('')
method of string concatenation将命令连接成一个变量,以sp_executesql
执行:
declare @sql nvarchar(max);
select @sql = (
select
'alter table '+quotename(schema_name(dc.schema_id))
+'.'+quotename(object_name(dc.parent_object_id))
+' drop constraint '+quotename(name)+';'+char(10)
from sys.default_constraints as dc
where parent_object_id = object_id(N'TrainingType')
and dc.name like 'DF__TrainingT__Soft__%'
or dc.name like 'DF__TrainingT__EndUs__%'
or dc.name like 'DF__TrainingC__Compu__%'
for xml path (''), type).value('.','nvarchar(max)')
set @sql = 'use '+quotename(db_name())+';'+char(10)+@sql;
select @sql
exec sp_executesql @sql;
这是动态sql的一个很好的入门:
rextester演示:http://rextester.com/HSV25230
演示中生成的代码:
use [rextester];
alter table [dbo].[Pilots] drop constraint [DF__Pilots__df__173EF6DF];
alter table [dbo].[Pilots] drop constraint [DF__Pilots__other_df__18331B18];
答案 1 :(得分:0)
将ID添加为列并将名称添加为第二列时,也许它会起作用。
这应该是正确的语法:
ALTER TABLE "table_name"
DROP [CONSTRAINT|INDEX] "CONSTRAINT_NAME";
答案 2 :(得分:0)
您不能将动态限定符注入到这样的drop子句中。它们必须一次发布一个。类似的方法是生成一个脚本以作为单独的sql命令运行。
SELECT
'ALTER TABLE TrainingType DROP CONSTRAINT ( '
+ default_constraints.name +')'
+ CHAR(10)+CHAR(13)+ GO '
FROM sys.all_columns
INNER JOIN sys.tables ON all_columns.object_id = tables.object_id
....
现在,每个drop命令都有一个语句可以对数据库应用。