无法捕获SQL Server alter表错误
这是一个非常简单的代码,但它无法捕获错误 或者如何捕捉错误 谢谢无法捕获SQL Server alter表错误,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,这是一个非常简单的代码,但它无法捕获错误 或者如何捕捉错误 谢谢 BEGIN TRY ALTER TABLE [dbo].[my_table_name] ADD PRIMARY KEY ([id]); END TRY BEGIN CATCH PRINT 'Primary Key already exists. ' END CATCH 延迟名称解析后由于批处理重新编译而发生的错误无法在发生错误的同一级别捕获。一种解决方法是在动态SQL中封装DDL: BEGIN TRY
BEGIN TRY
ALTER TABLE [dbo].[my_table_name]
ADD PRIMARY KEY ([id]);
END TRY
BEGIN CATCH
PRINT 'Primary Key already exists. '
END CATCH
延迟名称解析后由于批处理重新编译而发生的错误无法在发生错误的同一级别捕获。一种解决方法是在动态SQL中封装DDL:
BEGIN TRY
EXEC(N'ALTER TABLE [dbo].[my_table_name] ADD PRIMARY KEY ([id]);');
END TRY
BEGIN CATCH
IF ERROR_NUMBER() = 1779
BEGIN
--handle expected errors
PRINT 'Primary Key already exists. ';
END
ELSE
BEGIN
--raise other unexpected errors
THROW;
END;
END CATCH;
延迟名称解析后由于批处理重新编译而发生的错误无法在发生错误的同一级别捕获。一种解决方法是在动态SQL中封装DDL:
BEGIN TRY
EXEC(N'ALTER TABLE [dbo].[my_table_name] ADD PRIMARY KEY ([id]);');
END TRY
BEGIN CATCH
IF ERROR_NUMBER() = 1779
BEGIN
--handle expected errors
PRINT 'Primary Key already exists. ';
END
ELSE
BEGIN
--raise other unexpected errors
THROW;
END;
END CATCH;
您可能会发现这很有用:。也许您可以验证是否已经存在。。。如果不存在,则从信息模式表约束中选择*,其中约束类型='PRIMARY'..blahIF不存在从信息模式表约束中选择*,其中约束类型='PRIMARY KEY',表名称='my_TABLE_NAME'ALTER TABLE[dbo]。[my_TABLE_NAME]添加主键[id];谢谢,它也很有用。大多数语言都有现有的控制结构,可以在不使用异常的情况下解决您的问题。不属于反模式。您可能会发现这很有用:。也许您可以验证是否已经存在。。。如果不存在,则从信息模式表约束中选择*,其中约束类型='PRIMARY'..blahIF不存在从信息模式表约束中选择*,其中约束类型='PRIMARY KEY',表名称='my_TABLE_NAME'ALTER TABLE[dbo]。[my_TABLE_NAME]添加主键[id];谢谢,它也可以工作。大多数语言都有现有的控制结构,可以在不使用异常的情况下解决您的问题,而不属于反模式