我有一个名为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会显示以下错误消息:
Msg 512,Level 16,State 1,Line 1
子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。 声明已经终止。
那么,如何编辑上面的存储过程以接受多个值?任何帮助将不胜感激!
答案 0 :(得分: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)
因此,=
运营商不会使用IN
等WHERE a IN (1,2,3)
。{ / p>
答案 1 :(得分: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
答案 2 :(得分: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
答案 3 :(得分:1)
(SELECT Acc_DocumentRef
From Acc_CreditDocuments
WHERE Acc_DocumentNo = @CollectionID)
此查询不仅仅是重新返回值。您需要修改查询,以便它只返回一行。您可以根据自己的要求提出distinct
,top 1
或修改上述查询。
WHERE Acc_DocumentRef IN (SELECT Acc_DocumentRef
From Acc_CreditDocuments
WHERE Acc_DocumentNo = @CollectionID);