2014-09-10 33 views
6

我有一个SQL Server数据库项目,其中我已经对模式进行了一些更改,我已将NUMERIC (18,0)的列数据类型更改为INT。我们正在尝试对用于主键的数据类型进行规范化处理,这是目前的50/50混合。SQL Server数据库项目:发布如何决定何时重新创建表?

当我生成发布脚本,一些表被重新创建脚本:

CREATE TABLE [dbo].[tmp_XYZ] 
INSERT TABLE [dbo].[tmp_XYZ] SELECT ... FROM [dbo].[XYZ] 
DROP TABLE [dbo].[XYZ] 
sp_rename N'[dbo].[tmp_XYZ]', N'XYZ'; 

但其他的表是通过ALTER陈述

ALTER TABLE [dbo].[ABC] ALTER COLUMN [AbcID] INT NULL;

刚刚更新是有一些规则这决定了什么时候桌子会重新创建,什么时候改变了?

+0

如果列定义是键/索引的一部分,则不能更改列定义。一般而言,放弃键,改变定义,然后重新构建键,将比使用新定义构建并行结构,然后删除旧命名和重命名更加昂贵。 – 2014-10-13 09:49:08

回答

0

可能最好的方法是右键单击您的对象名称并选择脚本作为... 然后您可以选择创建或更改 如果找不到Alter,则可以转到设计视图,右键单击并选择Generate Change Script ...来查找alter语句。

0

这只是一个简单的问题。这与在表设计器中更改表的问题相同。我认为你已经改变了你的表格设计中需要放下并重新创建表格的列,以便让列在同一位置排序。

这是一个简短的例子。以下列表格设计为:

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 

最后一个会更有效,如前所述。

希望这会回答你的问题,即使答案最近。

相关问题