2012-10-04 68 views
3

我在數據庫中使用ntext類型轉換所有表列時出現問題。我爲了改變我的專欄寫了這個查詢,但有一個語法錯誤:在SQL Server中將ntext列類型更改爲varchar(n)

ALTER TABLE mytable ALTER COLUMN mycolumn 
VARCHAR(SELECT MAX(DATALENGTH(mycolumn)) FROM mytable); 

即使SELECT MAX(DATALENGTH(mycolumn)) FROM mytable將返回正確的號碼,不能執行查詢。

的語法錯誤是:

Incorrect syntax near the keyword 'select'.(which is inside the varchar)

我怎樣才能解決這個問題?

+0

'ntext' to'varchar'可能會導致數據丟失,您是否需要'nvarchar'? –

+0

嗨馬丁,是的我試圖從'ntext'轉換成'varchar(max_of_length_of_column)'我表中的所有列。數據丟失如何發生在我的情況? –

+0

因爲'ntext'是雙字節,'varchar'是(在大多數歸類下)單字節,所以不是所有的字符都可以表示。 –

回答

5

您需要將其作爲動態sql執行,因爲列的大小不能是變量。

DECLARE @Length int = SELECT MAX(DATALENGTH(mycolumn)) FROM mytable 
DECLARE @MyTable varchar(100) = 'mytable' 
DECLARE @MyColumn varchar(100) = 'mycolumn' 
DECLARE @SQL varchar(8000) = 'ALTER TABLE ' + @MyTable +' ALTER COLUMN '+ @MyColumn +' VARCHAR(' + CONVERT(varchar, @Length) + ')' 
EXEC(@SQL) 

這樣做的好處是你可以遍歷sys.objectssys.columns找到所有的ntext列,並將其轉換爲varchar。

+0

非常感謝! –

0

我擔心你不能在ALTER COLUMN聲明中執行此操作。至少我從來沒有見過這個。

你應該做的是這樣的:

計算該列中的最大數據長度(你已經這樣做了):

SELECT MAX(DATALENGTH(mycolumn)) FROM mytable 

現在只需更換你在前面的查詢得到的值:

ALTER TABLE mytable ALTER COLUMN mycolumn VARCHAR(MAXVALUEFROMPREVIOUSQUERY); 
+0

感謝您的回覆,但我不能照你所說的去做。由於查詢應該是動態的,我不能爲我的數據庫有很多列。 –

0

嘗試:

SET @maxLength = SELECT MAX(DATALENGTH(mycolumn)) FROM mytable; 

ALTER TABLE mytable ALTER COLUMN mycolumn VARCHAR(@maxLength); 
+0

謝謝@Zenofo,但我已經嘗試了這種方法。但它沒有工作。 –

+0

Checkout @ james-curtis的回答,使用'DECLARE'和'EXEC'運行SQL查詢 – Koerr

+0

是的,他的回答對我有用,再次感謝! –

相關問題