sql - t sql "select case"vs "if ... else"以及关于 "begin"的解释

标签 sql sql-server tsql stored-procedures switch-statement

我对 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”语句中?也用于执行单条指令?

最佳答案

  • 此脚本中没有错误。
  • Case 语句用于表达式评估,而不用于语句执行。因此,不能在当前要求中使用。有关案例陈述的更多详细信息,请查看 http://msdn.microsoft.com/en-us/library/ms181765.aspx
  • 通常,一个语句可以是单一的或复合的。复合语句是语句的组合。对于 IF 条件,可以指定单个或复合语句,并且 SQL 服务器选择将其分组到 BEGIN .. END 中(与少数其他数据库/编程语言不同)。 ELSE 也是如此。因此,IF 后面应该跟 BEGIN...END,ELSE 后面应该跟 BEGIN...END。更多详情请引用http://msdn.microsoft.com/en-us/library/ms182717(v=sql.120).aspx
  • 关于sql - t sql "select case"vs "if ... else"以及关于 "begin"的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20669192/

    相关文章:

    mysql - 从派生表优化 SQL 查询

    sql - 联合、排除或拦截以在选择中使用默认数据?

    mysql - SQL:只有当该值为空时,如何才能更新列上的值?

    sql-server - 在sql查询中使用bigint时得到错误的结果

    php - 显示两个表的相关数据

    java - 如何在 MySql 查询中使用 if else ?

    sql-server - T-Sql 从货币数据类型中删除小数点

    mysql - 将 MS SQL 存储过程移植到 MySQL

    sql - 如何在 T-SQL 中删除默认值或类似约束?

    sql - 为什么交叉应用会使查询变慢?