Sql 不使用名称显式删除约束
我有一个脚本,它创建了一个带有默认值的表,但是我想删除这个约束。手动操作没有问题,因为我知道名称,但我希望在重新创建表后删除约束。所以我可以重新运行drop约束脚本。如何在不显式使用名称的情况下执行此操作?您可以尝试此操作-这将在系统目录视图中查找必要的信息,并创建一个“drop”T-SQL命令,您可以复制并执行该命令,以摆脱系统命名的默认约束:Sql 不使用名称显式删除约束,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我有一个脚本,它创建了一个带有默认值的表,但是我想删除这个约束。手动操作没有问题,因为我知道名称,但我希望在重新创建表后删除约束。所以我可以重新运行drop约束脚本。如何在不显式使用名称的情况下执行此操作?您可以尝试此操作-这将在系统目录视图中查找必要的信息,并创建一个“drop”T-SQL命令,您可以复制并执行该命令,以摆脱系统命名的默认约束: CREATE TABLE [dbo].[tmp_rg_xx_LBJ] ( [ROWVERSION] [bigint] NULL, [ROWDATE]
CREATE TABLE [dbo].[tmp_rg_xx_LBJ]
(
[ROWVERSION] [bigint] NULL,
[ROWDATE] [datetime] NULL,
[SAPNO] [int] NOT NULL DEFAULT 1)
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[DF__tmp_rg_xx__SAPNO__1B0907CE]') AND type = 'D')
BEGIN
ALTER TABLE [dbo].[LBJ] DROP CONSTRAINT [DF__tmp_rg_xx__SAPNO__1B0907CE]
END
GO
如果需要将其放入自己的脚本中,可以将DropCmd
分配给变量,然后使用动态SQL执行该SQL语句:
SELECT
DropCmd = 'ALTER TABLE ' + t.name + ' DROP CONSTRAINT ' + df.Name
FROM sys.default_constraints df
INNER JOIN sys.columns c ON df.parent_object_id = c.object_id AND df.parent_column_id = c.column_id
INNER JOIN sys.tables t ON c.object_id = t.object_id
WHERE
t.Name = 'YourTableNameHere'
AND c.name = 'YourColumnNameHere'
您可以尝试此操作-这将在系统目录视图中查找必要的信息,并创建一个“drop”T-SQL命令,您可以复制并执行该命令,以摆脱系统命名的默认约束:
CREATE TABLE [dbo].[tmp_rg_xx_LBJ]
(
[ROWVERSION] [bigint] NULL,
[ROWDATE] [datetime] NULL,
[SAPNO] [int] NOT NULL DEFAULT 1)
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[DF__tmp_rg_xx__SAPNO__1B0907CE]') AND type = 'D')
BEGIN
ALTER TABLE [dbo].[LBJ] DROP CONSTRAINT [DF__tmp_rg_xx__SAPNO__1B0907CE]
END
GO
如果需要将其放入自己的脚本中,可以将DropCmd
分配给变量,然后使用动态SQL执行该SQL语句:
SELECT
DropCmd = 'ALTER TABLE ' + t.name + ' DROP CONSTRAINT ' + df.Name
FROM sys.default_constraints df
INNER JOIN sys.columns c ON df.parent_object_id = c.object_id AND df.parent_column_id = c.column_id
INNER JOIN sys.tables t ON c.object_id = t.object_id
WHERE
t.Name = 'YourTableNameHere'
AND c.name = 'YourColumnNameHere'
您可以像以前一样在
sys.objects
中查找约束,但是如果您要查找一个特定的约束,按名称引用它将是最好的方法。这就像询问如何在不实际使用表名的情况下查询表一样。它总是会启动DF_utmp_rg_xx_usapno我可以使用like吗?在创建约束时,您应该养成显式命名约束的习惯-这将使删除它们变得更容易!我知道,但我不得不多次重新创建表,而且删除是一个长脚本的一部分。我真的不想继续编辑脚本。你可以像以前那样在sys.objects
中查找约束,但是如果你在查找一个特定的约束,按名称引用它将是最好的方法。这就像询问如何在不实际使用表名的情况下查询表一样。它总是会启动DF_utmp_rg_xx_usapno我可以使用like吗?在创建约束时,您应该养成显式命名约束的习惯-这将使删除它们变得更容易!我知道,但我不得不多次重新创建表,而且删除是一个长脚本的一部分。我真的不想一直编辑剧本。叫我thicky先生[SAPNO][int]NOT NULL约束“SAPNO”默认值1)现在我一直都知道Constaint的名称谢谢你的努力guys@icecurtain:将默认约束称为DF_……
,这样您就可以将其与SAPNO
的实际列名分开。我倾向于称它们为DF(tablename)\uu(columnName)
——所以在你的例子中DF\u tmp\u rg\u xx\u LBJ\u SAPNO
要清楚明确地告诉我thicky先生[SAPNO][int]NOT NULL约束“SAPNO”默认值1)现在我一直都知道Constaint的名称谢谢你的努力guys@icecurtain:将默认约束称为DF_……
,这样您就可以将其与SAPNO
的实际列名分开。我倾向于称它们为DF(tablename)\uuu(columnName)
——所以在你的例子中DF\u tmp\u rg\u xx\u LBJ\u SAPNO