将列从NVARCHAR更改为NBINARY

3

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

我尝试过

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

但它说:

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

有什么方法可以做到吗? CONVERT似乎仅适用于表达式,而不适用于修改操作。


你可能会更幸运,如果你添加一个正确类型的新列,将数据从旧列复制/转换到新列,然后再删除旧列。 - Joe
该列已经包含值了吗? - John Woo
这是一个链接到 covert 函数的网址:http://msdn.microsoft.com/en-us/library/ms175509(v=sql.105).aspx - user751651
该列已经包含了值,是的。我需要创建一个升级脚本,而不是一个创建脚本。 - AndiDog
2个回答

3
唯一的修改方式可能是像这样:

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

很棒的解决方案。我之前也有类似的想法,但我认为可能会有更简单的方法。谢谢! - AndiDog
1
在执行 sp_rename 之前,需要将第一个 ALTER TABLEsp_rename 之间的所有内容放入事务中执行,以防止其他用户干扰。如果存在并发访问且未使用事务,则很可能会导致数据丢失。 - Sebastian Meine

0

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

您可以参考以下链接: 将NVARCHAR(255)转换为DATE


你可以执行这个操作 "Update a set blb=cast(blb as varbinary(10))",但是你无法执行这个操作 "Alter Table a Alter Column blb varbinary(10)"。不过,你所引用的例子并不会被阻塞,因为隐式转换是不可能的,但为什么值的内容不能被转换呢? - bummi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接