Sql 创建触发器以将记录从一个表插入到另一个表。表“A”的触发列在表“B”中作为null插入

Sql 创建触发器以将记录从一个表插入到另一个表。表“A”的触发列在表“B”中作为null插入,sql,sql-server,triggers,Sql,Sql Server,Triggers,我有两个表tbl_PurchaseDetails和tbl_ItemDetails。我需要在tbl_PurchaseDetails中插入一些记录到tbl_ItemDetails中,就在它插入tbl_PurchaseDetails之后。tbl_PurchaseDetails具有自动生成的自定义字段PurchaseID 自动生成PurchaseID的代码为:- *这个触发器工作得很好* 我已经为触发器编写了以下代码以插入tbl_ItemDetails:- **现在,当我插入tbl_PurchaseDe

我有两个表tbl_PurchaseDetails和tbl_ItemDetails。我需要在tbl_PurchaseDetails中插入一些记录到tbl_ItemDetails中,就在它插入tbl_PurchaseDetails之后。tbl_PurchaseDetails具有自动生成的自定义字段PurchaseID

自动生成PurchaseID的代码为:- *这个触发器工作得很好*

我已经为触发器编写了以下代码以插入tbl_ItemDetails:-


**现在,当我插入tbl_PurchaseDetails时,记录被成功地添加到tbl_PurchaseDetails和tbl_ItemDetails中。这里的问题是,PurchaseID在tbl_ItemDetails中作为null插入。不过,它按预期插入了tbl_PurchaseDetails中。

根据我的评论,以下是我想要的:

CREATE TABLE PurchaseDetails ( --Why have a tbl_ prefix on every table?
     ID int IDENTITY(1,1) not null,
     PurchaseID as 'P' + CONVERT(VARCHAR(10), ID),
     --Other columns
)
那我就不需要你的第一个触发器和功能了。然后,我可以将第二个触发器重写为:

CREATE TRIGGER trigger_UpdateItemDetails ON PurchaseDetails
FOR INSERT AS
   INSERT INTO ItemDetails(PurchaseID,Quantity,WarehouseID)
   SELECT PurchaseID,ItemQuantity,WarehouseID
   FROM inserted
它处理可能包含多行的插入数据

Re:我在第一段关于tbl_uuux前缀的评论——我认为这不仅增加了冗余信息,还增加了混淆的可能性。在查询中,只有两种类型的对象可以模糊地显示在同一位置,即表和视图。任何其他类型的对象函数、存储过程、列、参数等在使用时都可以通过语法进行区分


而且,尽可能不要或不需要区分表和视图。能够完全更改表,但随后提供与原始表具有相同布局和相同名称的视图,并且不必更改任何其他代码,这是SQL的一大优点。但是,当您不得不将视图命名为tbl_ABC时,感觉有点傻,因为您使用了tbl_作为表的前缀。

为什么不使用已有的函数将PurchaseID作为计算列,或者直接内联并完全删除第一个触发器呢,您的第二个触发器从根本上被破坏了—它假设INSERTEDI中只有一行尝试这样做,但我遇到了问题。如果你能帮我编写一些代码,那就太好了@Damien_不相信,关于第二个触发器,我希望它能像这样工作:Re:第二个触发器,不,你真的没有。无法保证设置变量的3个选项将从插入的同一行中选择列。您可以从3个不同的行获得PurchaseID、ItemQuantity和WarehouseID。非常感谢。它工作得很好。谢谢。关于前缀问题:另一方面,您通常不能插入或更新视图,它们的性能特征可能会有很大的不同,因此在某些情况下,值得强调的是,您的查询并不像看上去那么简单。我仍然认为这样的前缀不值得,但有时你确实想要并且需要区分表和视图。@eamonnerbanne-我有时可能有点关系势利:-
CREATE TABLE PurchaseDetails ( --Why have a tbl_ prefix on every table?
     ID int IDENTITY(1,1) not null,
     PurchaseID as 'P' + CONVERT(VARCHAR(10), ID),
     --Other columns
)
CREATE TRIGGER trigger_UpdateItemDetails ON PurchaseDetails
FOR INSERT AS
   INSERT INTO ItemDetails(PurchaseID,Quantity,WarehouseID)
   SELECT PurchaseID,ItemQuantity,WarehouseID
   FROM inserted