【问题标题】:How make a TRY CATCH drop如何使 TRY CATCH 下降
【发布时间】:2019-02-15 17:25:53
【问题描述】:

我想得到这个对象的名字

删除具有该名称的约束

ALTER TABLE dbo.Establecimientos 
    DROP CONSTRAINT DF__Estableci__proce__498EEC8D

DF__Estableci__proce__498EEC8D 是我与之发生冲突的对象的名称

我需要捕获该错误并自动为他替换我的代码。

【问题讨论】:

  • 盲目地开始放弃这样的约束可能是一个非常糟糕的主意。这具有成为xy problem 的所有迹象。
  • 是一个案例。我刚刚为他在开发环境中执行创建了一个脚本,并且我只是为: 1 .- 在安装前第一次执行脚本。 2 .- 脚本执行以防出错,我们需要返回数据库中的更改
  • 也许在dba.stackexchange.com上研究得更好

标签: sql sql-server heidisql


【解决方案1】:

您可以做的是在删除列之前检查是否存在默认约束。

此查询将返回您要删除的列上存在的默认约束的名称。只需替换要删除的表名和列名即可。

select dc.name 
from sys.default_constraints dc
join sys.tables t on t.object_id=dc.parent_object_id
join sys.columns c on c.object_id=t.object_id and c.column_id=dc.parent_column_id
where t.name='YourTABLE'
and c.name='YourCOLUMN'

使用此查询,您将创建“DROP CONSTRAINT”并为您的表和列执行它。请记住在删除列之前执行此操作。

DECLARE @Query nvarchar(max)

select @Query='ALTER TABLE '+ schema_name(t.schema_id) + '.' + t.name + ' DROP CONSTRAINT ' + dc.name 
from sys.default_constraints dc
join sys.tables t on t.object_id=dc.parent_object_id
join sys.columns c on c.object_id=t.object_id and c.column_id=dc.parent_column_id
where t.name='YourTABLE'
and c.name='YourCOLUMN'

exec sp_execute @Query

【讨论】:

  • 它不起作用。只需返回列名“name”即可
  • 列名“name”是你列的约束名。您可以使用它来检索约束的名称并编写 DROP 脚本。我将更改示例以执行此操作。
  • 仍然没有工作。这会发生什么,当我执行您的第一个代码时,该列中不会返回任何内容。这就是问题
  • 您是否更改了“where t.name='YourTABLE' and c.name='YourCOLUMN'”为您的?您使用的是什么版本的 SQL Server?您正在搜索的 COLUMN 是否有默认值?
  • 是的,我改了。版本为 11.0.5058.0。是的,该列有一个默认值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
  • 2015-07-07
  • 2010-09-21
  • 1970-01-01
  • 2012-11-25
  • 2013-05-22
相关资源
最近更新 更多