2013-12-10 268 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。

相關問題