Sql 从表中更新顶级注册表
我试图用两个主键和多行更新一个表 我从Sql Server收到以下消息: Msg 512,Nível 16,Estado 1,Procedimento TR_GaProTab,Linha 21[Linha de Início do Lote 2] 子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时Sql 从表中更新顶级注册表,sql,sql-server,sql-update,Sql,Sql Server,Sql Update,我试图用两个主键和多行更新一个表 我从Sql Server收到以下消息: Msg 512,Nível 16,Estado 1,Procedimento TR_GaProTab,Linha 21[Linha de Início do Lote 2] 子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时 只需将CTE直接更新为 WITH Query AS ( SELECT TOP 100 * FROM GaProTab WHERE EmpCod = '11111111000
只需将CTE直接更新为
WITH Query AS
(
SELECT TOP 100 *
FROM GaProTab
WHERE EmpCod = '11111111000111'
AND
ProAtv = 1
ORDER BY [WhatEver]
)
UPDATE Query
SET ProAtv = 2;
这里有一个简单的例子。我终于找到了发生的事情。。。 我在这个表上启用了两个触发器,在禁用之后,命令成功运行 谢谢大家。我会把命令放在下面:
select EmpCod, GaProTab.ProCod into #Tmp
from GaProTab , (select top 100 ProCod from GaProTab where EmpCod ='11111111000111')
AS top100
where GaProTab.ProCod = top100.ProCod
and EmpCod = '11111111000111' and ProAtv = 1
update GaProTab SET ProAtv = 2
from GaProTab, #Tmp
AS top100
where GaProTab.ProCod = top100.ProCod
and GaProTab.EmpCod = '11111111000111' and ProAtv = 1
第一,在没有订购人的情况下,不要使用
TOP
。第二,错误信息非常清楚,您的查询返回的行不止一行,而且有很多关于这方面的帖子。这是因为您使用了TOP100
我理解它,但我无法更新包含900多个结果的整个表。我有什么选择?请以格式化文本而不是图像的形式共享示例数据和预期结果。帮助我们帮助你,你的触发器需要一些认真的帮助。在触发器中看到临时表会让我做噩梦。另外,在你的触发器中有top,没有orderby。另外,您应该开始使用ANSI-92样式的联接,它们已经存在了25年多了。另一个危险信号是,如果您必须禁用触发器来更新数据,那么您的触发器中出现了严重错误。这是一个旧数据库,我正在使用它进行测试。我是开发/sql server领域的初学者。我会读你给我的链接。我非常感谢你的回答。非常感谢。
select EmpCod, GaProTab.ProCod into #Tmp
from GaProTab , (select top 100 ProCod from GaProTab where EmpCod ='11111111000111')
AS top100
where GaProTab.ProCod = top100.ProCod
and EmpCod = '11111111000111' and ProAtv = 1
update GaProTab SET ProAtv = 2
from GaProTab, #Tmp
AS top100
where GaProTab.ProCod = top100.ProCod
and GaProTab.EmpCod = '11111111000111' and ProAtv = 1