【问题标题】:SQL fetch is working but not working in triggerSQL fetch 正在工作,但在触发器中不起作用
【发布时间】:2018-11-16 00:41:46
【问题描述】:

我正在尝试创建一个触发器,在创建之前我尝试将其测试为执行内部代码。提取代码本身可以工作,但触发器不起作用。代码如下:

USE [PMIDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[BRK_ÇEKME_KAP_INSERTED]
ON [dbo].[ATMATERIALTRANS]
FOR INSERT
AS BEGIN
    DECLARE @RDATE DATE
    DECLARE @MAKİNE VARCHAR(10)
    DECLARE @OKUTULAN_BARKOD VARCHAR(20)
    DECLARE @MIKTAR INT
    DECLARE @WC_ID INT
SELECT * FROM ATMATERIALTRANS

DECLARE CUR CURSOR 
FOR 

    SELECT TDATE, WORKCENTERS.CODE, ATMATERIALS.BARCODE, ATMATERIALS.AMOUNT, WC_ID  FROM INSERTED T1     
                                LEFT JOIN ATCOMPOSITIONS ON ATCOMPOSITIONS.ID=T1.COMPID
                                LEFT JOIN WORKCENTERS ON WORKCENTERS.ID=T1.WC_ID
                                LEFT JOIN ATMATERIALS ON ATMATERIALS.ID=ATCOMPOSITIONS.MATERIALID
        WHERE T1.COMPID IS NOT NULL AND WORKCENTERS.CODE LIKE 'DD%'

OPEN CUR 
FETCH NEXT FROM CUR INTO @RDATE, @MAKİNE, @OKUTULAN_BARKOD,@MIKTAR, @WC_ID
WHILE @@FETCH_STATUS=0 BEGIN
        INSERT INTO BURAK..ÇEKME_KAP (TARİH,MAKİNE,OKUTULAN_BARKOD,MİKTAR, HAMMADDE_GCKOD)
        VALUES 
        (@RDATE,
        @MAKİNE,
        @OKUTULAN_BARKOD,
        @MIKTAR, 'G')

        UPDATE BURAK..MALKABUL_BARKOD SET BURAK..MALKABUL_BARKOD.KULLANILDI =1 WHERE BURAK..MALKABUL_BARKOD.BARKOD=@OKUTULAN_BARKOD
    FETCH NEXT FROM CUR INTO @RDATE, @MAKİNE, @OKUTULAN_BARKOD,@MIKTAR, @WC_ID      
END
CLOSE CUR
DEALLOCATE CUR
END

【问题讨论】:

  • 您使用的是哪个数据库?
  • 1.光标+触发器是非常反模式的。 2. 你真的不需要可以被常规插入和更新替换的游标, 3. 你真的需要在触发器中使用它吗? 4. 这种味道作为一个错位的业务规则,是不是更适合业务层?
  • 您如何确定它“不工作”?
  • 1.我同意你的观点 2. 我同意你的观点,将尝试不使用 fetch.. 3. 我真的需要触发器,插入时间太重要了,它应该在插入原始表的同时在其他一些 undependend 之前完成查询已完成。

标签: sql-server tsql sql-insert database-trigger


【解决方案1】:
  1. 您似乎正在尝试创建一个触发器以将结果集返回给应用程序,应该避免这种情况。
    1. 这个SQL语句看起来,根本不需要游标。这可以通过一个简单的 DML 语句来实现。

在编写触发器以通过触发器将结果返回给应用程序之前,请参考以下语句。

“当触发器触发时,结果将返回到调用应用程序,就像存储过程一样。为防止由于触发器触发而将结果返回到应用程序,请不要包含返回结果的 SELECT 语句或在触发器中执行变量赋值的语句。触发器包含向用户返回结果的 SELECT 语句或执行变量赋值的语句需要特殊处理;这些返回的结果必须写入每个应用程序中,其中修改了触发器表是允许的。如果必须在触发器中进行变量赋值,请在触发器开始时使用 SET NOCOUNT 语句以防止返回任何结果集。"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多