Sql server SQL Server表触发器未插入值

Sql server SQL Server表触发器未插入值,sql-server,tsql,database-trigger,Sql Server,Tsql,Database Trigger,我正在创建插入到另一个表中的后插入表触发器。所有列都按预期工作,但当它涉及到一个包含地理数据的特定列(T\u W\u A.WorkAreaBuffer)时,返回空值,我不明白为什么。当我从触发器中取出select语句时,所有列都按预期工作。这是存储在T_W_a.WorkAreaBuffer中的信息副本: POLYGON((-80.0705872065121 33.0028430262796,-80.0706042845348 33.0027090648411,-80.0706520501637

我正在创建插入到另一个表中的后插入表触发器。所有列都按预期工作,但当它涉及到一个包含地理数据的特定列(
T\u W\u A.WorkAreaBuffer
)时,返回空值,我不明白为什么。当我从触发器中取出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
    )
CREATE TABLE [dbo].[T_W_A]
        (
            [TicketId] [BIGINT] primary key foreign key,
            [WorkAreaBuffer] [TEXT] NULL
        )
以下是T_W_A结构:

CREATE TABLE [dbo].[Ticket]
    (
        [TicketId] [BIGINT] primary key,
        [Number] [VARCHAR](24) NULL
    )
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)类型,但结果是相同的

这让我相信join本身有问题,但正如我所说,当我从触发器中取出select语句时,它会按预期工作


有没有隔离问题的建议?

首先,将
文本更改为
NVARCHAR(MAX)
<不推荐使用代码>文本

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


现在,您可能会得到
NULL
,因为您在插入
T\u W\u A
表之前正在插入
TICKET
表?当触发器触发时,
T\u W\u A
表中不存在任何数据(我猜)。

可能与我之前发布的同一条评论重复-显然是您删除的某个线程。我无法想象一个名为ItemAttribute的表有一个名为ItemId的列,该列将与Ticket中的TicketId匹配。如果您发布所有DDL,我们可以验证这一点。发布两次Ticker表(使用不同的名称和列)意味着您没有给予足够的关注。或者,现在忽略触发器,编写一个查询,对Ticket中的特定现有行执行所需操作。让它工作起来,你就可以很容易地把它转换成一个触发器。@SMor我在以前的版本中更新了内容,更新时没有人响应,所以我修改、澄清并重新发布了内容。我向您保证itemid=ticketid。我知道这是一团糟,但事实就是这样。正如我在问题中所说的,当我将select语句从触发器中取出时,它会像预期的那样工作。我的第二条评论仍然有效——并且应该很容易编写和演示。连接是连接,这些连接似乎是最基本的。如果您不能编写该查询,至少要发布完整的DDL。这包括您称为T_W_A的视图(大概)以及主键和外键约束。实际DDL-不是您的伪版本。您不能仅用文本“外键”来声明外键。我想您可能有问题。很遗憾,我无法更改workareabuffer的数据类型。我创建触发器的目的是在插入T_W__A表而不是票证表时触发,但当我将workareabuffer转换为nvarchar(最大值)时,我仍然得到“不能在“插入”和“删除”表中使用文本、ntext或图像列”您有2个文本列。你只换了1块?问题可能就在那里。您在T_W__A上的触发器是什么?在票证上插入和T_W_A的顺序是什么?否,我将prodarea更改为nvarchar(max)类型(我更新了问题以反映)。T_W_A上的触发器与上面的票证触发器相同,我只是交换了顺序,将票证加入T_W_A,并将插入转换(nvarchar(max),I.WorkAreaBuffer)作为prodArea我刚刚创建了表(我将文本作为文本)和触发器。我对它进行了测试,prodarea提供了一些值。您能给我们在t_w_____a和票务表中插入语句,并按正确顺序排列吗?您使用的是哪个版本的SQL Server?嗨,丹,是的,但这与您的答案没有直接关系。我最后要做的是将
ticketworkarea
保存在变量中,作为
varchar(max)