2013-12-10 223 views
2

我目前正在对所有列转换从焦炭中我的数据库中的所有表在SQL服务器为nvarchar 2012转换数据类型字符为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. 

有没有更好的方式来做到这一点或解决这个错误的方式,因为它似乎不喜欢我在不断变化的数据类型,以多行同时。

+0

看起来像功能投与单场,而不是多个。 –

回答

1

从INFORMATION_SCHEMA.COLUMNS选择是确定需要哪些列转换的好方法,

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE DATA_TYPE = 'CHAR'; 

但它不能直接用来改变列的数据类型。 ALTER TABLE用于修改列数据类型:

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语句,你需要复制的结果,并执行在新选项卡中更改数据类型。

+0

只是一个快速的我从该查询得到确认,9365行已被更改,但在查看表时data_type仍然没有改变。是这个查询只是显示将受到影响的变化,我需要把更新而不是选择或我做错了什么? – user3087290

+0

这只会生成所需的ALTER TABLE语句。将结果复制到新窗口并执行以更改数据类型。答案已更新。 – Bryan

0

第一件事第一件事。您正在收到错误,因为select返回多行,并且您试图将所有column_name转换为nvarchar(MAX)。您将来可能需要执行的任何子查询只能返回一行。

select cast((select top 1 COLUMN_NAME 
from INFORMATION_SCHEMA.COLUMNS 
where DATA_TYPE = 'char') as nvarchar(MAX)) 

这将修复错误,但这不是你要做的。

要更新您需要根据下面的命令做一些事情的所有列:

ALTER TABLE {表名} ALTER COLUMN {的ColumnName} NVARCHAR(大小)

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

相关问题