为什么我无法处理alter table?
Begin Try
alter table nyork add [Qtr] varchar(20)
End Try
Begin Catch
Print 'Column already exist'
End Catch'
答案 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...CATCH
与 DDL 一起使用。有两种方法可以做到这一点。
TRY
块中使用动态 SQL - 已回答 here。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;