T-SQL Basic自定义错误在存储过程中被忽略

时间:2018-11-18 21:13:01

标签: sql-server tsql if-statement adventureworks raiserror

EDIT3:解决方案 显然,我的代码在BEGIN / END块上有问题,如回答的用户所建议的(谢谢!)

不过,直到找到这篇文章并尝试了以下if / else结构,using Switch like logic in T-SQL

我还是无法使您工作

EDIT2:
我在过程中写了两个PRINT,并且值传递正确。现在,即使发送200,它也只会显示“无效ID”。

220
dsf4
Oct 12 2018 10:10AM
Msg 50000, Level 16, State 1, Procedure p_ValCulture, Line 188
Invalid ID

编辑: 我尝试在BEGIN / END内设置错误消息;它没有用。这是该部分的代码。

IF @operacion LIKE 'I'
    BEGIN
        IF @id IS NULL OR @id <= 0
            BEGIN
                SELECT @errorDesc = 'Invalid ID'    
                RAISERROR(@errorDesc, 16, 1)
            END

        IF EXISTS(SELECT 1 FROM Production.Culture AS pc WHERE PC.CultureID = @id)
            BEGIN   
                SELECT @errorDesc = 'ID already exists'
                RAISERROR(@errorDesc, 16, 1)
            END
END

如果执行存储过程,我会得到这个

Msg 50000, Level 16, State 1, Procedure p_ValCulture4, Line 183

在该消息下方有一个空格,这是我无法设置的错误消息的值。

这些是我传递的参数:

GO
EXEC p_ValCulture4 200, 'John', '10-12-2018 10:10:10.000','I'

我正在Windows 64位系统上使用SQL Server Management 2014。


我试图赶上一些T-SQL,但我没有得到足够的重视。.但是我完全陷入了困境:/我检查了Google,Youtube,SO等,并尝试了很多方法,但没有任何效果,我浪费时间完全停留在我无法理解的部分。

我有一个存储过程,当该存储过程发送为“ I”(字符)的“操作”时,将在表中执行插入操作。我正在将AdventureWorks2014数据库用作练习。

问题是,如果要发送的id为null,或者如果表中已经存在另一个id,我想发送不同的错误消息。这是该过程的代码:

CREATE PROCEDURE p_ValCulture4
   @id INT,
   @name NVARCHAR(50),
   @date DATETIME,
   @operacion CHAR(1)
AS
BEGIN
   print @id
   print @name
   print @date
   SET NOCOUNT ON 
   DECLARE @errorDesc nvarchar(MAX)

   BEGIN TRY

       SELECT @operacion = UPPER(@operacion) 

       IF @operacion = 'I'  /* the Insert option */
          BEGIN
              IF @id IS NULL OR @id <= 0
                  BEGIN
                      SELECT @errorDesc = 'Invalid ID'  
                      RAISERROR(@errorDesc, 16, 1)
                  END

              IF EXISTS(SELECT 1 FROM Production.Culture AS pc WHERE PC.CultureID = @id)
                 BEGIN
                      SELECT @errorDesc = 'ID already exists'
                      RAISERROR(@errorDesc, 16, 1)
                 END

              SELECT @errorDesc = 'ERROR: Insert error'
              INSERT INTO Production.Culture VALUES
        (@id, @name, @date);
              SELECT 'Rows: ' + CONVERT(VARCHAR(10),@@ROWCOUNT)
          END
      END TRY
   BEGIN CATCH
       RAISERROR (@errorDesc,16,1)
   END CATCH
END

第一个IF,如果我发送id = null可以正常工作,我得到正确的错误;但是如果我发送一个现有的ID,则IF将被完全忽略。插入也会发生同样的情况,但工作正常,但前提是该过程中没有IF。

我不知道这些IF-BEGIN / END是如何工作的..以及为什么它只能读取第一个IF但忽略随后的IF ..

我尝试将所有内容放入IF-BEGIN / END,然后放入ELSE-BEGIN / END,结果相同。

我尝试将错误消息设置在de IF内部以及外部。另外,在IF内,但在BEGIN之前。我尝试直接在RAISERROR内写入错误,结果相同。

如果有人可以帮助我理解为什么IF会被忽略以及T-SQL中这些IF背后的逻辑,那么将非常感谢:)谢谢!

1 个答案:

答案 0 :(得分:0)

一致的缩进绝对可以帮助您查看与Begin End对有关的问题。

您的第一个IF测试的BEGIN处于其下方相同的水平位置,但是下一个IF测试的BEGIN则进一步缩进。

如果像第一个那样进行此IF测试,因为BEGIN和END位于相同的水平位置,它将暴露上述评论中指出的ZLK之类的问题,SELECT @errorDesc ='Invalid ID'在外面运行BEGIN END对。