通过sp_rename或ALTER SCHEMA重命名表

时间:2015-06-18 12:50:42

标签: sql sql-server sql-server-2012

我将在一个巨大的表(+ 200Millon记录)上执行表范围更新,所以我将通过SELECT将数据填充到一个单独的表中,而不是删除原始数据并重命名新表。

In one of the articles有人提到最好在临时模式中创建具有相同名称的新表(例如'clone')并将其切换为使用过的表(例如'dbo'),而不是使用具有临时名称的原始模式,并在数据到位后调用sp_rename并删除旧表。

我正在研究这个,但我想不出为什么架构切换比sp_rename更好。任何人都可以找到任何理由,为什么更好地使用第一种或第二种方法?

谢谢!

编辑:我想更新特定列中的值

EDIT2:最后我的问题是,如果我决定创建一个新表来传输数据以供使用的替代方案:

CREATE TABLE dbo.newTable
...
DROP TABLE dbo.originalTable
EXEC sp_rename N'dbo.newTable', N'dbo.originalTable'

OR

CREATE TABLE clone.originalTable
...
DROP TABLE dbo.originalTable
ALTER SCHEMA dbo TRANSFER clone.originalTable

3 个答案:

答案 0 :(得分:3)

顺便说一下,我建议您不要使用SELECT * INTO填充表格。这将在插入过程中为其他所有人锁定源表,这可能需要很长时间。

只是一个建议,请尝试这样做:

SELECT TOP 0 INTO [newTable]
FROM [oldTable]

INSERT INTO [newTable]
SELECT * FROM [oldTable]

顺便说一句,您可以使用sp_rename将表重命名为其他名称。但它不会改变架构。如果您尝试更改架构,它将生成一个错误的表名称。

您可以尝试将表格移动到其他名称。示例如下:

EXEC sp_rename N'oldTable', N'oldTable_Backup'
EXEC sp_rename N'newTable', N'oldTable'

希望这会对你有帮助。

答案 1 :(得分:1)

根据您编辑的答案,最快捷的方法是:

  • 如果必须在列中包含默认值

    ALTER TABLE {TABLENAME} ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE} [WITH VALUES]

然后从表中删除旧列。

ALTER TABLE {TABLENAME} DROP COLUMN {OLD COLUMN}
  • 如果必须更新基于表列的计算值

    1. 禁用要更新的列的索引
    2. 在WHERE子句
    3. 中的列上创建索引
    4. 更新统计信息
    5. 使用WITH(NOLOCK)表提示[如果你的脏读不错]

<强>更新

根据编辑2,您的第一个语句是关于更改表名,第二个语句是关于更改模式。它们都不同,与移动数据或更新值无关。在这种情况下,更改架构将是最好的选择

答案 2 :(得分:0)

如果锁定是一个问题,它仍然无论您使用的SQL Server版本是什么。当您删除并重命名时,您也失去了桌面上的所有权利。