2013-07-08 39 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