3

データベース内のすべてのテーブル列を型付きで変換するときに問題が発生しntextます。列を変更するためにこのクエリを作成しましたが、構文エラーがあります。

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

は正しい数値を返しますSELECT MAX(DATALENGTH(mycolumn)) FROM mytableが、クエリを実行できません。

構文エラーは次のとおりです。

キーワード 'select' 付近の構文が正しくありません ( 内にあります varchar) 。

どうすれば問題を解決できますか?

4

3 に答える 3

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.objectsすべてsys.columnsの ntext 列を見つけて varchar に変換できることです。

于 2012-10-04T15:59:54.833 に答える
0

ALTER COLUMNステートメント内でこれを行うことはできません。少なくとも私はこれを見たことがありません。

このようにする必要があります:

その列の最大データ長を計算します (既にこれを行っています)。

SELECT MAX(DATALENGTH(mycolumn)) FROM mytable

前のクエリで取得した値を置き換えるだけです。

ALTER TABLE mytable ALTER COLUMN mycolumn VARCHAR(MAXVALUEFROMPREVIOUSQUERY);
于 2012-10-04T15:57:06.480 に答える
0

しようとしている:

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

ALTER TABLE mytable ALTER COLUMN mycolumn VARCHAR(@maxLength);
于 2012-10-04T15:59:29.847 に答える