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
。非常感谢您的详细解释,您已将此问题讲得非常清楚。我在
中使用了,而不是=
。非常感谢您的详细解释,您让我对这个问题非常清楚。我在
中使用了,而不是=
。