【问题标题】:SELECT INTO with an additional columnSELECT INTO 附加列
【发布时间】:2008-11-11 16:08:11
【问题描述】:

我正在尝试将一个表中的行的副本插入到具有相同架构的另一个表中,并添加一个列(时间戳)以提供 MS Sql Server 2005 中第一个表的“历史记录”。

因此,如果没有附加列,我的查询将是:

"SELECT INTO [WebsiteHistory] FROM [Website]"

我也想填充时间戳列,但不知道如何最好地做到这一点。我想做类似的事情:

"SELECT Website.*, '" + DateTime.Now.ToShortDateString() + "' INTO [WebsiteHistory] FROM [Website]"

但这不应该起作用,特别是如果时间戳列不是最后一个。有没有办法做到这一点?

【问题讨论】:

  • 永远不要含蓄。向表中添加列不应破坏代码,但会破坏您的代码。
  • 最好让这些事情发生在 SQL 服务器上,例如通过 ON UPDATE 触发器。这样你就不用在你的应用程序中打扰了。

标签: .net sql sql-server-2005 tsql


【解决方案1】:

请注意。这行得通,但它既不不错也不值得推荐:

INSERT
  WebsiteHistory
SELECT
  *,
  GETDATE()
FROM
  Website
WHERE
  Id = @WebsiteId

这假设WebsiteHistoryWebsite 具有相同的结构(你说过它有),另外还有一个DATETIME 字段。

这样更好,因为它更安全(以更冗长为代价):

INSERT
  WebsiteHistory
  (
  Id,
  Field1,
  Field2,
  Field3,
  Field4,
  ModifiedDate
  )
SELECT
  Id,
  Field1,
  Field2,
  Field3,
  Field4,
  GETDATE()
FROM
  Website
WHERE
  Id = @WebsiteId

【讨论】:

  • 从什么时候开始变得冗长不好?
  • 创建一个带有默认约束的时间戳列,以便在向表中添加一行时自动填充它不是更好吗?
  • 这将是另一种方式,也许更优雅。但是我需要更详细地解释一些不会使解决方案比现在更正确的东西。
  • 虽然自动填充的时间戳列肯定会起作用,但我对解决这种一般情况的最佳方法(需要复制所有列但有一些任意添加)和我一样感兴趣具体情况(需要时间戳列)。
  • 请停止将其称为时间戳列,在 SQL Server 中,时间戳列不存储日期和时间。这是您需要的日期时间列。是的,在这种情况下,约束将是确保填充数据的最佳方式。
【解决方案2】:

您不能在列上设置一个默认约束,以便在向表中插入行时自动填充时间戳列吗?

【讨论】:

    【解决方案3】:

    查看此问题的公认答案:Dynamically look up column names for a table while in an sql query

    它获取表中所有字段的名称以创建针对该表定制的查询。您应该能够简单地采用完全相同的技术在此处生成正确的字段名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-23
      • 2019-03-14
      • 2015-02-21
      • 1970-01-01
      • 2010-11-23
      • 2011-07-12
      • 2023-02-09
      • 2012-03-13
      相关资源
      最近更新 更多