【问题标题】:SQL Server: preserve calculated fields with a SELECT INTOSQL Server:使用 SELECT INTO 保留计算字段
【发布时间】:2010-09-28 17:48:40
【问题描述】:

我公司最近进行了一次数据迁移(在 SQL Server 2005 数据库中),我们注意到使用 SELECT INTO 创建的一些表没有维护原始表的计算字段,而是 SQL Server 创建了具有类型的常规字段由原始计算返回。例如,假设您有这张表:

create table Example (
 id int not null,
 quantity decimal(19,5) not null,
 price decimal(19,5) not null,
 total as price*quantity 
)

在执行 SELECT * INTO Example2 FROM Example 后,您会得到:

create table Example2 (
 id int not null,
 quantity decimal(19,5) not null,
 price decimal(19,5) not null,
 total decimal(38,9) null
)

我修复了它删除坏字段并重新创建它们,但我想知道是否有一种方法可以维护使用 SELECT INTO 创建的表中的计算字段(可能使用一些特殊的 SQL Server 配置或使用替代 SQL命令)。

提前致谢。

【问题讨论】:

    标签: sql-server calculated-columns select-into


    【解决方案1】:

    我的理解是新表是根据记录集中的数据类型创建的。但是,记录集不包含有关如何生成结果值的信息 - 因此计算公式会丢失。 (举个极端的例子,考虑一个包含 GROUP BY 作为 SELECT INTO 源的视图)

    【讨论】:

      【解决方案2】:

      我认为您无法使用 SELECT INTO 执行此操作 - 就像您针对视图进行选择一样,它只是将结果提取到新表中。

      您可能需要先创建包含计算列的表,然后从非计算列的源表中执行常规插入操作。

      【讨论】:

      • 谢谢,我是这么想的,但我想在与老板讨论问题之前获得更多意见。
      【解决方案3】:

      作为一项策略,最好避免使用 SELECT INTO 创建表,尤其是在迁移中。您不仅会丢失计算,还会丢失索引、触发器以及可能的任何默认值或约束。在迁移中,您应该始终编写出要移动的表,包括触发器、索引等。

      【讨论】:

      • 感谢您的提示,我们尚未在该数据库中使用触发器,但丢失索引肯定不好。
      • 虽然您确实会丢失计算和约束对象,但您不会丢失身份或可空性。
      【解决方案4】:

      如果您不想修改 Select Into 语句,另一种方法是删除列(Alter Table Drop Column)并将它们重新创建(Alter Table Add)作为计算列。

      【讨论】:

      猜你喜欢
      • 2012-01-23
      • 2013-05-15
      • 2011-06-16
      • 1970-01-01
      • 2018-05-22
      • 2011-02-18
      • 2013-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多