我将在一个巨大的表(+ 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
答案 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}
如果必须更新基于表列的计算值
<强>更新强>
根据编辑2,您的第一个语句是关于更改表名,第二个语句是关于更改模式。它们都不同,与移动数据或更新值无关。在这种情况下,更改架构将是最好的选择
答案 2 :(得分:0)
如果锁定是一个问题,它仍然无论您使用的SQL Server版本是什么。当您删除并重命名时,您也失去了桌面上的所有权利。