使用更新'Where'子句值的SQL Server而不是更新触发器

时间:2012-10-30 21:51:29

标签: sql sql-server triggers

我认为我很接近这一点,我似乎无法做到这一点。我也看了很多问题和答案,要么我找不到答案,要么我不理解别人的问题,如果这是重新发布,请原谅。

我想做的事情看起来非常基本,就像“取而代之”触发器的想法一样。我在SQL Server 2008中工作。我有一个无法直接更新的视图,所以我需要一个替代更新触发器来更新其中一个基础表。问题表中的主键不会作为Update语句的一部分包含在内,因此我必须选择使用外键。

我正在尝试获取Update语句的Where子句中提供的外键,但我必须使用错误的语法。我很确定我必须能够获得'Where'值,因为它们似乎可能被用作底层表的键。所以,鉴于声明......

UPDATE table1 SET field1 = 'value1' WHERE key_field = 'key_value'

如何访问触发器定义中的'key_value'?我试过以下......

DECLARE @pk INT
SELECT @pk = p_key
  FROM dbo.ptable p, UPDATED u
 WHERE p.f_key = u.key_field

这也是......

DECLARE @pk INT
 SELECT @pk = p_key
   FROM dbo.ptable
  WHERE f_key = (SELECT key_field
                   FROM UPDATED)

但这些似乎都不适合我。我很确定我正在使用...

正确获取更新值
DECLARE @uValue VARCHAR
SELECT @uValue = field1
  FROM UPDATED

我希望能够使用派生主键进行插入或更新,如此...

INSERT INTO dbo.xtable (fieldx) VALUES (@uValue) WHERE p_key = @pk;

UPDATE dbo.xtable SET fieldx = @uValue WHERE p_key = @pk;

希望我有意义,我也不会太离谱。谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

在MSSQL触发器中,您有两个伪表:INSERTED(新记录)和DELETED(旧记录)。您的问题是您正在尝试从UPDATED中读取一个值(不存在),而且它们可能是多个记录而不是一个。 您应该使用UPDATE FROM(特定于MSSQL),例如

UPDATE MyOtherTable
SET ...
FROM INSERTED INNER JOIN TableToFindPk ON  INSERTED.FK = ...
INNER JOIN MyOtherTable ON ...
如果没有解释或者很少的SQL代码,很难说更多