当我使用正确的参数运行以下过程以便不返回-1值时,我的DML语句都没有被触发。我猜它正在将我的所有DML语句视为ELSE
块的一部分。
SQL Server 2014
如何结束IF-ELSE-ELSE-IF块?
ALTER PROCEDURE [GenerateNumber] (
@Code VARCHAR(2)
)
AS
BEGIN
DECLARE @stringConcat VARCHAR = 'X';
IF @Code = 'KP'
SET @stringConcat += 'Y';
ELSE IF @Code = 'RL'
SET @stringConcat += 'Z';
ElSE
-- Return error code and stop processing
SELECT -1;
RETURN;
BEGIN TRY
-- Various DML statements...
SELECT @successValue;
RETURN;
END TRY
BEGIN CATCH
SELECT -1;
RETURN;
END CATCH
END
答案 0 :(得分:19)
好的,您必须在Begin
语句中使用End
和Else
,因为它包含多行代码。
IF @Code = 'KP'
SET @stringConcat += 'Y';
ELSE IF @Code = 'RL'
SET @stringConcat += 'Z';
ElSE
Begin
-- Return error code and stop processing
SELECT -1;
RETURN;
End
答案 1 :(得分:6)
你的缩进对你说谎。
IF @Code = 'KP'
SET @stringConcat += 'Y';
ELSE IF @Code = 'RL'
SET @stringConcat += 'Z';
ElSE
-- Return error code and stop processing
SELECT -1; -- THIS is evaluated as the ELSE
RETURN; -- THIS is run regardless.
只有最后一个ELSE之后的第一行才会被执行为ELSE条件。 RETURN将无论如何都会运行。无法接触你的开始。
试试这个:
IF @Code = 'KP'
SET @stringConcat += 'Y';
ELSE IF @Code = 'RL'
SET @stringConcat += 'Z';
ElSE
BEGIN
-- Return error code and stop processing
SELECT -1;
RETURN;
END
答案 2 :(得分:4)
如果您希望SELECT -1
和RETURN
都在ELSE
内,则必须使用BEGIN
/ END
块。现在只有SELECT -1
在else分支内。
所以你需要
ELSE
BEGIN
SELECT -1;
RETURN;
END
答案 3 :(得分:3)
If,ELSE IF中的最后一个ELSE
,ELSE包含多行代码。您需要使用BEGIN
启动它并以END
结束。有关详细信息,请参阅此*
。
IF @Code = 'KP'
SET @stringConcat += 'Y';
ELSE IF @Code = 'RL'
SET @stringConcat += 'Z';
ElSE
BEGIN
-- Return error code and stop processing
SELECT -1;
RETURN;
END
答案 4 :(得分:2)
在你的情况下(双关语),你可能最好使用CASE WHEN
构造,看你想要评估@Code
变量的不同值。 MSDN声明CASE
完全适用于此类情况:
Evaluates a list of conditions and returns one of multiple possible result expressions.
我发现它使代码在简单评估中更具可读性(但这很可能是个人偏好)。
您的代码最终看起来与此类似(伪代码。未经过测试):
CASE @Code
WHEN 'KP' THEN SET @stringConcat += 'Y';
WHEN 'RL' THEN SET @stringConcat += 'Z';
ElSE
-- Return error code and stop processing
SELECT -1;
RETURN;
END
有关此处CASE
声明的更多信息:
答案 5 :(得分:1)
在您的示例中,RETURN始终运行。
从编码实践标准来看,我应该始终在SQL中使用BEGIN和END来清楚地说明逻辑块中的内容。我更喜欢C#中的相同模式,即使不需要也可以使用大括号。在我看来,缩进很重要,它可以轻松地跟踪它的开始和结束位置。
IF(1=2)
BEGIN
SELECT 1
END
SELECT 2
IF(1=2) SELECT 1
SELECT 2
这些在行为上是等价的,但第一个清楚地表明SELECT 1依赖于它上面的逻辑条件。
你真正想要的是:
IF @Code = 'KP'
BEGIN
SET @stringConcat += 'Y';
END
ELSE IF @Code = 'RL'
BEGIN
SET @stringConcat += 'Z';
END
ElSE
BEGIN
-- Return error code and stop processing
SELECT -1;
RETURN;
END