【问题标题】:SQL Server table trigger not inserting valueSQL Server 表触发器未插入值
【发布时间】:2018-11-15 18:33:09
【问题描述】:

我正在创建一个插入另一个表的后插入表触发器。所有列都按预期工作,但是当涉及到其中包含地理数据的一个特定列 (T_W_A.WorkAreaBuffer) 时,它返回 null,我不明白为什么。当我从触发器中取出 select 语句时,所有列都按预期工作。这是T_W_A.WorkAreaBuffer中存储的信息的副本:

POLYGON((-80.0705872065121 33.0028430262796,-80.0706042845348 33.0027090648411,-80.0706520501637 33.0025804848199,-80.0707286676788 33.0024622274388,-80.0708311926384 33.0023588372123,-80.0709556850437 33.0022742873109,-80.0710973607543 33.0022118268834,-80.0712507753344 33.0021738562025,-80.0714100332675 33.0021618344308,-80.0715690144994 33.0021762235502,-80.071721609607 33.0022164706098,-80.0718619545597 33.002281028973,-80.071984656053 33.0023674177484,-80.0720849987596 33.0024723171218,-80.0721591265326 33.0025916959256,-80.072204190601 33.0027209665457,-80.072218459058 33.0028551612142,-80.0722013834361 33.0029891229132,-80.0721536198053 33.0031177035549,-80.0720770035815 33.0032359618221,-80.0719744790095 33.0033393530653,-80.0718499860293 33.0034239039594,-80.0717083088688 33.0034863652042,-80.0715548921845 33.0035243364028,-80.0713956318132 33.0035363583138,-80.0712366481804 33.0035219689339,-80.0710840510747 33.0034817212538,-80.0709437048309 33.0034171620046,-80.0708210029499 33.0033307722124,-80.0707206608182 33.0032258718464,-80.0706465344951 33.0031064922252,-80.0706014725309 33.0029772210874,-80.0705872065121 33.0028430262796))

这是我要插入的表结构:

CREATE TABLE [dbo].[training_grades]
(
    [Id] [BIGINT],
    [Number] [VARCHAR](24) NULL,
    [FirstTimeScore] INT,
    [prodarea] NVARCHAR(MAX) NULL
)

这是票证结构:

CREATE TABLE [dbo].[Ticket]
    (
        [TicketId] [BIGINT] primary key,
        [Number] [VARCHAR](24) NULL
    )

这是 T_W_A 结构:

CREATE TABLE [dbo].[T_W_A]
        (
            [TicketId] [BIGINT] primary key foreign key,
            [WorkAreaBuffer] [TEXT] NULL
        )

这里是触发器:

CREATE TRIGGER TRG_InsertSyncEmp 
ON Ticket
AFTER INSERT 
AS
BEGIN
    INSERT INTO [dbo].[training_grades]
        SELECT 
            i.TicketId, 
            Number,
            CASE WHEN ia.FirstTime = 1 THEN 1 ELSE 0 END AS FirstTimeScore,
            tw.workareabuffer AS prodarea
        FROM 
            INSERTED i 
        LEFT JOIN 
            itemAtribute ia ON i.TicketId = ia.ItemId
        JOIN 
            T_W_A tw ON i.TicketId = tw.TicketId
END

tw.workareabuffer 是一种文本数据类型,根据我的阅读,您不能使用触发器插入 text 字段。

我的下一步是创建 T_W_A 的视图并将文本字段转换为 nvarchar(max) 类型,但结果是相同的。

这让我相信连接本身有问题,但就像我说的,当我从触发器中取出 select 语句时,它按预期工作。

有什么建议可以隔离问题吗?

【问题讨论】:

  • 我之前发表过同样的评论 - 显然是在你删除的线程上。我无法想象一个名为 ItemAttribute 的表有一个名为 ItemId 的列,它与 Ticket 中的 TicketId 匹配。如果您发布所有 DDL,我们可以验证这一点。两次发布 Ticker 表(使用不同的名称和列)意味着您没有给予足够的关注。
  • 或者,暂时忽略触发器并编写一个查询,对 Ticket 中的特定现有行执行您想要的操作。让它工作,您可以轻松地将其转换为触发器。
  • @SM或者我更新了上一版本的内容,更新时没有人回复,所以我修改,澄清并重新发布。我向你保证 itemid = ticketid。我知道它搞砸了,但就是这样。正如我在问题中所说,当我将 select 语句从触发器中取出时,它会按预期工作。
  • 我的第二条评论仍然有效 - 编写和演示应该是微不足道的。连接就是连接,它们似乎是最基本的。如果您无法编写该查询,请至少发布 complete DDL。这包括您称为 T_W_A 的视图(大概)以及主键和外键约束。实际 DDL - 不是您的伪版本。您不能仅使用文本“外键”来声明外键。

标签: sql-server tsql database-trigger


【解决方案1】:

首先,将TEXT 更改为NVARCHAR(MAX)TEXT 已弃用。

其次,当您添加(从触发器)时,指定列名称。这将帮助您避免将来出现问题。

现在,您可能会得到NULL,因为您在插入T_W_A 表之前插入TICKET 表?当触发器触发时,T_W_A 表中没有数据(我的猜测)。

【讨论】:

  • 我认为您可能正在做某事。不幸的是,我无法更改工作区缓冲区的数据类型。我创建了触发器而不是在插入 T_W_A 表而不是 Ticket 表时触发,但是当我将 workareabuffer 转换为 nvarchar(max) 时,我仍然得到“不能在 'inserted' 和 'deleted' 中使用 text、ntext 或 image 列表”
  • 您有 2 个 TEXT 列。你只改了1?问题可能在那里。你在T_W_A上的触发是什么,在ticket和t_w_A订单上insert的顺序是什么?
  • 不,我将 prodarea 更改为 nvarchar(max) 类型(我更新了问题以反映)。 T_W_A 上的触发与上面的工单触发相同,我只是交换了订单并将工单加入 T_W_A 并在 insert convert(nvarchar(max),i.WorkAreaBuffer) 作为 prodarea
  • 我刚刚创建了表格(我让 TEXT 作为 TEXT)和您的触发器。我对其进行了测试,prodarea 带有值。您能给我们在 t_w_a 和票证表中插入语句以及正确的顺序吗?您使用的是哪个版本的 SQL Server?
  • 嗨,丹,是的,但这与您的回答没有直接关系。我最终要做的是将ticketworkarea 保存在变量中为varchar(max)
猜你喜欢
  • 1970-01-01
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
相关资源
最近更新 更多