将表列数据类型从image转换为varbinary

时间:2015-07-21 13:58:33

标签: sql sql-server tsql sql-server-2014 alter-table

我有一张表:

create table tbl ( 
  id int,
  data image
)

我们发现data列的尺寸非常小,可以存储在varbinary(200)

所以新表将是,

create table tbl ( 
    id int,
    data varbinary(200)
)

如何将此表格迁移到新设计 而不会丢失其中的数据。

4 个答案:

答案 0 :(得分:4)

只需执行两个单独的ALTER TABLE,因为您只能将image转换为varbinary(max),但之后您可以更改其长度:

create table tbl ( 
  id int,
  data image
)
go
insert into tbl(id,data) values
(1,0x0101010101),
(2,0x0204081632)
go
alter table tbl alter column data varbinary(max)
go
alter table tbl alter column data varbinary(200)
go
select * from tbl

结果:

id          data
----------- ---------------
1           0x0101010101
2           0x0204081632

答案 1 :(得分:2)

您可以使用此ALTER语句将现有列IMAGE转换为VARBINARY(MAX)Refer Here

ALTER Table tbl ALTER COLUMN DATA VARBINARY(MAX)

转换完毕后,您肯定会撤消数据。

注意: - 执行前不要忘记备份。

在将来的SQL SERVER版本中不推荐使用IMAGE数据类型,并且只要有可能就需要将其转换为VARBINARY(MAX)。

答案 2 :(得分:1)

如何使用NewTable创建varbinary,然后将OldTable中的数据复制到其中?

INSERT INTO [dbo].[NewTable] ([id], [data])
            SELECT  [id], [image] FROM  [dbo].[OldTable]

答案 3 :(得分:1)

首先来自BOL:

  

image:从0到2 ^ 31-1的可变长度二进制数据   (2,147,483,647)字节。

图像数据类型本质上是varbinary(2GB)的别名,因此将其转换为varbinary(max)不应导致数据丢失。

但可以肯定:

  1. 备份现有数据
  2. 添加新字段(varbinary(max))
  3. 将数据从旧字段复制到新字段
  4. 使用sp_rename交换字段
  5. 测试
  6. 成功测试后,删除旧列