2012-05-21 43 views
1

我试图编写一个触发器来处理following problem。我试图从插入的表中取出所需的变量,将它与另一个表中的数据结合起来,并将它作为一个插入到所需的表中(我知道这是一种模糊/混乱,忍受着我......)插入语句+组合表格数据和变量触发器

这是我希望数据库的工作:

三个表在数据库中:

  1. 表的用户:
    的用户信息的表,包括:一个识别号码
  2. 表PlaneGPSCoordinates :
    实时GPS坐标表。这个表的大小从来没有变化,值只是更新。
  3. 表匹配信息:
    一个表有两列,用户ID号和平面坐标。

触发应做到以下几点:

  1. 新插入表“用户”行(即用户注册)
  2. 触发自动拷贝PlaneGPSCoordinates的数据(不包括关键列)和新的用户ID号码,并将两者插入到Table MatchingInformation中。每5行坐标将有1个用户ID号 - >即,触发器将向MatchingInformation添加5行,其中userID =新的用户ID和坐标全部从表PlaneGPSCoordinates复制。

目前,我的不完整的代码如下所示:

CREATE TRIGGER dbo.Matching 
ON dbo.UserInfo 
FOR INSERT 
AS 

DECLARE @userID as INT 

BEGIN 
SET NOCOUNT ON; 

SELECT @userID = inserted.ID FROM inserted 

INSERT.... 

END 
GO 

我很新的SQL,所以最坏的假设。我不知道现在如何创建INSERT语句,它在哪里拉动GPS坐标,并将其与用户ID结合起来,将其推送到匹配表...

任何帮助都非常感谢!

+1

触发器对行集进行操作。您的代码预计一次只能插入一行:'SELECT @userID = inserted.IF FROM inserted'。 – HABO

回答

1

您不能像触发一次处理一行那样对待触发器。如果插入使用多值子句或嵌套选择,触发器将为整个操作触发一次,这意味着您将只处理一个任意的@UserID。

这里我假设你的PlaneGPSCoordinates表有5行,并且这些都是每个新用户获得的坐标。

CREATE TRIGGER dbo.Matching 
ON dbo.UserInfo 
FOR INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    INSERT dbo.MatchingInformation(GPS1, GPS2, UserID) 
    SELECT p.GPS1, p.GPS2, i.UserID 
     FROM dbo.PlaneGPSCoordinates AS p 
     CROSS JOIN inserted AS i; 
END 
GO 

但是,这引出了一个问题,为什么同样的坐标复制为每个用户?这是他们经常更新的东西,你只是想在那里设置一些默认值?

+0

太棒了,你是个传奇人物。现在就把这个,再次感谢 – keynesiancross

+0

,我可以确认它的工作原理,再次感谢 – keynesiancross