Sql server 使用子查询更新SQL语句

Sql server 使用子查询更新SQL语句,sql-server,stored-procedures,sql-update,Sql Server,Stored Procedures,Sql Update,我有一个名为Delete\u 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_C

我有一个名为
Delete\u 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,第16级,状态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
改为

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

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

UPDATE Acc_CreditDocuments
Set Acc_Status = 3010001
WHERE Acc_DocumentNo = @CollectionID);
因此,您的整个查询(alter过程)应该如下所示:

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

当您遇到任何错误,如子查询返回的值超过1时…您可能正在执行类似操作:
其中a=(1,2,3)
因此,使用
而不是
=
操作符,在
中使用
类似
其中a在(1,2,3)
您的
中的
位置
并不理想。在这种情况下,您不需要在
WHERE
条件中添加子查询(因为您在子查询中使用的是同一个表)。您可以直接这样做:

UPDATE Acc_CreditDocuments
Set Acc_Status = 3010001
WHERE Acc_DocumentNo = @CollectionID);
因此,您的整个查询(alter过程)应该如下所示:

ALTER PROCEDURE [dbo].[Delete_CreditPayment] (@CollectionID nvarchar(50))
AS
BEGIN
    UPDATE Acc_CreditDocuments
    Set Acc_Status = 3010001
    WHERE Acc_DocumentNo = @CollectionID);
END
当您遇到任何错误,如子查询返回的值超过1时…
您可能正在执行类似操作:
其中a=(1,2,3)
,因此,使用
而不是
=
运算符,如
中的
中的a=(1,2,3)

此查询正在重新运行超过个值。您需要修改查询,使其只返回一行。您可以通过放置
distinct
top 1
或根据需要修改上述查询,如下所示

 WHERE Acc_DocumentRef IN (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);
试试这个-

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
试试这个-

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

谢谢你的回答,但我必须使用Acc_DocumentRef作为发票。这就是我在WHERE语句中使用子查询的原因。现在我的问题用bansi answer解决了。@Jowie-我能知道为什么必须使用
Acc\u DocumentRef
Acc\u DocumentRef
在我的应用程序中是发票号。因此,整个过程就像从表中删除信用付款一样,发票状态将设置为
Open
,参数代码为
3010001
。谢谢您的回答,但我必须使用Acc_DocumentRef作为发票。这就是我在WHERE语句中使用子查询的原因。现在我的问题用bansi answer解决了。@Jowie-我能知道为什么必须使用
Acc\u DocumentRef
Acc\u DocumentRef
在我的应用程序中是发票号。因此,整个过程就像从表中删除信用付款一样,发票状态将设置为
Open
,参数代码为
3010001
。非常感谢您的详细解释,您已将此问题讲得非常清楚。我在
中使用了
,而不是
=
。非常感谢您的详细解释,您让我对这个问题非常清楚。我在
中使用了
,而不是
=