这只是一个简单的问题。这与在表设计器中更改表的问题相同。我认为你已经改变了你的表格设计中需要放下并重新创建表格的列,以便让列在同一位置排序。
这是一个简短的例子。以下列表格设计为:
CREATE TABLE dbo.Test(
id int identity(1,1),
firstname nvarchar(100),
name nvarchar(100),
street nvarchar(100)
)
这将按指定顺序创建列。你可以在这里看到这个命令:
SELECT name, column_id
FROM sys.columns
WHERE object_id = OBJECT_ID(N'dbo.Test')
你会看到类似的东西:
column_name column_id
id 1
firstname 2
name 3
street 4
如果通过设计师或在数据项目的情况下更改列name
,这将导致SQL Server直接获取此订单。 在这种情况下,您尝试将name
列更改为lastname
。这将强制执行SQL Management Studio和其他类似的程序,以保持column_id
直立。这只能在完全重新使用右列列表重新创建的情况下完成。 SQL Server创建临时表存根,将所有内容插入到它中,删除旧表并将临时表重命名为旧的原始名称。就像你上面的代码一样。
后,你会看到类似的东西:
column_name column_id
id 1
firstname 2
lastname 3
street 4
,如果您只需重命名的最后一列或做手工,一切都会好起来的。手动会更有效率,因为不需要将所有数据移动到新表中。手动的方法是这样的:将导致以下结果
-- Create the new column
ALTER TABLE dbo.Test ADD lastname nvarchar(100)
GO
-- Populate the new column using the old one
UPDATE dbo.Test
SET lastname = name
GO
-- Drop the old column afterwards
ALTER TABLE dbo.Test DROP COLUMN name
此行为:
column_name column_id
id 1
firstname 2
street 4
lastname 5
最后一个会更有效,如前所述。
希望这会回答你的问题,即使答案最近。
如果列定义是键/索引的一部分,则不能更改列定义。一般而言,放弃键,改变定义,然后重新构建键,将比使用新定义构建并行结构,然后删除旧命名和重命名更加昂贵。 – 2014-10-13 09:49:08