董晓涛(David Dong)

博客园 首页 新随笔 联系 订阅 管理

当我们要把一个字段的数据类型从Char(1)改为Char(10)或者是其它更改时,大家一般都是用企业管理器来完成,那我们现在来看一下这个过程中企业管理器做了什么(这也是为什么有时在企业管理器中操作比较慢的原因)!要查看 Enterprise Manager 如何处理这个更改,单击 任一数据库(分区在此数据库中创建)下的 Tables 文件夹,然后右击 某一 表,比如我所用的IPLocator_Flag ,选择 Design Table。在 Design Table 对话框中,把TableUsed列的大小更改为char(1)。在把更改保存到一个分区之前,单击 Save Change Script,并检查 SQL Server 生成的脚本。您应获得 下面所示的(简短的)脚本。

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
CREATE TABLE dbo.Tmp_IPLocator_Flag
 (
 TableUsed char(10) NULL
 )  ON [PRIMARY]
GO

IF EXISTS(SELECT * FROM dbo.IPLocator_Flag)
  EXEC('INSERT INTO dbo.Tmp_IPLocator_Flag (TableUsed)
  SELECT CONVERT(char(10), TableUsed) FROM dbo.IPLocator_Flag TABLOCKX')
GO
DROP TABLE dbo.IPLocator_Flag
GO
EXECUTE sp_rename N'dbo.Tmp_IPLocator_Flag', N'IPLocator_Flag', 'OBJECT'
GO
COMMIT

Enterprise Manager 更改列大小的效率非常低。首先,它创建了一个新表dbo.Tmp_IPLocator_Flag,为TableUsed指定了新的大小。然后,Enterprise Manager 把数据从dbo.IPLocator_Flag中复制到dbo.Tmp_IPLocator_Flag,删除dbo.IPLocator_Flag,并把dbo.Tmp_IPLocator_Flag重命名为dbo.IPLocator_Flag。如果有主键约束,刚还要加为之加上主键约束。效率非常低。

 

所以我建议大家以后尽可能多的使用TSQL进行数据库操作!当然这样还可以提高我们自己的SQL水平。

--董晓涛

posted on 2005-02-07 09:24  董晓涛  阅读(343)  评论(0编辑  收藏  举报