【问题标题】:SQL - adding new column withouth effecting existing scriptsSQL - 添加新列而不影响现有脚本
【发布时间】:2018-11-01 21:42:17
【问题描述】:

我们在 SQL Server 2008 上有一个表,该表由各种存储过程填充。问题是这些存储过程的作者在代码中使用了一些糟糕的选择,并使用以下语法填充了这个表:

INSERT INTO persistant_table
    SELECT * 
    FROM #temp_table_with_data

基本上,他们会在脚本中创建一个#temp_table_with_data,并且列的顺序和名称与persistant_table 中的相同。

现在我需要在persistant_table 中添加另一列,但如果这样做,我将破坏所有存储过程。

有没有办法让我在不破坏所有存储过程的情况下向该表中添加一列? (从长远来看,我们将更改存储过程)。

谢谢

【问题讨论】:

  • 没有。尽快修复 SP。
  • 没有解决办法。修复 SP。修复 SP 比寻找只会让事情变得更糟的变通方法要好。
  • 您可以创建一个新的持久表,其中包含新列和与原始表相同的主键值。然后,您可以创建一个连接两个表的视图(并为空行提供适当的默认值),它对用户来说是相当透明的。
  • 如何在您的 SP 中创建#temp_table_with_data?如果它是在 SP 执行期间基于persistant_table 创建的,那么两个表上的列应该相等。所以每次你运行SP时,如果你在persistant_table中添加新列,它也会在你运行SP时添加到#temp_table_with_data,对吗?这两个表仍然匹配。这意味着插入语句仍然有效。还是有别的?
  • 为插入语句提供列名,而不是 * 仅使用您要插入的那些特定列。

标签: sql sql-server alter-table


【解决方案1】:

你不能在不影响旧脚本的情况下做到这一点。这就是为什么 'SELECT *' 不是好的做法。您最好创建具有​​明确列名的新脚本,例如 选择第 1 列,第 2 列 ....

【讨论】:

    【解决方案2】:

    “ALTER TABLE”是一条 SQL 语句,允许您对数据库表进行数据类型更改(即更改数据类型以及现有表中的列大小)。

    ALTER TABLE 表名 ALTER COLUMN 列名 NVARCHAR(200)

    【讨论】:

      【解决方案3】:

      不,我认为.select * 将选择所有列并且列号应该匹配。

      我认为将行更改为仅具有特定列或将 select 语句更改为具有列的默认值或 null 然后 * 按顺序存储到列中并不费力。但至少要更改 1 行

      【讨论】:

      • 我确信确实没有任何好的解决方案。我希望有一些我以前不知道的东西。
      • 如果列中有相同的名称,那么我认为您可以使用 sys 列并加入,但仍需要更改代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      相关资源
      最近更新 更多