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背后的逻辑,那么将非常感谢:)谢谢!
答案 0 :(得分:0)
一致的缩进绝对可以帮助您查看与Begin End对有关的问题。
您的第一个IF测试的BEGIN处于其下方相同的水平位置,但是下一个IF测试的BEGIN则进一步缩进。
如果像第一个那样进行此IF测试,因为BEGIN和END位于相同的水平位置,它将暴露上述评论中指出的ZLK之类的问题,SELECT @errorDesc ='Invalid ID'在外面运行BEGIN END对。