将VARCHAR转换为INT的问题

时间:2010-12-17 21:36:07

标签: sql sql-server sql-server-2005 tsql

我在将数据类型从VARCHAR(50)更改为INT时遇到问题。我尝试了很多,但仍然没有得到它,并且没有使用变量,也需要在从varchar转换为int后将该标识添加到该列。

先谢谢

4 个答案:

答案 0 :(得分:3)

如果不支持ALTER TABLE ... ALTER COLUMN(如您的情况),更改列类型最好分四步完成:

  • 添加一个具有正确类型的新列
  • 更新数据库以匹配旧列和新列中的值
  • 使用sp_rename,将新列的名称与旧列交换
  • 删除旧列

另一种选择是:

  • 创建一个包含所需列的新表
  • 将数据复制到新表
  • 使用sp_rename交换旧表和新表之间的名称
  • 放下旧桌子

最佳路径取决于许多因素,例如数据大小,现有约束,引用表的外键,非聚簇索引,引用表的视图和用户函数,复制,现有触发器和过程等等等等。不可能给出一个简单的答案,因为当考虑 all 的含义时问题本身就很复杂。

答案 1 :(得分:1)

您可以尝试多步骤过程,例如:

/** Add new column with identity **/
ALTER TABLE MyTable
ADD NewColumnTempName INT NOT NULL IDENTITY (1, 1) DEFAULT (0)
GO

/** Allow us to enter values into the entity field **/
SET IDENTITY_INSERT MyTable ON;
GO

/** Push the data from the varchar column into the new column **/
UPDATE MyTable
SET NewColumnTempName = CAST(OldColumnName AS INT);
GO

/** Get rid of the old column **/
ALTER TABLE MyTable
DROP OldColumnName;
GO

/** Rename the newcolumn tot he old name **/
EXEC sp_rename 'MyTable.NewColumnTempName', 'OldColumnName', 'COLUMN';

/** Switch back on the identity column **/
SET IDENTITY_INSERT MyTable OFF
GO

答案 2 :(得分:0)

第一个明显的猜测是列中的数据无法转换为INT。这会返回任何结果吗?

select ColumnYouWantToConvert
    from YourTable
    where isnumeric(ColumnYouWantToConvert) = 0

答案 3 :(得分:0)

您需要删除DEFAULTS,CHECKS等,ALTER列并重新创建DEFAULTS,CHECKS和键

ALTER TABLE T DROP CONSTRAINT C1
ALTER TABLE T DROP CONSTRAINT C2
ALTER TABLE T DROP CONSTRAINT C3
...
ALTER TABLE T ALTER COLUMN Cl int [null|notnull]
ALTER TABLE T ADD 
CONSTRAINT C1 ... ,
CONSTRAINT C2...,
CONSTRAINT C3...,