【问题标题】:Dynamic sql with CASE expression带有 CASE 表达式的动态 sql
【发布时间】:2015-06-24 10:13:04
【问题描述】:
   SET @SQL =
        'SELECT
        CaseStatus =
            CASE Level1Status
                WHEN 1100 THEN ''Case Submitted to QC''
                WHEN 1200 THEN ''Pending QC''
                WHEN 1400 THEN ''Passed QC''
            
            END,

我目前在使用上面的动态 sql/case 表达式时遇到问题,因为我似乎无法将字符串放入动态 sql 中,有没有人碰巧有解决这个问题的方法

编辑

作为 开始 声明@SQL nvarchar(4000)

SET @SQL =
    'SELECT
    CaseStatus =
        CASE Level1Status
            WHEN 1100 THEN ''Case Submitted to QC''
            WHEN 1200 THEN ''Pending QC''
            WHEN 1400 THEN ''Passed QC''
        
        END,
        
        CaseStartDateTime,
        CaseEndDateTime,
        StatusName,
        Cell_NameDescription,
        QCAnalystName,
        AnalystName,
        Upload_Datetime,
        Requesting_Entity,
        Legal_Entity_TypeDescription,
        HighPriorityDescription,
        DD_Level_RequiredDescription,
        CountryDscr,
        Maintable.KYCCaseId AS KYCCaseId
    FROM
        UACTc75760ab10784b51b585f082d4b25223 AS MI,
        UACT175e55161660402692a53a4cdeb89bd6 AS MainTable,
        UACT5996d6e5151245cab24e4e76e3e53540 AS Statuses,
        UACTde5f05df6c5f4872a1e57b3cf8368301 AS AddressDetails
    WHERE
        (
        MI.CaseStartDateTime BETWEEN ' + quotename(convert(varchar(10), @CaseStartDateTime, 120), '''') + ' AND '  + quotename(convert(varchar(10), @CaseEndDateTime, 120), '''') +
        ' OR
        MI.CaseEndDateTime BETWEEN ' + quotename(convert(varchar(10), @CaseStartDateTime, 120), '''') +  ' AND ' + quotename(convert(varchar(10), @CaseEndDateTime, 120), '''') +
        ' )
    AND
        MI.KYCCase_Id = MainTable.KYCCaseId'
    IF @StatusName IS NOT NULL AND ltrim(rtrim(@StatusName)) != N''
        SET @SQL = @SQL + ' 
        AND
            Statuses.SourceStatus = MainTable.Level1Status
        AND
            Statuses.StatusName = ' + quotename(@StatusName, '''')
    IF @CountryDscr IS NOT NULL AND ltrim(rtrim(@CountryDscr)) != N''
    SET @SQL = @SQL + '
        AND
            AddressDetails.CountryDscr = ' + quotename(@CountryDscr, '''')      
    IF @CellDscr IS NOT NULL AND ltrim(rtrim(@CellDscr)) != N''
        SET @SQL = @SQL + ' 
        AND
            MainTable.Cell_NameDescription = ' + quotename(@CellDscr, '''') 
    IF @QCAnalystName IS NOT NULL AND ltrim(rtrim(@QCAnalystName)) != N''
        SET @SQL = @SQL + '
        AND
            MainTable.QCAnalystName = ' + quotename(@QCAnalystName, '''')   
    IF @AnalystName IS NOT NULL AND ltrim(rtrim(@AnalystName)) != N''
        SET @SQL = @SQL + '
        AND
            MainTable.AnalystName = ' + quotename(@AnalystName, '''')
    IF @RequestingEntity IS NOT NULL AND ltrim(rtrim(@RequestingEntity)) != N''
        SET @SQL = @SQL + '
        AND
            MainTable.Requesting_Entity = ' + quotename(@RequestingEntity, '''')
    IF @EntityType IS NOT NULL AND ltrim(rtrim(@EntityType)) != N''
        SET @SQL = @SQL + '
        AND
            MainTable.Legal_Entity_TypeDescription = ' + quotename(@EntityType, '''')
    IF @HighPriority IS NOT NULL AND ltrim(rtrim(@HighPriority)) != N''
        SET @SQL = @SQL + '
        AND
            MainTable.HighPriorityDescription = ' + quotename(@HighPriority, '''')
    IF @DDLevelRequired IS NOT NULL AND ltrim(rtrim(@DDLevelRequired)) != N''
        SET @SQL = @SQL + '
        AND
            MainTable.DD_Level_RequiredDescription = ' + quotename(@DDLevelRequired, '''')  

EXEC sp_executesql @SQL

这是整个代码,我得到的错误是

消息 156,第 15 级,状态 1,第 32 行
关键字“Case”附近的语法不正确。

【问题讨论】:

  • 请澄清查询,以便我们了解您要执行的操作。
  • 我正在尝试为报告创建过滤器,如果状态为 1100、1200 和 1400,则会在表格中添加一列以反映字符串“已提交案例”、“待定 QC”和“ Passed QC',问题是因为我的动态 sql 当前设置为变量 @SQL 作为字符串,我无法将字符串 'Case Submitted'、'Pending QC' 和 'Passed QC' 添加到 case 语句谢谢
  • @EmperorDev 使用动态 sql 和您的代码也可以正常工作。
  • 我认为这不是你的问题。你到底得到了什么错误?您能否向我们展示您的其余代码,因为这当然不是全部。
  • @EmperorDev,只需使用PRINT @SQL 而不是EXEC sp_executesql @SQL。您将看到实际构造的查询。尝试手动执行它/如果出现错误,您可能会看到与错误连接的位置。更正并重试...您引用了所有内容...日期、字符串、数字。当您引用结果时,引擎将作为某些列名称或其他对象名称获取结果。玩弄打印。

标签: sql sql-server sql-server-2008 sql-server-2008-r2 dynamic-sql


【解决方案1】:

这工作正常。

Create Table #Level1Status(Id int identity ,Level1Status int)

Insert INto #Level1Status(Level1Status) values(1100),(1200),(1400)


            Declare @SQL Nvarchar(Max)
            SET @SQL =
                    'SELECT 
                    CaseStatus =
                        CASE Level1Status
                            WHEN 1100 THEN ''Case Submitted to QC''
                            WHEN 1200 THEN ''Pending QC''
                            WHEN 1400 THEN ''Passed QC''

                        END from #Level1Status';
            Exec SP_ExecuteSQL @SQL

【讨论】:

    【解决方案2】:

    由于您将@SQL 字符串与局部变量“@xxx”连接起来,以防其中任何一个可能为空,它想要提供任何输出,因此在连接时使用 ISNULL() 或 COALESCE() 与您使用的所有局部变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-03
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      相关资源
      最近更新 更多