T SQL "select case" vs "if ... else" 以及关于"begin"的解释



我对t sql没有什么经验,我必须编写一个存储。

这是我存储的:

USE myDatabase
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[myStored]
(
@myPar1 INT,
@myPar2 SMALLDATETIME
)
AS
BEGIN
SET NOCOUNT ON
IF EXISTS (
SELECT 
1 
FROM 
myTable1 
WHERE 
myPar1 = @myPar1
AND myPar2 = @myPar2
)
BEGIN
DELETE FROM  
myTable1  
WHERE 
myPar1 = @myPar1
AND myPar2 = @myPar2
END
ELSE 
IF EXISTS (
SELECT 
1 
FROM 
myTable2 
WHERE 
myPar2 = @myPar2
)
BEGIN
INSERT INTO  
myTable1
(myField1, myField2, myField3, myField4)
VALUES
(@myPar1, @myPar2, '', 1)
END    
ELSE
IF EXISTS (
SELECT 
1 
FROM 
myTable3 
WHERE 
myPar2 = @myPar2
)
BEGIN
INSERT INTO  
myTable1
(myField1, myField2, myField3, myField4)
VALUES
(@myPar1, @myPar2, '', 1)
END
END

这些是我的问题:

1-是否存在宏观错误?

2-有人建议使用"SELECT CASE",其他人使用"IF…else",有什么区别?对于我的存储,什么是最好的选择?

3-我不确定"BEGIN…END"语句的用法,尤其是与"IF…ELSE"语句的组合。这是什么意思?是否有必要将"BEGIN…END"放在"IF…ELSE"语句中?也用于执行单个指令?

对于单个IF语句

IF (Some Condition)     --<-- If condition is true control will get inside the 
BEGIN                     -- BEGIN ..END Block and execute the Code inisde
/* Your Code Here*/
END

所有单个IF语句将独立地检查条件。

一个IF和一个ELSE

IF (Some Condition)     --<-- If condition is true control will get inside the 
BEGIN                     -- BEGIN ..END Block and execute the Code inisde
/* Your Code Here*/     -- IF not true control will jump to Else block
END
ELSE       --<-- You dont mention any condition here
BEGIN                    
/* Your Code Here*/
END

只有一个代码块将执行IF true,然后执行第一个其他ELSE代码块。

多个IF和ELSE

IF (Some Condition)     --<--1) If condition is true control will get inside the 
BEGIN                     -- BEGIN ..END Block and execute the Code inisde
/* Your Code Here*/     -- IF not true control will check next ELSE IF Blocl
END
ELSE IF (Some Condition)       --<--2) This Condition will be checked
BEGIN                    
/* Your Code Here*/
END
ELSE IF (Some Condition)       --<--3) This Condition will be checked
BEGIN                    
/* Your Code Here*/
END
ELSE                --<-- No condition is given here Executes if non of
BEGIN                --the previous IFs were true just like a Default value   
/* Your Code Here*/
END

如果条件为true,则只执行代码的第一个块,其余部分将被忽略。

开始。。END块

在任何IF、ELSE IF或ELSE之后,如果执行多个语句,则必须将它们封装在BEGIN..END块中。如果您只执行一条语句,这是不必要的,但始终使用BEGINEND块是一种很好的做法,这样可以更容易地读取代码。

您的程序

我已经拿出了ELSE语句,让每个IF语句独立地检查给定的条件,现在你对如何处理IF和ELSE有了一些想法,所以你自己试试吧,因为我不知道你想在这里应用什么逻辑。

CREATE PROCEDURE [dbo].[myStored]
(
@myPar1 INT,
@myPar2 SMALLDATETIME
)
AS
BEGIN
SET NOCOUNT ON
IF EXISTS (SELECT 1 FROM myTable1 WHERE myPar1 = @myPar1
AND myPar2 = @myPar2)
BEGIN
DELETE FROM  myTable1  
WHERE myPar1 = @myPar1 AND myPar2 = @myPar2
END

IF EXISTS (SELECT 1 FROM myTable2 WHERE myPar2 = @myPar2)
BEGIN
INSERT INTO  myTable1(myField1, myField2, myField3, myField4)
VALUES(@myPar1, @myPar2, '', 1)
END    

IF EXISTS (SELECT 1 FROM myTable3  WHERE myPar2 = @myPar2)
BEGIN
INSERT INTO  myTable1(myField1, myField2, myField3, myField4)
VALUES(@myPar1, @myPar2, '', 1)
END
END
  1. 我没有看到任何宏观错误
  2. IF ELSE语句是在您的情况下用作插入或删除数据的语句,具体取决于IF子句的结果。SELECT CASE表达式用于根据SELECT语句中的数据获取结果表达式,但不用于根据数据结果应用算法
  3. 请参阅BEGIN END语句,如代码代码中的花括号。在T-SQL中放入BEGIN END语句不是强制性的。在我看来,最好使用它,因为它清楚地显示了算法的起点和终点。此外,如果将来有人必须处理你的代码,那么BEGIN END会更容易理解,他也更容易看到你代码背后的逻辑
  1. 此脚本中没有错误。

  2. Case语句用于表达式求值,而不用于语句执行。因此,不能用于当前的要求。有关案例陈述的更多详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms181765.aspx

  3. 通常,语句可以是单个语句,也可以是复合语句。复合语句是语句的组合。对于IF条件,可以指定单个或复合语句,SQL server选择将其分组在BEGIN中。。END(与其他少数数据库/编程语言不同)。ELSE也是如此。因此,IF后面应该跟BEGIN。。。END和ELSE后面应该跟BEGIN。。。结束。有关更多详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms182717(v=sql.120).aspx

最新更新