Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如果满足条件,SQL Server将触发在插入另一个表后更新表中的一个值_Sql Server_Triggers_Multiple Tables - Fatal编程技术网

Sql server 如果满足条件,SQL Server将触发在插入另一个表后更新表中的一个值

Sql server 如果满足条件,SQL Server将触发在插入另一个表后更新表中的一个值,sql-server,triggers,multiple-tables,Sql Server,Triggers,Multiple Tables,更新:为了消除一个可能的建议,我将第一个查询保存为视图,并在触发器中替换它。没有观察到行为上的变化。我已更新以下代码以反映新的安排。 我刚刚开始使用SQL Server触发器,并取得了一些成功。我目前正在做的工作让我感到困惑 我正在处理两张桌子。一个是订单标题,另一个包含行项目。触发器正在监视行项目表中插入的新行,如果添加的项目满足某些条件,则更新订单标题表中的值。当我分解查询并单独运行它时,我得到了我期望的结果。包含我正在关注的项目的订单列表 --QUERY WORKS AS EXPECTED

更新:为了消除一个可能的建议,我将第一个查询保存为视图,并在触发器中替换它。没有观察到行为上的变化。我已更新以下代码以反映新的安排。

我刚刚开始使用SQL Server触发器,并取得了一些成功。我目前正在做的工作让我感到困惑

我正在处理两张桌子。一个是订单标题,另一个包含行项目。触发器正在监视行项目表中插入的新行,如果添加的项目满足某些条件,则更新订单标题表中的值。当我分解查询并单独运行它时,我得到了我期望的结果。包含我正在关注的项目的订单列表

--QUERY WORKS AS EXPECTED
SELECT ord_no, cmt_cd_1 
FROM OrderHeader
WHERE ord_no IN
    (SELECT DISTINCT OrderHeader.ord_no
    FROM OrderLine INNER JOIN OrderHeader 
    ON OrderLine.ord_no = OrderHeader.ord_no
    WHERE (OrderLine.item_no LIKE 'A%') OR
          (OrderLine.item_no LIKE 'B%') OR
          (OrderLine.item_no LIKE 'C30%'))
然而,当我尝试在触发器中使用它时,它不起作用

--TRIGGER DOES NOT UPDATE ANY RECORDS
CREATE TRIGGER add_cmt_cd
ON [OrderLine]
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;

    UPDATE OrderHeader
    SET cmt_cd_1 = 'O'
    FROM OrderHeader 
    INNER JOIN inserted ON OrderHeader.ord_no = inserted.ord_no
    WHERE (OrderHeader.ord_no IN (SELECT OrderListView.ord_no
                                  FROM OrderListView))
END
我已经验证了标题记录是首先创建的,并且在创建行项目记录之前确实存在。我在这个表上有另一个触发器工作正常,尽管它更新的值与触发器在同一个表中

--TRIGGER WORKS AS DESIGNED
CREATE TRIGGER add_line_cmt
ON [OrderLine]
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;

    UPDATE OrderLine
    SET cmt_1 = 'Comment 1',
        cmt_2 = 'Comment 2'
    FROM OrderLine 
    INNER JOIN inserted ON inserted.ord_no = OrderLine.ord_no
    WHERE (OrderLine.item_no IN (SELECT CAST(item_no AS CHAR) AS item
                                 FROM ItemTable
                                 WHERE (group = 3)))
END

我已经用头撞桌子三个小时了,我知道我错过了一些简单的事情。我希望在我发疯之前,其他人会发现它。

不要把这件事具体化。改为创建一个视图,该视图选择标题列加上根据订单项目计算的特殊列。你说它不起作用是什么意思?我相信它正在更新,但不是您期望的值,对吗?dbo.POORDHDR_SQL与插入的相同吗?触发器是高度特定于供应商的-因此请添加一个标记以指定您是否正在使用
mysql
postgresql
SQL server
oracle
db2
-或其他完全不同的东西。@Jervs对缺乏细节表示抱歉。它根本不更新任何值。POORDHDR实际上是OrderHeader。我在清理发帖代码时漏掉了一个。