0

我是 T-Sql 的初学者,我使用 case when 创建连接字符串,但是它的抛出错误。请指出语法错误的地方..

Declare @intCnt int;
Declare @strQuery Varchar(max);
Set @intCnt=1;
set @strQuery='';
While @intCnt<25
Begin
Case @strQuery
    When @strQuery='' then 
        Set @strQuery='Select Doctot_ID,Product_ID,'+ Cast(@intCnt as varchar(2))  +' As Month_ID,''NRx'' as Metric,PROD_NRx_'+ Cast(@intCnt as Varchar(2)) +' as Sales From Cube_Train_Prescription Where  Cast(PROD_NRx_'+ Cast(@intCnt as Varchar(2)) +' as int) <>0'
    else
        Set @strQuery=@strQuery + Char(13) + Char(10) + ' Union '+ Char(13) + Char(10) + ' Select Doctot_ID,Product_ID,'+ Cast(@intCnt as varchar(2)) +' As Month_ID,''NRx'' as Metric,PROD_NRx_'+ Cast(@intCnt as Varchar(2)) +' as Sales From Cube_Train_Prescription Where  Cast(PROD_NRx_'+ Cast(@intCnt as Varchar(2)) +' as int) <>0'
    End
End
Set @intCnt=@intCnt+1
End
Print @strQuery
4

5 回答 5

1

T-SQL 的CASE语句只能用于返回单个原子值——它不能用于执行代码。它不等同switch于 C#!

您需要将代码修改为:

DECLARE @intCnt INT;
DECLARE @strQuery VARCHAR(MAX);

SET @intCnt = 1;
SET @strQuery = '';

WHILE @intCnt < 25
BEGIN
   SET @strQuery =
         CASE 
            WHEN @strQuery='' 
              THEN 'Select Doctot_ID,Product_ID,'+ Cast(@intCnt as varchar(2))  +' As Month_ID,''NRx'' as Metric,PROD_NRx_'+ Cast(@intCnt as Varchar(2)) +' as Sales From Cube_Train_Prescription Where  Cast(PROD_NRx_'+ Cast(@intCnt as Varchar(2)) +' as int) <>0'
            ELSE 
                @strQuery + Char(13) + Char(10) + ' Union '+ Char(13) + Char(10) + ' Select Doctot_ID,Product_ID,'+ Cast(@intCnt as varchar(2)) +' As Month_ID,''NRx'' as Metric,PROD_NRx_'+ Cast(@intCnt as Varchar(2)) +' as Sales From Cube_Train_Prescription Where  Cast(PROD_NRx_'+ Cast(@intCnt as Varchar(2)) +' as int) <>0'
         END

    SET @intCnt = @intCnt + 1
END

PRINT @strQuery

有关更多详细信息,请参阅免费提供的在线文档CASE

于 2013-10-05T06:55:57.670 回答
0

我相信您在这里不需要 CASE 语句。您只使用 case 语句来检查它是否是循环的第一次迭代。你可以把那块从循环中拉出来。

DECLARE @intCnt INT;
DECLARE @strQuery VARCHAR(MAX);


SET @strQuery = 'Select Doctot_ID,Product_ID,1 As Month_ID,''NRx'' as Metric,PROD_NRx_1 as Sales From Cube_Train_Prescription Where  Cast(PROD_NRx_1 as int) <>0'
SET @intCnt = 2;

WHILE @intCnt < 25
BEGIN
    SET @strQuery = @strQuery + Char(13) + Char(10) + ' Union '+ Char(13) + Char(10) + ' Select Doctot_ID,Product_ID,'+ Cast(@intCnt as varchar(2)) +' As Month_ID,''NRx'' as Metric,PROD_NRx_'+ Cast(@intCnt as Varchar(2)) +' as Sales From Cube_Train_Prescription Where  Cast(PROD_NRx_'+ Cast(@intCnt as Varchar(2)) +' as int) <>0'

    SET @intCnt = @intCnt + 1
END

PRINT @strQuery
于 2013-10-07T06:37:19.210 回答
0

SELECT 语句中的用例。

SELECT CASE WHEN <PREDICATE> THEN <RESULT> ELSE <RESULT> END
于 2013-10-05T05:11:01.637 回答
0

用户 if else 条件语句进行查询。(Case When) 用于在某些条件下获取/放置值时

于 2013-10-05T06:20:12.927 回答
-1

只需编辑 When @strQuery=''when ''

Case @strQuery
When '' then 
    Set @strQuery='Select Doctot_ID,Product_ID,'+ Cast(@intCnt as varchar(2))  +' As Month_ID,''NRx'' as Metric,PROD_NRx_'+ Cast(@intCnt as Varchar(2)) +' as Sales From Cube_Train_Prescription Where  Cast(PROD_NRx_'+ Cast(@intCnt as Varchar(2)) +' as int) <>0'
else
    Set @strQuery=@strQuery + Char(13) + Char(10) + ' Union '+ Char(13) + Char(10) + ' Select Doctot_ID,Product_ID,'+ Cast(@intCnt as varchar(2)) +' As Month_ID,''NRx'' as Metric,PROD_NRx_'+ Cast(@intCnt as Varchar(2)) +' as Sales From Cube_Train_Prescription Where  Cast(PROD_NRx_'+ Cast(@intCnt as Varchar(2)) +' as int) <>0'
End
于 2013-10-05T05:18:47.323 回答