0

我想我已经接近这个了,我似乎无法做到这一点。我也浏览了很多问题和答案,要么我找不到答案,要么我不明白其他人的问题,所以如果这是重新发布,请原谅。

就“代替”触发器的想法而言,我想做的似乎非常基本。我在 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;

希望我说得通,而且我离得太远了。谢谢你的帮助。

4

1 回答 1

3

在 MSSQL 触发器中,您有两个伪表: INSERTED(新记录)和 DELETED(旧记录)。您的问题是您试图从 UPDATED 中读取一个值(不存在),而且它们可能是多条记录而不是一条。您应该使用 UPDATE FROM (MSSQL specific) ,即类似

UPDATE MyOtherTable
SET ...
FROM INSERTED INNER JOIN TableToFindPk ON  INSERTED.FK = ...
INNER JOIN MyOtherTable ON ...

没有解释或很少的sql代码很难说更多

于 2012-10-30T22:57:00.033 回答