Sql server 将列从NVARCHAR更改为NBINARY

Sql server 将列从NVARCHAR更改为NBINARY,sql-server,sql-server-2008-r2,Sql Server,Sql Server 2008 R2,我无意中创建了一个类型错误的列NVARCHAR(用于存储密码),我想将其转换为NVARBINARY 我试过了 ALTER TABLE [dbo].[TableName] ALTER COLUMN [ColumnName] [varbinary] (20) NOT NULL GO 但是它说 不允许从数据类型nvarchar隐式转换为varbinary。使用CONVERT函数运行此查询 有办法吗CONVERT似乎只用于表达式,而不用于更改。更改的唯一方法是: Create Table a

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

我试过了

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

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


有办法吗
CONVERT
似乎只用于表达式,而不用于更改。

更改的唯一方法是:

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

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

您可以参考以下链接:

添加正确类型的新列,将数据从旧列复制/转换为新列,然后删除旧列,可能会更好。该列是否已包含值?下面是到covert函数的链接:该列已包含值,是。我需要创建一个升级脚本,而不是创建脚本。很好的解决方案。我有类似的想法,但我想可能会有更简单的。谢谢第一个
ALTER TABLE
sp_rename
之间的所有操作都需要在事务内部执行,以锁定其他用户。如果存在并发流量,并且您不使用事务,则最有可能导致数据丢失。您可以执行“更新集合blb=cast(blb as varbinary(10)),但无法执行“更改表a更改列blb varbinary(10)”的操作。您正在引用的examle未被阻塞,因为不可能进行隐式转换,但为什么不能将值containt转换为convertet。