使用子查询更新SQL语句

时间:2013-07-08 05:48:46

标签: sql-server stored-procedures sql-update

我有一个名为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。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。   声明已经终止。

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

4 个答案:

答案 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)因此,=运营商不会使用INWHERE 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)

此查询不仅仅是重新返回值。您需要修改查询,以便它只返回一行。您可以根据自己的要求提出distincttop 1或修改上述查询。

 WHERE Acc_DocumentRef IN (SELECT Acc_DocumentRef 
    From Acc_CreditDocuments 
    WHERE Acc_DocumentNo = @CollectionID);