Sql server 执行触发器时,子查询返回的值超过1
我有一个触发器,当另一个表中的字段更改时,它会将一个日志条目添加到一个表中。当一行被更改时它工作,但当多行被重新更改时它会出错。有没有人能解释我要做什么才能让我的触发器在多行更新中也能正常工作 非常感谢, 德里克Sql server 执行触发器时,子查询返回的值超过1,sql-server,Sql Server,我有一个触发器,当另一个表中的字段更改时,它会将一个日志条目添加到一个表中。当一行被更改时它工作,但当多行被重新更改时它会出错。有没有人能解释我要做什么才能让我的触发器在多行更新中也能正常工作 非常感谢, 德里克 当从查询返回多个值并保存在变量中或与where子句中的值进行比较时,会发生此错误 在你的例子中,我认为错误发生在这一行 SET @CompanyID = (SELECT CompanyFK FROM Property WHERE PropertyPK = @PropertyID) 要
当从查询返回多个值并保存在变量中或与where子句中的值进行比较时,会发生此错误 在你的例子中,我认为错误发生在这一行
SET @CompanyID = (SELECT CompanyFK FROM Property WHERE PropertyPK = @PropertyID)
要解决报告的错误,只需在查询中输入TOP 1。示例如下所示:
SET @CompanyID = (SELECT TOP 1 CompanyFK FROM Property WHERE PropertyPK = @PropertyID)
在以下情况下,可能会发生子查询返回超过1个值的错误:
SET @YouVariable = (SELECT ColumnID FROM yourTable WHERE Identity = @SomeValue)
-- if the above query return more than 1 value the same error will be occurred
-- to resolve this problem just put "TOP 1" before ColumnID
SELECT *
FROM OtherTable
WHERE OtherIdentity = ((SELECT ColumnID FROM yourTable
WHERE Identity = @SomeValue))
-- if the above query return more than 1 value the same error will be occurred
-- to resolve this problem just replace "= with IN()". Example give below
SELECT *
FROM OtherTable
WHERE OtherIdentity IN ((SELECT ColumnID FROM yourTable
WHERE Identity = @SomeValue))
插入和删除的虚拟表包含要更新的所有行,因此无法将值提取到单个变量中。触发器已损坏。它假定插入的数据中只有一行。在sql server中,每个操作触发一次激发。要处理这个问题,你需要设置触发器。啊。。所以我的@PropertyID=是个问题,加上最后添加到我的日志将不得不处理多个值。。谢谢你……是的,肖恩,愚蠢的假设。。谢谢:嗨,法拉兹。。在设置@PropertyID=之前它不会出错吗?这只是隐藏了实际的错误。真正的原因是触发器被破坏,因为它总是假定单个记录将受到影响。在这种情况下,标量变量不会削减它,相反,在触发器中也使用基于集合的操作。Derek Jee set CompanyID只能存储单个值。如果您想存储多个记录,您必须声明一个临时变量,如Declare CompanyIDs TABLECONYID intHi Alejandro,谢谢。上述另一评论也提到了同样的情况。奇怪的是,CompanyyFK对于dababase来说是独一无二的,所以可以,但是PropertyID是一个可能存在多个价值的问题。。谢谢你的评论
SET @YouVariable = (SELECT ColumnID FROM yourTable WHERE Identity = @SomeValue)
-- if the above query return more than 1 value the same error will be occurred
-- to resolve this problem just put "TOP 1" before ColumnID
SELECT *
FROM OtherTable
WHERE OtherIdentity = ((SELECT ColumnID FROM yourTable
WHERE Identity = @SomeValue))
-- if the above query return more than 1 value the same error will be occurred
-- to resolve this problem just replace "= with IN()". Example give below
SELECT *
FROM OtherTable
WHERE OtherIdentity IN ((SELECT ColumnID FROM yourTable
WHERE Identity = @SomeValue))