尝试Catch无法处理alter table

时间:2014-07-03 19:08:17

标签: sql sql-server sql-server-2008 try-catch

为什么我无法处理alter table?

Begin Try
alter table nyork add [Qtr] varchar(20)
End Try
Begin Catch
Print 'Column already exist'
End Catch'

4 个答案:

答案 0 :(得分:3)

因为其中一个是transact sql命令(try catch)而另一个是DDL语句。在执行alter语句之前,查询列是否存在可能会更好。要使用MSSQL执行此操作,请参阅How to check if a column exists in SQL Server table

答案 1 :(得分:0)

你不能做这样的事情。 TRY ... CATCH只能处理运行时错误。只要该列不存在,您的脚本就会运行,但是当该列已经存在时,它将不会运行。对象的名称解析在编译时完成。因此,SQL Server将始终在开始执行之前识别丢失的列。出于这个原因,你也不能用动态SQL做这样的事情。

答案 2 :(得分:0)

你可以用 exec('alter go here') 把它包装起来。然后抓就抓

答案 3 :(得分:0)

正如@Marcus Vinicius Pompeu 所说:“在执行 alter 语句之前,您最好先查询一下该列是否存在。”

但是,如果您真的想将 TRY...CATCHDDL 一起使用。有两种方法可以做到这一点。

  1. TRY 块中使用动态 SQL - 已回答 here
  2. TRY 块中使用存储过程 - 基于 documentation

基于您的代码的示例:

DROP PROCEDURE IF EXISTS dbo.sp_my_proc
GO
CREATE PROCEDURE dbo.sp_my_proc
AS
    --Your original code here:
    ALTER TABLE nyork ADD [Qtr] VARCHAR(20)
GO

BEGIN TRY  
    EXECUTE dbo.sp_my_proc 
    --Optional
    DROP PROCEDURE IF EXISTS dbo.sp_my_proc
END TRY  
BEGIN CATCH  
    --Catch your error here
    SELECT   
        ERROR_NUMBER() AS ErrorNumber  
        ,ERROR_MESSAGE() AS ErrorMessage;  
END CATCH;