0

我有一个存储过程Delete_CreditPayment,如下所示:

ALTER PROCEDURE [dbo].[Delete_CreditPayment] (@CollectionID nvarchar(50))
AS
BEGIN
    UPDATE Acc_CreditDocuments
    Set Acc_Status = 3010001
    WHERE Acc_DocumentRef = (SELECT Acc_DocumentRef 
    From Acc_CreditDocuments 
    WHERE Acc_DocumentNo = @CollectionID);
END

它在 SELECT 语句只有一张发票时有效,Acc_DocumentRef但如果它有多个值,Microsoft SQL Server 会显示以下错误消息:

消息 512,级别 16,状态 1,第 1 行
子查询返回超过 1 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。该语句已终止。

那么,如何编辑上面的存储过程以接受多个值?任何帮助都感激不尽!

4

4 回答 4

2

试试这个——

UPDATE a
SET Acc_Status = 3010001
FROM dbo.Acc_CreditDocuments a
WHERE EXISTS(
     SELECT 1 
     FROM dbo.Acc_CreditDocuments b
     WHERE b.Acc_DocumentNo = @CollectionID
          AND a.Acc_DocumentRef = b.Acc_DocumentRef
)

或这个 -

UPDATE dbo.Acc_CreditDocuments
SET Acc_Status = 3010001
WHERE Acc_DocumentNo = @CollectionID
于 2013-07-08T06:01:26.490 回答
2

WHERE的并不理想。在这种情况下,您不需要在WHERE条件中添加子查询(因为您在子查询中使用相同的表)。你可以直接这样做:

UPDATE Acc_CreditDocuments
Set Acc_Status = 3010001
WHERE Acc_DocumentNo = @CollectionID);

所以你的整个查询(改变过程)应该是这样的:

ALTER PROCEDURE [dbo].[Delete_CreditPayment] (@CollectionID nvarchar(50))
AS
BEGIN
    UPDATE Acc_CreditDocuments
    Set Acc_Status = 3010001
    WHERE Acc_DocumentNo = @CollectionID);
END

当你遇到任何错误时,Subquery returned more than 1 value...你可能正在做这样的事情:WHERE a = (1,2,3)所以而不是=运算符使用INlike WHERE a IN (1,2,3)

于 2013-07-08T05:52:32.383 回答
1

改成

ALTER PROCEDURE [dbo].[Delete_CreditPayment] (@CollectionID nvarchar(50))
AS
BEGIN
    UPDATE Acc_CreditDocuments
    Set Acc_Status = 3010001
    WHERE Acc_DocumentRef IN (SELECT Acc_DocumentRef 
    From Acc_CreditDocuments 
    WHERE Acc_DocumentNo = @CollectionID);
END
于 2013-07-08T05:52:12.770 回答
1
(SELECT Acc_DocumentRef 
    From Acc_CreditDocuments 
    WHERE Acc_DocumentNo = @CollectionID)

此查询返回的值超过了值。您需要修改查询,使其仅返回一行。您可以根据您的要求放置或修改上述查询,如下所示distincttop 1

 WHERE Acc_DocumentRef IN (SELECT Acc_DocumentRef 
    From Acc_CreditDocuments 
    WHERE Acc_DocumentNo = @CollectionID);
于 2013-07-08T05:53:15.037 回答