Try Catch 无法处理 alter table

问题描述 投票:0回答:4

为什么我无法处理更改表?

Begin Try
alter table nyork add [Qtr] varchar(20)
End Try
Begin Catch
Print 'Column already exist'
End Catch'
sql sql-server sql-server-2008 try-catch
4个回答
5
投票

因为其中一个是transact sql命令(try catch),另一个是DDL语句。

在执行 alter 语句之前,最好先查询该列是否存在。

要使用 MSSQL 执行此操作,请参阅如何检查 SQL Server 表中是否存在列?

专门针对您的情况,

IF COL_LENGTH('nyork', 'Qtr') IS NULL
BEGIN
    alter table nyork
    add [Qtr] varchar(20)
END

0
投票

你不能做这样的事。 TRY...CATCH 只能处理运行时错误。只要该列不存在,您的脚本就会运行,但当该列已经存在时则不会运行。对象的名称解析是在编译时完成的。因此,SQL Server 在开始任何执行之前始终会识别丢失的列。因此,您不能使用动态 SQL 来执行此类操作。


0
投票

您可以用 exec('alter gets here') 包装它。然后抓住就会抓住


0
投票

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

但是,如果你真的想将

TRY...CATCH
DDL一起使用。有两种方法可以做到这一点。

  1. TRY
    块中使用动态SQL - 已在here得到解答。
  2. TRY
    块中使用存储过程 - 基于 文档

基于您的代码的示例:

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; 
© www.soinside.com 2019 - 2024. All rights reserved.