执行存储过程不起作用,但在存储过程中工作的单个语句
Posted
技术标签:
【中文标题】执行存储过程不起作用,但在存储过程中工作的单个语句【英文标题】:Executing stored procedure not working but individual statements working in stored procedure 【发布时间】:2016-07-25 20:26:22 【问题描述】:我正在尝试执行以下存储过程。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[usp_Create]
(
@OriginatingTransactionID VARCHAR(50),
@AssociatedOriginatingTransactionID VARCHAR(50),
@LineOfBusiness VARCHAR(50),
@RiskState VARCHAR(50),
@OccupationCode VARCHAR(50),
@SourceSystem VARCHAR(50),
@DocumentCategory VARCHAR(50),
@DocumentType VARCHAR(50),
@TransactionFlow VARCHAR(50),
@BundleName VARCHAR(50),
@DocumentID VARCHAR(50),
@DocumentName VARCHAR(50),
@PolicyOrClaimNumber VARCHAR(50),
@EffectiveOrCreationDate DATETIME,
@SignatureDetect BIT
)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @FinalDate DATETIME, @RuleID VARCHAR(50),
@RuleName VARCHAR(50), @CurrentActionID INT,
@BundleTransactionID INT
IF (@SignatureDetect = 'true')
BEGIN
IF (@OriginatingTransactionID = @AssociatedOriginatingTransactionID)
BEGIN
IF NOT EXISTS (SELECT t.Doc_Checklist_TXN_ID FROM (SELECT bundlechecklist.Bundle_TXN_ID, documentchecklist.Doc_Checklist_TXN_ID, documentchecklist.Doc_Type_Name FROM ecm.bundle_checklist_txn bundlechecklist
LEFT OUTER JOIN [ECM].[Document_Checklist_TXN] documentchecklist ON documentchecklist.Bundle_TXN_ID = bundlechecklist.Bundle_TXN_ID
WHERE bundlechecklist.originating_tran_id = @OriginatingTransactionID AND bundle_name = @BundleName)t WHERE t.Doc_Checklist_TXN_ID is not null )
BEGIN
UPDATE ecm.bundle_checklist_txn
SET Bundle_Status_Code = 'COMP'
FROM ecm.bundle_checklist_txn bundlechecklist
INNER JOIN (SELECT DISTINCT Bundle_TXN_ID,Document_ID FROM ecm.Document_Checklist_TXN documentchecklist
WHERE Doc_Status_Code='COMP') COMP
ON COMP.Bundle_TXN_ID = bundlechecklist.Bundle_TXN_ID
AND COMP.Bundle_TXN_ID NOT IN (
SELECT Bundle_TXN_ID FROM ecm.Document_Checklist_TXN documentchecklist
WHERE documentchecklist.Bundle_TXN_ID=COMP.Bundle_TXN_ID AND documentchecklist.Doc_Status_Code<>'COMP')
AND COMP.Document_ID=@DocumentID
WHERE bundlechecklist.Bundle_TXN_ID= @OriginatingTransactionID
AND bundlechecklist.Assoc_Orig_Tran_ID=@AssociatedOriginatingTransactionID
UPDATE associatedtransaction
SET Assoc_Orig_Status_Code='COMP'
FROM [ECM].[Assoc_Orig_Tran_TXN] associatedtransaction
INNER JOIN (SELECT DISTINCT Assoc_Orig_Tran_ID from [ECM].[Bundle_Checklist_TXN] bundlechecklist
WHERE bundlechecklist.[Bundle_Status_Code]='COMP')COMP
ON COMP.Assoc_Orig_Tran_ID=associatedtransaction.Assoc_Orig_Tran_ID
WHERE COMP.Assoc_Orig_Tran_ID=@AssociatedOriginatingTransactionID
END
END
END
ELSE
BEGIN
IF (@OriginatingTransactionID = @AssociatedOriginatingTransactionID)
BEGIN
SELECT @FinalDate =DATEADD(DAY,Number_Of_Days_Till_Next_Action,@EffectiveOrCreationDate),@RuleID= rule1.Action_Rule_ID,@RuleName=rule1.Action_Rule_Name,@currentActionID=rule1.Current_Action_ID FROM ecm.Action_Rule rule1
INNER JOIN ecm.Action_Rule_Group rulegroup ON rulegroup.Action_Rule_Group_ID = rule1.Action_Rule_Group_ID
INNER JOIN ref.Line_of_Business lob ON lob.Line_of_Business_Code = rulegroup.Line_of_Business_Code
INNER JOIN ref.State state ON state.State_Alpha_Code=rulegroup.State_Alpha_Code
INNER JOIN ref.Source_System sourcesystem ON sourcesystem.Source_System_ID = rulegroup.Source_System_ID
INNER JOIN ecm.[Document Catgeory] documentcategory ON documentcategory.Doc_Categ_ID = rulegroup.Doc_Categ_ID
INNER JOIN ecm.[Document Type] documenttype ON documenttype.Doc_Type_ID=rule1.Doc_Type_ID
INNER JOIN ecm.Exec_Acct_Group occupationgroup ON occupationgroup.Exec_Acct_Grp_ID = rulegroup.Exec_Acct_Grp_ID
INNER JOIN [ECM].[Bundle] bundle ON bundle.Bundle_ID = rule1.Bundle_ID
WHERE
bundle.Bundle_Name = @BundleName
AND rulegroup.Line_of_Business_Code=@LineOfBusiness
AND rulegroup.State_Alpha_Code=@RiskState
AND documentcategory.Doc_Categ_Name=@DocumentCategory
AND rulegroup.Exec_Acct_Grp_ID=@OccupationCode
AND rule1.Transaction_Flow=@TransactionFlow
AND sourcesystem.Source_System_Name = @SourceSystem
AND rulegroup.Doc_Categ_ID=documentcategory.Doc_Categ_ID
AND documenttype.Doc_Type_Name =@DocumentType
IF NOT EXISTS (SELECT Assoc_Orig_Tran_ID FROM [ECM].[Assoc_Orig_Tran_TXN] WHERE Assoc_Orig_Tran_ID=@AssociatedOriginatingTransactionID)
BEGIN
INSERT INTO [ECM].[ASsoc_Orig_Tran_TXN]
(Orig_Tran_Action_Rule_id, Assoc_Orig_Tran_ID, Assoc_Orig_Status_Code, First_Rule_Date, Final_Actionable_Date, Folder_ID,CREATED_DTM,CREATE_PROCESSNAME,UPDATE_DTM,UPDATE_PROCESSNAME)
VALUES
(@RuleID,@AssociatedOriginatingTransactionID, 'PEND', @EffectiveOrCreationDate, @FinalDate,NULL,GETDATE(),CURRENT_USER,GETDATE(),CURRENT_USER)
END
IF NOT EXISTS (SELECT originating_tran_id FROM ecm.bundle_checklist_txn WHERE originating_tran_id = @OriginatingTransactionID AND bundle_name = @BundleName)
BEGIN
INSERT INTO [ECM].[Bundle_Checklist_TXN]
( Bundle_Action_Rule_ID,Bundle_Name,Bundle_Status_Code,ASsoc_Orig_Tran_ID,Originating_Tran_ID,Doc_Categ_Name, Next_Action_Dt,CREATED_DTM,CREATE_PROCESSNAME,UPDATE_DTM,UPDATE_PROCESSNAME)
VALUES
(@RuleID,@BundleName,'PEND',@AssociatedOriginatingTransactionID,@OriginatingTransactionID,@DocumentCategory,@FinalDate,GETDATE(),CURRENT_USER,GETDATE(),CURRENT_USER)
END
IF NOT EXISTS (SELECT t.Doc_Checklist_TXN_ID FROM (SELECT bundlechecklist.Bundle_TXN_ID, documentchecklist.Doc_Checklist_TXN_ID, documentchecklist.Doc_Type_Name FROM ecm.bundle_checklist_txn bundlechecklist
LEFT OUTER JOIN [ECM].[Document_Checklist_TXN] documentchecklist ON documentchecklist.Bundle_TXN_ID = bundlechecklist.Bundle_TXN_ID
WHERE bundlechecklist.originating_tran_id = @OriginatingTransactionID AND bundle_name = @BundleName)t WHERE t.Doc_Checklist_TXN_ID is not null )
BEGIN
SELECT @BundleTransactionID=bundlechecklist.bundle_txn_id FROM [ECM].[Bundle_Checklist_TXN] bundlechecklist
INSERT INTO [ECM].[Document_Checklist_TXN]
(bundle_txn_id, document_action_rule_id, action_rule_name, doc_type_name, cp_document_name, document_id, doc_status_code,CREATED_DTM,CREATE_PROCESSNAME,UPDATE_DTM,UPDATE_PROCESSNAME)
VALUES
(@BundleTransactionID, @RuleID, @RuleName, @DocumentType, @DocumentName, @DocumentID, 'PEND',GETDATE(),CURRENT_USER,GETDATE(),CURRENT_USER)
END
END
END
END
在我的代码中,如果我使用值执行,它不起作用并且插入失败 出现以下错误:
消息 515,级别 16,状态 2,过程 usp_CreateChecklist,第 95 行 无法将值 NULL 插入“Orig_Tran_Action_Rule_id”列, 表'EIC_ECM_Checklist.ECM.Assoc_Orig_Tran_TXN';列不 允许空值。插入失败。声明已终止。
消息 515,级别 16,状态 2,过程 usp_CreateChecklist,第 104 行 无法将值 NULL 插入“Bundle_Action_Rule_ID”列, 表'EIC_ECM_Checklist.ECM.Bundle_Checklist_TXN';列不 允许空值。插入失败。声明已终止。
消息 515,级别 16,状态 2,过程 usp_CreateChecklist,第 117 行 无法将值 NULL 插入“Document_Action_Rule_ID”列, 表'EIC_ECM_Checklist.ECM.Document_Checklist_TXN';列不 允许空值。插入失败。声明已终止。
但是,如果我单独执行每一行及其工作以及存储在表中的所有值。所有插入语句都有效。尝试使用单独的语句进行调试。如下:
SELECT
DATEADD(DAY, Number_Of_Days_Till_Next_Action, '2015-10-18T00:00:00'),
rule1.Action_Rule_ID, rule1.Action_Rule_Name,
rule1.Current_Action_ID
FROM
ecm.Action_Rule rule1
INNER JOIN
ecm.Action_Rule_Group rulegroup ON rulegroup.Action_Rule_Group_ID = rule1.Action_Rule_Group_ID
INNER JOIN
ref.Line_of_Business lob ON lob.Line_of_Business_Code = rulegroup.Line_of_Business_Code
INNER JOIN
ref.State state ON state.State_Alpha_Code=rulegroup.State_Alpha_Code
INNER JOIN
ref.Source_System sourcesystem ON sourcesystem.Source_System_ID = rulegroup.Source_System_ID
INNER JOIN
ecm.[Document Catgeory] documentcategory ON documentcategory.Doc_Categ_ID = rulegroup.Doc_Categ_ID
INNER JOIN ecm.[Document Type] documenttype ON documenttype.Doc_Type_ID=rule1.Doc_Type_ID
INNER JOIN ecm.Exec_Acct_Group occupationgroup ON occupationgroup.Exec_Acct_Grp_ID = rulegroup.Exec_Acct_Grp_ID
INNER JOIN [ECM].[Bundle] bundle ON bundle.Bundle_ID = rule1.Bundle_ID
WHERE
bundle.Bundle_Name = 'Auto'
AND rulegroup.Line_of_Business_Code='A'
AND rulegroup.State_Alpha_Code='FL'
AND documentcategory.Doc_Categ_Name=' review'
AND rulegroup.Exec_Acct_Grp_ID=2
AND rule1.Transaction_Flow='Outgoing doc'
AND sourcesystem.Source_System_Name = 'V4 Policy'
AND rulegroup.Doc_Categ_ID=documentcategory.Doc_Categ_ID
AND documenttype.Doc_Type_Name ='Application'
SELECT Assoc_Orig_Tran_ID FROM [ECM].[Assoc_Orig_Tran_TXN] WHERE Assoc_Orig_Tran_ID='BPA201607131452113541050525A1REN'
INSERT INTO [ECM].[ASsoc_Orig_Tran_TXN]
(Orig_Tran_Action_Rule_id, ASsoc_Orig_Tran_ID, ASsoc_Orig_Status_Code, First_Rule_Date, Final_Actionable_Date, Folder_ID,CREATED_DTM,CREATE_PROCESSNAME,UPDATE_DTM,UPDATE_PROCESSNAME)
VALUES
('157','BPA201607131452113541050525A1REN', 'PEND','2015-10-18T00:00:00' , '2015-11-07 00:00:00.000',NULL,GETDATE(),CURRENT_USER,GETDATE(),CURRENT_USER)
SELECT originating_tran_id FROM ecm.bundle_checklist_txn WHERE originating_tran_id = 'BPA201607131452113541050525A1REN' AND bundle_name = 'Auto'
INSERT INTO [ECM].[Bundle_Checklist_TXN]
( Bundle_Action_Rule_ID,Bundle_Name,Bundle_Status_Code,ASsoc_Orig_Tran_ID,Originating_Tran_ID,Doc_Categ_Name, Next_Action_Dt,CREATED_DTM,CREATE_PROCESSNAME,UPDATE_DTM,UPDATE_PROCESSNAME)
VALUES
('157','Auto','PEND','BPA201607131452113541050525A1REN','BPA201607131452113545050525A1AMD','Underwriting review','2015-11-07 00:00:00.000',GETDATE(),CURRENT_USER,GETDATE(),CURRENT_USER)
declare @BundleTransactionID int
SELECT @BundleTransactionID=bundlechecklist.bundle_txn_id FROM [ECM].[Bundle_Checklist_TXN] bundlechecklist
INSERT INTO [ECM].[Document_Checklist_TXN]
(bundle_txn_id, document_action_rule_id, action_rule_name, doc_type_name, cp_document_name, document_id, doc_status_code,CREATED_DTM,CREATE_PROCESSNAME,UPDATE_DTM,UPDATE_PROCESSNAME)
VALUES
(@BundleTransactionID, '157', 'FL Application', 'Application', 'CPLProp_Acknowledgment_FAQs', '321Z01W_007624ZRM00002G', 'PEND',GETDATE(),CURRENT_USER,GETDATE(),CURRENT_USER)
知道失败的地方吗?
【问题讨论】:
好吧,你可以先向我们展示你是如何执行那个 sp 将其粘贴到 ssms 中,按 f5,双击错误,这应该会将您带到发生错误的行.. 有错误提示吗? 添加问题 看起来,你的变量没有被设置。我会说您需要检查您的逻辑,并将其添加到您的调试工作中。也许在你的过程中放一些打印语句来确定你的 if-thens 在做什么。此外,在使用 select 语句设置变量时,您应该确定 where 子句只会选择一行。 【参考方案1】:第一个错误表示您正在尝试将空值插入Orig_Tran_Action_Rule_id
,但此字段为NOT NULL
,因此您无法插入数据。
INSERT INTO [ECM].[ASsoc_Orig_Tran_TXN]
(Orig_Tran_Action_Rule_id, Assoc_Orig_Tran_ID, Assoc_Orig_Status_Code, First_Rule_Date, Final_Actionable_Date, Folder_ID,CREATED_DTM,CREATE_PROCESSNAME,UPDATE_DTM,UPDATE_PROCESSNAME)
VALUES
(@RuleID,@AssociatedOriginatingTransactionID, 'PEND', @EffectiveOrCreationDate, @FinalDate,NULL,GETDATE(),CURRENT_USER,GETDATE(),CURRENT_USER)
请查看@RuleID
。
另外两个也是同样的问题。
您是对的,当您插入个人时,您提供的是值('157')而不是变量(@RuleID)。 所以它工作正常。
【讨论】:
SELECT @FinalDate =DATEADD(DAY,Number_Of_Days_Till_Next_Action,@EffectiveOrCreationDate),@RuleID= rule1.Action_Rule_ID,@RuleName=rule1.Action_Rule_Name,@currentActionID=rule1.Current_Action_ID FROM ecm.Action_Rule rule1 这部分没有被分配。但是,如果我检查没有变量它的工作。但我希望将其分配给变量以供以后在过程中使用。 您还有问题吗? 做一件事,在你的 SELECT 语句之前写下下面的行,然后检查。SET @EffectiveOrCreationDate = GETDATE();
以上是关于执行存储过程不起作用,但在存储过程中工作的单个语句的主要内容,如果未能解决你的问题,请参考以下文章
Informix:如何将单个参数中的多个值传递、使用和执行到存储过程