在删除现有列/检查列之前捕获错误,然后删除它

时间:2017-06-06 17:19:34

标签: sql-server

我使用sql server 2014。

我有几个存储过程,一个用于删除列表另一个用于添加列表。 以下是删除列的代码。 这是删除任何表中任何列的通用过程。

@Column和@Table是存储过程的输入

我能找到执行语句的唯一方法是定义一个包含要执行的sql指令的tsql字符串,并将表名和列名添加到命令中。

    DECLARE @tsql varchar (MAX)
    SET @tsql = 'ALTER TABLE [dbo].['+@Table+'] DROP COLUMN ' + @Column  
    EXECUTE(@tsql)

如果发生错误,我想返回-1,否则如下:

    if @@ERROR <> 0
        BEGIN 
            RETURN(-1)
        END
    ELSE
        BEGIN
            RETURN(2)
        END

如果在执行

时出现问题,如何捕获错误
    EXECUTE(@tsql)

我尝试使用@@ ERROR,但执行过程没有发现错误。

作为替代方案,如果我试图删除不存在的列,那么检查列是否存在的方法是什么?

运行存储过程我添加以下结果:错误4924“ALTER TABLE DROP COLUMN失败,因为表'part'中不存在列'bla'。”

此外,我想返回一个标志以确认更改(如果有)。

ALTER PROCEDURE [dbo].[DropColumn]
    -- Add the parameters for the stored procedure here
    @Table varchar(MAX)=NULL, 
    @Column varchar(MAX)=NULL,
    @ColumnModified int OUTPUT
AS
    BEGIN TRY
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    Set @ColumnModified=0
    IF (@Table) IS NULL GOTO Help
    IF (@Column) IS NULL GOTO Help
    -- Insert statements for procedure here
    DECLARE @tsql varchar (MAX)
    SET @tsql = 'ALTER TABLE [dbo].['+@Table+'] DROP COLUMN ' + @Column  
    EXECUTE(@tsql)
    if @@ERROR <> 0
        BEGIN 
            RETURN(-1)
        END
    ELSE
        BEGIN
            RETURN(2)
        END
    Help:
        PRINT 'DropColumn'
        PRINT CHAR(13)
        PRINT 'usage:'
        PRINT CHAR(13)
        PRINT '@Table '
        PRINT CHAR(13)
        PRINT '@Column '
        PRINT CHAR(13)
        PRINT 'output @ColumnModified '
        PRINT CHAR(13)
        RETURN(-1)
    END TRY
    BEGIN CATCH
        SELECT   
        ERROR_NUMBER() AS ErrorNumber  
       ,ERROR_MESSAGE() AS ErrorMessage; 
        RETURN(-1)
    END CATCH

这里的帖子How to check if a column exists in SQL Server table是对我的问题的部分和非直接的答案,因为它是特定的表和列所特有的。 而不是tableName的字符串valyue我有一个变量(对于columnName是相同的)。 如何使用@Column和@Table移植以下代码?

IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL
BEGIN
    -- Column Exists
END

1 个答案:

答案 0 :(得分:1)

不确定您的问题&#34;是可重复的,但我已经确认TRY CATCH块可以工作:

BEGIN TRY

DECLARE @sql nvarchar(max);

SET @sql = 'ALTER TABLE [dbo].[SomeTable] DROP COLUMN NonExistentColumn'

EXECUTE(@sql);

END TRY

BEGIN CATCH

SELECT @@ERROR

END CATCH

此代码为我返回4924。哪个不是0。