Sql server sql server在插入后触发更新插入行的3个字段,仅适用于特定用户,并且仅当字段为空时 我没有访问INSERT语句,所以如果它们是空的,我不知道空白字段是否是开始语句的一部分。Office用户和Field(tablet)用户使用不同的应用程序插入工单记录。为了避免现场用户必须在每条记录上填写他们的班组名称、主管名称和店铺名称,我将它们放入一个查找表中,该表键入了工单记录(由应用程序自动填充)中的INITIATEDBY字段。办公室工作人员可能为任何人创建工单,但现场工作人员仅为其工作人员创建工单,因此,当现场工作人员插入记录时,我希望为他们填充3个字段。(实际上,他们无法填充这3个字段,因为我已将它们隐藏在他们使用的工单表单上。)

Sql server sql server在插入后触发更新插入行的3个字段,仅适用于特定用户,并且仅当字段为空时 我没有访问INSERT语句,所以如果它们是空的,我不知道空白字段是否是开始语句的一部分。Office用户和Field(tablet)用户使用不同的应用程序插入工单记录。为了避免现场用户必须在每条记录上填写他们的班组名称、主管名称和店铺名称,我将它们放入一个查找表中,该表键入了工单记录(由应用程序自动填充)中的INITIATEDBY字段。办公室工作人员可能为任何人创建工单,但现场工作人员仅为其工作人员创建工单,因此,当现场工作人员插入记录时,我希望为他们填充3个字段。(实际上,他们无法填充这3个字段,因为我已将它们隐藏在他们使用的工单表单上。),sql-server,triggers,Sql Server,Triggers,我自己解决了这个问题。我只需要读足够多的例子就可以把它们放在一起。唯一让我害怕的是IF@EMPName“”。是否有更好的方法检查是否在第二条select语句中检索到记录 CREATE TRIGGER trgUpdateCrewShopSuper ON ESDWO FOR INSERT AS BEGIN DECLARE @ID nvarchar(60), @InitBy nvarchar(50), @EMPName nvarchar(50), @CREW as nvarchar(5

我自己解决了这个问题。我只需要读足够多的例子就可以把它们放在一起。唯一让我害怕的是IF@EMPName“”。是否有更好的方法检查是否在第二条select语句中检索到记录

CREATE TRIGGER trgUpdateCrewShopSuper ON ESDWO
    FOR INSERT
AS
BEGIN
    DECLARE @ID nvarchar(60), @InitBy nvarchar(50), @EMPName nvarchar(50), @CREW as nvarchar(50), @Shop nvarchar(100), @Super nvarchar(50);

select @ID=i.ID, @InitBy=i.INITBY from inserted i;

select @EMPName=EmpName, @CREW=CrewName, @Shop=SHOP, @Super=Supervisor 
    From dbo.TabletUsers 
    WHERE EmpName = @InitBy
IF @EMPName <> ''  
    BEGIN
        update dbo.WorkOrder 
        set Crew = @Crew, SHOP = @Shop, Supervisor = @Super
        WHERE WOID = @ID
    END
END
在ESDWO上创建触发器trgUpdateCrewShopSuper
插入
像
开始
声明@ID nvarchar(60)、@InitBy nvarchar(50)、@EMPName nvarchar(50)、@CREW为nvarchar(50)、@Shop nvarchar(100)、@Super nvarchar(50);
从插入的i中选择@ID=i.ID、@InitBy=i.InitBy;
选择@EMPName=EMPName、@CREW=CrewName、@Shop=Shop、@Super=Supervisor
来自dbo.TabletUsers
其中EmpName=@InitBy
如果@EMPName“”
开始
更新dbo.WorkOrder
设置班组=@Crew,车间=@SHOP,主管=@Super
其中WOID=@ID
终止
终止

您的触发代码需要是基于集合的方法。在你贴出的答案中,你假设只有一行被插入。像这样的东西更符合你的要求

这将是整个触发器的主体

Update w
set Crew = tu.Crew
    , SHOP = tu.Shop
    , Supervisor = tu.Supervisor
from inserted i
join TableUsers tu on tu.EmpName = i.INITBY
join WorkOrder w on i.ID = w.WOID

那么这里的问题是什么?我不知道从哪里开始。我从来没有写过触发器。我懂一点sql,但以前从未做过这么复杂的事情。我知道我需要从插入的数据中获取INITIATEDBY字段来进行查找,如果没有找到记录,我什么也不做。否则,我需要将查找查询中的数据插入到3个字段中。如果更新总是完成的话,我也许可以加入工作,但是条件让我很反感。从你的描述来看,这听起来像是你让这比需要的困难得多。为什么不从前端填充这些值呢。没有什么规定值必须来自可见的用户控件。只需在页面加载时填充它们,并将其隐藏或其他方式。老实说,触发器很少使用(审计就是一个很好的例子)。从长远来看,使用触发器来管理这样的业务规则会给系统带来痛苦。我编辑了我在这里发布的触发器代码以隐藏真实姓名,但错过了一个。Update语句应该更新dbo.ESDWO而不是dbo.workorderhanks Sean,这看起来更像是我希望能够做到的,但我自己从来没有看到足够的例子。仅供参考:现场工作人员正在使用Android原生应用程序(不基于浏览器),因此您关于在页面加载时填充这些字段的建议对我来说是不可能的。您的触发器有一个重大缺陷。它假定将只插入一行。情况并非如此,因为每次操作触发一次。您需要重写update语句,使其基于集合。若要检查select语句是否返回了任何行,应使用@ROWCOUNT。