代码之家  ›  专栏  ›  技术社区  ›  Bob The Janitor

在T-SQL中使用类似开关的逻辑

  •  32
  • Bob The Janitor  · 技术社区  · 15 年前

    这看起来像一个noob t-sql问题,但我想在存储过程中实现类似于switch的逻辑,我想使用case可以实现这一点

     SELECT CASE @Type
            WHEN 1 THEN
                INSERT INTO dbo.Credit (
                    CompanyName,
                    PhoneNumber,
                    City,
                    State
                ) VALUES ( 
                    @CompanyName,
                    @PhoneNumber,
                    @City,
                    @State) 
            WHEN 2 THEN  
                INSERT INTO dbo.Debit (
                    CompanyName,
                    PhoneNumber,
                    City,
                    State
                ) VALUES ( 
                    @CompanyName,
                    @PhoneNumber,
                    @City,
                    @State) 
            WHEN 3 THEN  
                --ETC
         END    
    

    但我总是出错,这只是一个Systax错误还是我出去吃午饭的原因?

    4 回复  |  直到 15 年前
        1
  •  55
  •   George Mastros    15 年前

    您需要使用if/else if结构,如下所示:

    If @Type = 1
        Begin
            INSERT INTO dbo.Credit (
                    CompanyName,
                    PhoneNumber,
                    City,
                    State
            ) VALUES ( 
                    @CompanyName,
                    @PhoneNumber,
                    @City,
                    @State) 
        End
    Else If @Type = 2
        Begin
            INSERT INTO dbo.Debit (
                    CompanyName,
                    PhoneNumber,
                    City,
                    State
            ) VALUES ( 
                    @CompanyName,
                    @PhoneNumber,
                    @City,
                    @State) 
        End
    Else If @Type = 3
        Begin
            --ETC
        END
    
        2
  •  16
  •   Jaider    8 年前

    你可以这样做:

    SET @SQL = CASE @Type
                WHEN 1 THEN
                        @SQL1
                WHEN 2 THEN  
                        @SQL2
                ELSE 
                        @SQL3
         END
    
    EXEC(@SQL)
    

    更新日期:2016年9月18日

    注意:这是一个简单而快速的解决方案,但请记住,这不是一个要在生产环境中实现的长期解决方案。 我同意@jon galloway的说法:“我不认为 CASE 这里合适吗?”

    另一个更专业的实现是创建3个不同的存储过程来完成它们自己的工作(单一责任原则),如下所示:

    If @Type = 1
        EXEC InsertCredit @CompanyName, @PhoneNumber, @City, @State
    Else If @Type = 2
        EXEC InsertDebit @CompanyName, @PhoneNumber, @City, @State
    Else If @Type = 3
        EXEC OtherInsert @CompanyName, @PhoneNumber, @City, @State
    
        3
  •  11
  •   Kev Riley    15 年前

    虽然g mastros的答案没有任何错误,但它可能会导致执行计划问题,因为每次运行过程时,执行路径都会更改。另一种选择是使用select…插入部分的WHERE子句:

    INSERT INTO dbo.Credit (
                    CompanyName,
                    PhoneNumber,
                    City,
                    State   ) 
    SELECT 
                    @CompanyName,
                    @PhoneNumber,
                    @City,
                    @State
    WHERE 
                    @Type = 1
    
    INSERT INTO dbo.Debit (
                    CompanyName,
                    PhoneNumber,
                    City,
                    State   ) 
    SELECT 
                    @CompanyName,
                    @PhoneNumber,
                    @City,
                    @State
    WHERE 
                    @Type = 2
    

    这样,所有代码都将始终执行,但只有@type匹配的代码才会“激发”

        4
  •  7
  •   Jon Galloway    15 年前

    这个 CASE statement can only be certain clauses 不是为了控制流量。您可以在set或update语句中使用它,但在更新不同的表时,这两种方法都没有帮助。如果不改变数据库(例如创建视图或其他东西),我认为case不适合这里。