当我们要把一个字段的数据类型从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。如果有主键约束,刚还要加为之加上主键约束。效率非常低。
所以我建议大家以后尽可能多的使用T-SQL进行数据库操作!当然这样还可以提高我们自己的SQL水平。
--董晓涛