我对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
- 我没有看到任何宏观错误
- IF ELSE语句是在您的情况下用作插入或删除数据的语句,具体取决于IF子句的结果。SELECT CASE表达式用于根据SELECT语句中的数据获取结果表达式,但不用于根据数据结果应用算法
- 请参阅BEGIN END语句,如代码{代码}中的花括号。在T-SQL中放入BEGIN END语句不是强制性的。在我看来,最好使用它,因为它清楚地显示了算法的起点和终点。此外,如果将来有人必须处理你的代码,那么BEGIN END会更容易理解,他也更容易看到你代码背后的逻辑
-
此脚本中没有错误。
-
Case语句用于表达式求值,而不用于语句执行。因此,不能用于当前的要求。有关案例陈述的更多详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms181765.aspx
-
通常,语句可以是单个语句,也可以是复合语句。复合语句是语句的组合。对于IF条件,可以指定单个或复合语句,SQL server选择将其分组在BEGIN中。。END(与其他少数数据库/编程语言不同)。ELSE也是如此。因此,IF后面应该跟BEGIN。。。END和ELSE后面应该跟BEGIN。。。结束。有关更多详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms182717(v=sql.120).aspx