【问题标题】:Alter column from NVARCHAR to NBINARY将列从 NVARCHAR 更改为 BINARY
【发布时间】:2013-01-13 16:03:59
【问题描述】:

我不小心创建了一个类型错误的列NVARCHAR(用于存储密码盐),我想将其转换为NVARBINARY

我试过了

ALTER TABLE [dbo].[TableName]
    ALTER COLUMN [ColumnName] [varbinary] (20) NOT NULL
GO

但它说

不允许从数据类型 nvarchar 到 varbinary 的隐式转换。使用 CONVERT 函数运行此查询。

有没有办法做到这一点? CONVERT 似乎只用于表达,不能用于更改。

【问题讨论】:

  • 添加正确类型的新列,将数据从旧列复制/转换到新列,然后删除旧列,可能会更好。
  • 该列是否已经包含值?
  • 该列已经包含值,是的。我需要创建一个升级脚本,而不是创建脚本。

标签: sql-server sql-server-2008-r2


【解决方案1】:

改变的唯一方法是:

Create Table a (id int,blb Nvarchar(10))


insert into a Values
(1,'Test'),
(2,N'Test2');

BEGIN Transaction
ALTER TABLE a
ADD blb_New [varbinary] (20) NULL
GO

UPDATE a
SET blb_new = CAST(blb AS varbinary(20))
GO

ALTER TABLE a
DROP COLUMN blb
GO

EXEC sp_rename 'a.blb_new', 'blb', 'COLUMN'
GO
COMMIT Transaction


Select *,CAST(blb as Nvarchar(20)) from a

Drop Table a

【讨论】:

  • 很好的解决方案。有一些类似的想法,但我认为可能会有更容易的事情。谢谢!
  • 第一个ALTER TABLEsp_rename 之间的所有内容(包括)都需要在事务中执行,以锁定其他用户。如果有并发流量并且您不使用事务,您很可能最终会丢失数据。
【解决方案2】:

您可以先将同一列中的所有值从 NVARCHAR 转换为 NVARBINARY。 转换所有值后使用 Alter table

您可以参考以下链接: Converting NVARCHAR(255) to DATE

【讨论】:

  • 你可以这样做“更新一个集合 blb=cast(blb as varbinary(10))”但是你不能这样做“改变表 a 改变列 blb varbinary(10)” .您引用的示例不是阻塞的,因为不可能进行隐式转换,但是为什么不能转换包含的值。
猜你喜欢
  • 2021-06-26
  • 1970-01-01
  • 2015-12-15
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
  • 1970-01-01
相关资源
最近更新 更多