【问题标题】:SELECT statement inside CASE clause in TSQL throws errorSQL中CASE子句中的SELECT语句引发错误
【发布时间】:2012-01-01 18:54:12
【问题描述】:

我不得不对一堆存储过程进行微调,并得到一个其中包含大量IF ELSE blocks 的存储过程,它们具有带有事务的插入语句。因此,我使用 case 对它们进行建模以发现我得到语法错误尝试以下语句(正在执行的简单示例),但肯定你会明白的

DECLARE @rowcount int
SELECT @rowcount = -1
 CASE WHEN @rowcount = -1 THEN
    select 'I WON THE RACE'
 WHEN '2' 
    SELECT 'WHAT A LOSER'
 END

每个案例都有多个声明,所以我只是将它们封装在 () 中,但没有用。请更正我对 TSQL 中的 Case 的了解。 (如果有帮助,请使用 SQl Server 2005)

【问题讨论】:

    标签: sql sql-server sql-server-2005 tsql case


    【解决方案1】:

    您希望您的 CASE 语句如下所示:

    DECLARE @rowcount int
    SELECT @rowcount = -1;
    SELECT CASE @rowcount
              WHEN -1 THEN 'I WON THE RACE'
              WHEN 2 THEN 'I did not win'
           END AS columnName
    

    CASE 位于 SELECT 语句的内部。然后您只需查看您的@rowCount 的值,并采取适当的措施。您可能想了解更多关于 CASE 声明的信息

    CASE 语句的第二种形式如下所示:

    SELECT CASE 
       WHEN @rowcount IS NULL THEN 'Null case here'
       WHEN @rowcount = -1 THEN 'I WON THE RACE'
       WHEN @rowcount = 2 THEN 'I did not win'
    END AS columnName
    

    如果您想使用带有 INSERT 的 CASE:

    DECLARE @rowcount int
    SELECT @rowcount = -1;
    
    INSERT INTO myTable(column1, column2, column3)
    SELECT CASE @rowcount
              WHEN -1 THEN 'I WON THE RACE'
              WHEN 2 THEN 'I did not win'
           END AS column1
       , t.column2
       , CASE
            WHEN t.someColumn < someValue THEN 'thirdColumnValue'
            ELSE 'someColumn is greater than specified value'
         END AS column3
    FROM secondTable AS t
    

    【讨论】:

    • 如果不够清楚,我很抱歉。这只是一个例子,我用插入语句代替了那些选择这没有区别吗?
    • @Deeptechtons 我已经更新了我的答案,包括一个使用CASE 语句的INSERT 示例。
    【解决方案2】:

    根据您的评论,如果您尝试执行 2 个不同的插入/多个语句,听起来您可能想要使用 IF 语句?

    IF @rowcount = -1
    BEGIN
      <stmt1>
      <stmt2>
    END
    
    IF @rowcount = 2
    BEGIN
      <stmt3>
      <stmt4>
    END
    

    【讨论】:

    • 没错,存储过程中有许多 if else's,我想用 Case 替换它们。这就是我前往这里的原因。**所以没有任何替代品?**
    • 不,如果目标是运行这样的整个语句,则没有替代品。 CASE 在语句中用于分支逻辑,而不是执行新语句
    【解决方案3】:

    您将 T-SQL 的 SELECT...CASE 与 VisualBasic 的 SELECT CASE. 混淆了

    T-SQL:

    CASE 表达式用于计算多个条件并返回 每个条件的单个值。例如,它允许一个 根据列的值显示的替代值。

    VB:

    Select...Case 运行几组语句之一,具体取决于 表达式的值。

    如果 T-SQL 中存在等价物,那就太好了,但没有。 Here's what's available in T-SQL.

    【讨论】:

      【解决方案4】:

      仅供参考 你也可以使用设置set @rowcount = -1;

      DECLARE @rowcount int
      set @rowcount = -1;
       select  CASE @rowcount WHEN -1 THEN
           'I WON THE RACE'
       WHEN '2' then
          'WHAT A LOSER'
       END Status
      

      【讨论】:

      • 与我的问题无关
      猜你喜欢
      • 2014-12-05
      • 2015-02-27
      • 2023-04-07
      • 2010-11-10
      • 1970-01-01
      • 2022-01-17
      • 2020-03-26
      • 1970-01-01
      • 2022-01-03
      相关资源
      最近更新 更多