将数字从varchar更改为int的列的类型

Svi*_*ish 32 sql-server types

我们在数据库中有两列,目前的类型为varchar(16).事实是,它包含数字,并且始终包含数字.因此,我们希望将其类型更改为整数.但问题是它当然已包含数据.

我们有什么方法可以将该列的类型从varchar更改为int,而不是丢失那些已存在的那些数字?希望我们可以运行某种sql,而不必创建临时列并创建C#程序或进行转换等等......我想如果SQL Server有一些函数将字符串转换为数字,但我在SQL上非常不稳定.几乎只能使用C#并通过LINQ to SQL访问数据库.

注意:是的,首先使列成为varchar并不是一个好主意,但不幸的是,他们这样做了.

cjk*_*cjk 38

唯一可行的方法是使用临时表,但SQL不会太多:

select * into #tmp from bad_table
truncate table bad_table
alter bad_table alter column silly_column int
insert bad_table
select cast(silly_column as int), other_columns
from #tmp
drop table #tmp
Run Code Online (Sandbox Code Playgroud)

  • 单个#表示特定于连接的临时表(仅在该连接中可用),而双重散列##表示全局临时表(可由所有连接访问) (7认同)
  • 在我编写的所有名字中,你对#tmp做了评论? (4认同)
  • 好的答案 - 我会先运行这个 - 从 bad_table 中选择 cast(silly_column as int), other_columns 以确保您没有任何转换问题,并且它们实际上都是整数。 (2认同)
  • *sigh* truncate 由于外键约束而不起作用。我可以在我弄乱它时以某种方式禁用它,然后再将其打开吗? (2认同)

jmo*_*eno 23

最简单的方法是:

alter table myTable alter column vColumn int;
Run Code Online (Sandbox Code Playgroud)

这将有效

  1. 所有数据都适合int
  2. 所有数据都可以转换为int(即"car"值将失败)
  3. 没有包含vColumn的索引.如果有索引,则需要包含一个drop并为它们创建以回到原来的位置.

  • @svish:我真的希望它是"汽车"而不是"char". (2认同)
  • @AshishKamble:这必须是一个单独的问题,并有更多详细信息解释您想要什么。 (2认同)

ctr*_*3nd 7

只需更改SQL Server Management Studio中的数据类型即可.

(您可能需要转到菜单工具选项设计器,并禁用阻止保存重新创建表的更改的选项.)