Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带CASE语句的动态sql_Sql_Sql Server_Sql Server 2008_Sql Server 2008 R2 - Fatal编程技术网

带CASE语句的动态sql

带CASE语句的动态sql,sql,sql-server,sql-server-2008,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008,Sql Server 2008 R2,我目前在上面的动态sql/case语句中遇到了问题,因为我似乎无法将字符串放入动态sql中,是否有人碰巧有解决方案来解决这个问题 非常感谢 编辑 作为 开始 声明@SQL nvarchar(4000) 这是全部代码,我得到的错误是 信息156,第15级,状态1,第32行 关键字“Case”附近的语法不正确。这可以正常工作 SET @SQL = 'SELECT CaseStatus = CASE Level1Status WHEN 1100

我目前在上面的动态sql/case语句中遇到了问题,因为我似乎无法将字符串放入动态sql中,是否有人碰巧有解决方案来解决这个问题

非常感谢

编辑

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

这是全部代码,我得到的错误是

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

这可以正常工作

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

由于您要将@SQL字符串与局部变量“@xxx”连接在一起,万一任何一个ase可能为null,它会给出任何输出,所以在连接时使用ISNULL()或COALESCE()与您使用的所有局部变量

请澄清查询,以便我们了解您尝试执行的操作。我正在尝试为报告创建一个筛选器,其中如果状态为1100、1200和1400,则会向表中添加一列,以反映字符串“已提交案例”、“待决QC”和“已通过QC”,问题是,由于我的动态sql当前设置为变量@sql作为字符串,我无法将字符串“Case Submitted”、“Pending QC”和“Passed QC”添加到Case语句中Thanks@EmperorDev在代码中使用动态sql也可以,我认为这不是你的问题。你到底犯了什么错误?您能否向我们展示您的代码的其余部分,因为这当然不是全部。@emperdev,您的语句是正确的。您可以通过
print@sql
看到这一点。
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
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