为什么我无法处理更改表?
Begin Try
alter table nyork add [Qtr] varchar(20)
End Try
Begin Catch
Print 'Column already exist'
End Catch'
因为其中一个是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
你不能做这样的事。 TRY...CATCH 只能处理运行时错误。只要该列不存在,您的脚本就会运行,但当该列已经存在时则不会运行。对象的名称解析是在编译时完成的。因此,SQL Server 在开始任何执行之前始终会识别丢失的列。因此,您不能使用动态 SQL 来执行此类操作。
您可以用 exec('alter gets here') 包装它。然后抓住就会抓住
正如 @Marcus Vinicius Pompeu 所说:“在执行 alter 语句之前,最好先查询该列是否存在。”
但是,如果你真的想将
TRY...CATCH
与DDL一起使用。有两种方法可以做到这一点。
基于您的代码的示例:
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;