我对这个存储过程有问题。当用户选择“是”时,它应该做它在if语句中为"Yes“说的话,但是它不做任何事情,它不会将任何东西插入到数据库中。在“不”的情况下,它工作得很好。你能告诉我什么不管用吗?
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发布于 2020-05-12 13:47:28
发布于 2020-05-13 03:20:18
相反,您应该将它更改为:如果“批准为空”或“批准为空”,则应将其改为.
通过这种方式,您将能够计算@审批是空字符串还是空字符串,因为您的参数是varchar(5),然后您也可以在某个时候接收空字符串。
发布于 2020-05-13 18:10:54
除了使用正确的表格
@approval is Null 正如戴维·布朗和蒙特罗恩以及蒂博尔·卡拉西在评论中所建议的那样:
在有注释的地方(问题在这里),检查@变量= NULL,这将始终计算为未知,这反过来将被视为FALSE.Since您和其他两个变量,这是假的,那么整个条件都是假的。
我已经看过这个,并能看到另一个可能的问题。
存储过程有一个IF语句,根据参数的值,这将导致运行两个不同的select语句之一。
问题在于,当存储过程第一次执行时,将使用两个select语句中的一个来缓存执行计划。这样做的结果是,如果另一个select语句随后需要在另一个执行下运行,则将使用错误的执行计划。
如果将存储过程标记为重新编译(或使用选项重新编译或未知优化),则可以确认存储过程(无论是从ssms还是从应用程序)的执行时间要短得多。
但是,一个更好的长期解决方案是通过将IF语句的两个分支移动到单独的存储过程中来修改存储过程。
例如:
IF CHARINDEX('%',@strPostalCode) = 0
BEGIN
insert into @cs EXEC @new_procedure_1
END
ELSE
insert into @cs EXEC @new_procedure_2
END这样做的好处是,两个新过程中的每一个都有自己的执行计划。
希望这是有用的人,我有过一些问题与此在过去。
https://dba.stackexchange.com/questions/267014
复制相似问题