首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IF语句问题

IF语句问题
EN

Database Administration用户
提问于 2020-05-12 13:43:08
回答 3查看 323关注 0票数 0

我对这个存储过程有问题。当用户选择“是”时,它应该做它在if语句中为"Yes“说的话,但是它不做任何事情,它不会将任何东西插入到数据库中。在“不”的情况下,它工作得很好。你能告诉我什么不管用吗?

代码语言:javascript
复制
ALTER PROCEDURE [dbo].[sp_ff_Insert_ProjectApproved]
(

        @project_no varchar(6)
       ,@sequence_no int
       ,@grant_programme varchar(2)
       ,@jobs_approved int
       ,@grant_amount int
       ,@Committee varchar(4)
       ,@Meeting_no int
       ,@Minute_Item int
       ,@jobs_maintained int
       ,@approval_date date
       ,@approval_by int
       ,@comments varchar(1600)
       ,@created_by int
       ,@created_date datetime
       ,@updated_by int
       ,@updated_date datetime
       ,@approval varchar(5)
       ,@ratify varchar(3)




       --,@research_type varchar(1)='T'
)

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from


DECLARE @ReturnValue int,
        @post_approval_status varchar(3),
        @approval_status varchar(3),
        @current_status varchar(3)  

set @current_status = ( SELECT approval_status from approval_master_tbl
         WHERE project_no = @project_no
        AND sequence_no = @sequence_no -1)

    if @approval = 'No' and @sequence_no = 1 
    begin 
        set @Approval_Status = 'DRA'
        set @post_approval_status = NULL
    end

    else if   @approval = 'No' and @sequence_no > 1 
    begin 
       set @Approval_Status = 'DRA'
       set @post_approval_status = ''
    end


    else if @approval = 'Yes' and @sequence_no > 1 and @current_status = 'DRA' 
    begin 
       set @Approval_Status = 'APP'
       set @post_approval_status = ''
    end
--ISSUE IS HERE!!!!
    else if @approval = Null and @sequence_no > 1 and @current_status = 'DRA' 
    begin 
       set @Approval_Status = 'APP'
       set @post_approval_status = ''
    end

    else if @approval = 'No' and @sequence_no > 1 and @current_status = 'APP'

    begin  
        set @Approval_Status = 'APP'
        set @post_approval_status = '' 
    end

    else if @ratify = 'YES' and @sequence_no > 1 and @current_status = 'APP'

    begin   
       set @Approval_Status = 'APP'
       set @post_approval_status = 'ARF'        
    end

    else if @approval = 'No' and @sequence_no > 1 and @current_status = 'APP' AND @post_approval_status = 'ARF'
    begin       

        set @Approval_Status = 'HIS'
        set @post_approval_status = 'ARF'                       
    end

    else if @approval = 'YES' and @sequence_no > 1 and @current_status = 'HIS' 
    begin 

       set @Approval_Status = 'HIS'
       set @post_approval_status = ''
    end
    else if @ratify = 'YES' and @sequence_no > 1 and @current_status = 'HIS' 
    begin  
       set @Approval_Status = 'APP'
       set @post_approval_status = 'ARF'
    end
SET NOCOUNT ON




    BEGIN TRANSACTION



    INSERT INTO [dbo].[approval_master_tbl]
           ([project_no]
           ,[sequence_no]
           ,[grant_programme]
           ,[jobs_approved]
           ,[approval_status]
           ,[committee]
           ,[meeting_no]
           ,[minute_item]
           ,[jobs_maintained]
           ,[comments]
           ,[approval_date]
           ,[approved_by]
           ,[post_approval_status]
           ,[create_date]
           ,[create_by]
           ,[update_date]
           ,[update_by]       
           )
     VALUES(
            @project_no
            ,@sequence_no 
            ,@grant_programme
            ,@jobs_approved
            ,@approval_status 
            ,@committee
            ,@meeting_no
            ,@minute_item
            ,@jobs_maintained
            ,@comments
            ,@approval_date
            ,@approval_by
            ,@post_approval_status
            ,@created_date
            ,@created_by
            ,@updated_date
            ,@updated_by)

--Update previous Approval status

IF @sequence_no > 1 

UPDATE approval_master_tbl
        SET approval_status = @post_approval_status
  WHERE project_no = @project_no
        AND sequence_no = @sequence_no - 1




--Update Project Status in project Table

    if @approval = 'YES' 

        UPDATE PROJECT_TBL
             SET    PROJECT_STATUS = 'YET'
                    ,DATE_FIRST_APPROVED = @approval_date
                    ,actual_jobs_approved = @jobs_approved 
                    ,actual_amt_approved = @grant_amount 
        WHERE PROJECT_TBL.project_no = @project_no 



            COMMIT TRAN
             SET @ReturnValue = 0


             END TRY

    BEGIN CATCH

           IF @@ERROR <> 0 
                BEGIN
                    ROLLBACK TRAN
                    DECLARE @ErrorMessage NVARCHAR(4000)=ERROR_MESSAGE()
                    DECLARE @ErrorSeverity INT = ERROR_SEVERITY()
                    DECLARE @ErrorState INT = ERROR_STATE()

                    RAISERROR (@ErrorMessage,  
                               @ErrorSeverity,   
                               @ErrorState
                               );
                    SET @ReturnValue = 1
                    SET @ErrorMessage=ERROR_MESSAGE();
                    SELECT ERROR_MESSAGE() as ErrorMessage;
                END
        END CATCH           
    RETURN @ReturnValue         
END
EN

回答 3

Database Administration用户

发布于 2020-05-12 13:47:28

代码语言:javascript
复制
@approval = Null

从不计算为真,它计算为未知。见空未知

应该是

代码语言:javascript
复制
@approval is Null 
票数 6
EN

Database Administration用户

发布于 2020-05-13 03:20:18

相反,您应该将它更改为:如果“批准为空”或“批准为空”,则应将其改为.

通过这种方式,您将能够计算@审批是空字符串还是空字符串,因为您的参数是varchar(5),然后您也可以在某个时候接收空字符串。

票数 0
EN

Database Administration用户

发布于 2020-05-13 18:10:54

除了使用正确的表格

代码语言:javascript
复制
@approval is Null 

正如戴维·布朗蒙特罗恩以及蒂博尔·卡拉西在评论中所建议的那样:

在有注释的地方(问题在这里),检查@变量= NULL,这将始终计算为未知,这反过来将被视为FALSE.Since您和其他两个变量,这是假的,那么整个条件都是假的。

我已经看过这个,并能看到另一个可能的问题。

存储过程有一个IF语句,根据参数的值,这将导致运行两个不同的select语句之一。

问题在于,当存储过程第一次执行时,将使用两个select语句中的一个来缓存执行计划。这样做的结果是,如果另一个select语句随后需要在另一个执行下运行,则将使用错误的执行计划。

如果将存储过程标记为重新编译(或使用选项重新编译未知优化),则可以确认存储过程(无论是从ssms还是从应用程序)的执行时间要短得多。

但是,一个更好的长期解决方案是通过将IF语句的两个分支移动到单独的存储过程中来修改存储过程。

例如:

代码语言:javascript
复制
IF CHARINDEX('%',@strPostalCode) = 0
BEGIN
insert into @cs EXEC @new_procedure_1
END
ELSE
       insert into @cs EXEC @new_procedure_2
END

这样做的好处是,两个新过程中的每一个都有自己的执行计划

希望这是有用的人,我有过一些问题与此在过去。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/267014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档