【问题标题】:SQL 2005 Update Column on Insert插入时的 SQL 2005 更新列
【发布时间】:2014-07-18 23:41:15
【问题描述】:

我需要一些帮助来创建存储过程/查询(只要它有效就没有关系),当我插入新行时会发生以下情况。这是一个非常简单的表,有 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. 当我插入一个新行时:查询检查是否有该 ID 具有更高 begin_date 的其他记录(如果有多个具有更高 begin_date 的行无关紧要,我只需要更接近插入的那一个)
  2. 如果有,则将新行的 date_finish 设置为现有行的 date_begin
  3. 如果没有,将新插入的date_finish设置为NULL
  4. 检查是否存在该 ID 的其他记录,其 date_begin 较低,但 date_finish 较高(或 NULL
  5. 如果有,将该记录的 date_finish 更新为新插入的 date_begin 值。

这有意义吗?

我可以在脑海中将这些部分组合在一起,但似乎无法将其编码为 SQL 中的单个查询/存储过程。我将使用 VBA 从 Excel 中插入这些行,以便将其硬编码到 VBA 上的插入查询中。

顺便说一句我想避免触发,因为我过去曾尝试过它们,但它们给我带来了很多麻烦。我对这个 SQL 很陌生。

你能帮帮我吗?

谢谢!

【问题讨论】:

  • @ckuhn203 - 感谢您的意见。尽管您的问题似乎比我的要复杂得多,但它肯定会带来一些启示,我将彻底阅读以继续了解有关 SQL 的更多信息。

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


【解决方案1】:

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

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 发生变化。

【讨论】:

  • 您先生是个好人。太感谢了。您的解决方案正是我所需要的。我将继续根据您的建议修改我的数据库。
猜你喜欢
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多