2013-07-08 40 views
-1

更新SQL语句我有一个存储过程调用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

更改为

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 
+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)

+0

感谢您的回答,但我必须使用Acc_DocumentRef作为发票。这就是我在WHERE语句中使用子查询的原因。现在我的问题是通过使用bansi答案来解决的。 –

+0

@Jowie - 我可以知道你为什么必须使用Acc_DocumentRef吗? – hims056

+1

+1 - 为了好的答案。 – Devart

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); 
+0

非常感谢你的详细解释,你让我对这个问题非常清楚。我使用'IN'而不是'='。 –

+0

不客气。 –

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

你的查询也很好。 – hims056