SQL Server存储过程:使用输出变量验证CRUD操作成功/失败

时间:2016-05-20 15:00:58

标签: sql sql-server stored-procedures sql-update try-catch

我正在尝试创建一个SQL Server存储过程来使用一些动态SQL处理对表的更新。更新所需的表名存储在一个表中,该表将表id与类别ID相关联。检索到表名并且表id不为null后,我使用动态SQL查询更新表,如下所示:

CREATE PROCEDURE [dbo].[SP_EBS_CustomForms_SetCategoryData] 
    (@flag int output,
     @cat_id int, 
     @sort int, 
     @value varchar(50), 
     @active int, 
     @enum int)
AS
BEGIN
    DECLARE @tbl as varchar(50)
    DECLARE @tbl_id as int
    DECLARE @sql nvarchar(max)

    BEGIN TRY
        SET @tbl_id = (SELECT [tbl_id] 
                       FROM [demodata].[dbo].[ebscustomforms_cattable] 
                       WHERE cat_id = @cat_id)

        IF @tbl_id IS NOT NULL 
        BEGIN
            SET @tbl = (SELECT table_name 
                        FROM ebscustomforms_enumtable 
                        WHERE tbl_id = @tbl_id)
            SET @sql = 'UPDATE ' + @tbl + ' SET [sort_order] = @sort, [value] = @value, [active] = @active WHERE [enum_id] = @enum'

            EXECUTE sp_executesql @sql, N'@sort int, @value varchar(50), @active int, @enum int', @sort, @value, @active, @enum

            SET @flag = 0

            RETURN @flag
        END
    END TRY
    BEGIN CATCH
        IF @@ERROR <> 0
        BEGIN
            SET @flag = 1;
            RETURN @flag
        END
    END CATCH
END

我希望这个存储过程返回一个int值,指示存储过程是成功(0)还是失败(1)更新表。

错误点如下:

  1. @tbl_id变量为空
  2. @tbl为null或空varchar
  3. 要更新的表没有记录where [enum_id] = @enum
  4. 我注意到当我尝试更新不存在的记录时,程序似乎返回成功,即@flag = 0.但是,我认为应该抛出错误,因为记录不存在。

0 个答案:

没有答案