插入时的SQL 2005更新列

时间:2014-05-29 12:53:43

标签: sql excel vba sql-server-2005 insert

我需要一些帮助来创建一个存储过程/查询(只要它工作并不重要),当我插入一个新行时会发生以下情况。这是一个非常简单的表,有4列与其他表相关

CREATE TABLE [#loginid_name](
[Login_ID] [int] NOT NULL,
[Login_ID_Name] [varchar](30) COLLATE Latin1_General_CI_AI NOT NULL,
[Date_Begin] [datetime] NOT NULL,
[Date_Finish] [datetime] NULL)
  1. 当我插入一个新行时:查询检查是否有其他具有更高begin_date的ID的记录(如果有多行具有更高的begin_date,则无关紧要,我只需要更接近插入的那一行) )
  2. 如果有,则将新行的date_finish设置为现有行的date_begin
  3. 如果没有,请将新插入的date_finish设置为 NULL
  4. 检查该ID的其他记录是否具有较低的date_begin,但更高(或 NULL )date_finish
  5. 如果有,请将该记录的date_finish更新为新插入的date_begin值。
  6. 这有意义吗?

    我可以将这些内容放在一起,但似乎无法将其编码为SQL中的单个查询/存储过程。我将使用VBA从Excel插入这些行,因此我可以将其硬编码到VBA上的插入查询中。

    BTW 我想避免使用触发器,因为我过去曾经尝试过这些触发器,它们给我带来了很多麻烦。我对这个SQL事情很陌生。

    你能帮助我吗?

    谢谢!

1 个答案:

答案 0 :(得分:2)

我会以不同的方式处理这个问题,因为完成日期基本上是基于同一个表上其他记录的计算字段,我会保留它而不是存储它。所以你可以设置一个类似的视图:

SELECT  Login_ID,
        Login_ID_Name,
        Date_Begin,
        (   SELECT  MIN(Date_Begin)
            FROM    [#loginid_name] AS l2
            WHERE   l2.Login_ID = l.Login_ID
            AND     l2.Date_Begin > l.Date_Begin
        ) AS Date_Finish
FROM    [#loginid_name] AS l;

这样您无需通过VBA或触发器管理Date_Finish列,您只需引用此视图而不是基表并获取结束日期。因此,如果您的Date_Begin在插入后因任何原因而更新,那么您之前记录的Date_Finish将保持同步。考虑到这样的更新,这可能会导致多个记录的date_finish发生变化,这更加简单。