Sql 将数据类型Char转换为Nvarchar

Sql 将数据类型Char转换为Nvarchar,sql,char,sql-server-2012,nvarchar,Sql,Char,Sql Server 2012,Nvarchar,我目前正在尝试在SQL server 2012中将数据库所有表中的所有列从char转换为nvarchar 我尝试运行的查询是 select cast((select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where DATA_TYPE = 'char') as nvarchar(MAX)) 不确定是否应该通过INFORMATION_SCHEMA.COLUMNS更改数据类型,但我发现这是获取数据类型的最佳方式 我当前遇到的错误是: Subque

我目前正在尝试在SQL server 2012中将数据库所有表中的所有列从char转换为nvarchar

我尝试运行的查询是

select cast((select COLUMN_NAME 
from INFORMATION_SCHEMA.COLUMNS
where DATA_TYPE = 'char') as nvarchar(MAX))
不确定是否应该通过INFORMATION_SCHEMA.COLUMNS更改数据类型,但我发现这是获取数据类型的最佳方式

我当前遇到的错误是:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时。

是否有更好的方法来完成此操作或解决此错误,因为我似乎不喜欢同时将数据类型更改为多行。

从信息中选择SCHEMA.COLUMNS是确定需要转换哪些列的好方法

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE DATA_TYPE = 'CHAR';
但它不能用于直接更改列的数据类型。用于修改列数据类型:

ALTER TABLE [dbo].[TableName] ALTER COLUMN [ColumnName] NVARCHAR(50);
在使用时,避免使用
NVARCHAR(MAX)
,除非绝对必要。确保数据类型的大小专门针对属性。如果
CHAR
列的大小已经正确,请使用以下脚本生成
ALTER TABLE
语句:

SELECT  'ALTER TABLE ' +
        QUOTENAME(TABLE_SCHEMA) + '.' +
        QUOTENAME(TABLE_NAME) +
        ' ALTER COLUMN ' +
        QUOTENAME(COLUMN_NAME) +
        ' NVARCHAR(' +
        CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR(4)) + ');'
FROM    INFORMATION_SCHEMA.COLUMNS
WHERE   DATA_TYPE = 'char';

请记住,这只会生成ALTER TABLE语句,您需要复制结果并在新选项卡中执行以更改数据类型。

首先要做的事情。出现错误是因为select返回多行,并且您试图将所有列名称强制转换为nvarchar(MAX)。将来可能需要执行的任何子查询必须只返回一行

select cast((select top 1 COLUMN_NAME 
from INFORMATION_SCHEMA.COLUMNS
where DATA_TYPE = 'char') as nvarchar(MAX))
这将修复错误,但这不是您试图做的

要更新所有列,需要根据以下命令执行某些操作:

ALTER TABLE{TableName}ALTER COLUMN{ColumnName}NVARCHAR(大小)


您可以做的是从INFORMATION_SCHEMA.COLUMNS中获取表名和列名,并构建一个动态脚本,将数据库中的所有列从char更新为nvarchar。

看起来function cast使用的是单个字段,而不是多个字段。只是一个简单的例子,我从该查询中得到确认,9365行已更改,但是当查看这些表时,数据类型仍然没有改变。这个查询只是显示将要进行的更改,并且我需要进行更新而不是选择,还是我做错了什么?这只会生成所需的ALTER TABLE语句。将结果复制到新窗口并执行以更改数据类型。答案已更新。