4

SQL 2005 データベースに移動する必要がある datetime2 列でいっぱいのデータベースがあります。したがって、これらすべての datetime2(7) 列を datetime に変換する必要があります。

どうすればこれを行うことができますか?

現在、次のようなdatetime2データ型を持つすべての列のテーブル名と列名を選択できました。

SELECT t.name, c.name, i.DATA_TYPE
FROM sys.tables AS t
JOIN sys.columns c ON t.object_id = c.object_id
JOIN information_schema.columns i ON i.TABLE_NAME = t.name AND i.COLUMN_NAME = c.name
WHERE i.data_type = 'datetime2'

残りの方法がわかりません。

4

4 に答える 4

6

...次に、結果を CURSOR で反復処理し、次のように DDL を動的に実行します。

ALTER TABLE myTable ALTER COLUMN myColumn datetime [NOT] NULL

これに似たものが得られるようにします(テストされていません):

編集:ヌル能力チェックも追加:

DECLARE @SQL AS NVARCHAR(1024)
DECLARE @TBL AS NVARCHAR(255)
DECLARE @COL AS NVARCHAR(255)
DECLARE @NUL AS BIT
DECLARE CUR CURSOR FAST_FORWARD FOR
    SELECT  t.name, c.name, c.is_nullable
    FROM    sys.tables AS t
    JOIN    sys.columns c ON t.object_id = c.object_id
    JOIN    information_schema.columns i ON i.TABLE_NAME = t.name AND i.COLUMN_NAME = c.name
    WHERE   i.data_type = 'datetime2'
    ORDER BY t.name, c.name

OPEN CUR
FETCH NEXT FROM CUR INTO @TBL, @COL, @NUL
WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT @SQL = 'ALTER TABLE ' + @TBL + ' ALTER COLUMN ' + @COL + ' datetime' + (CASE WHEN @NUL=1 THEN '' ELSE ' NOT' END) + ' NULL;'
    EXEC sp_executesql @SQL
    FETCH NEXT FROM CUR INTO @TBL, @COL, @NUL
END

CLOSE CUR;
DEALLOCATE CUR;
于 2009-09-18T20:53:47.440 に答える
3

このスレッドが古いことは知っていますが、今日も同じことをしていて、自分のテクニックを提供したかっただけです。多くの DDL ステートメントを実行する必要があるときはいつでも、必要な TSQL を生成する 1 つの TSQL を作成し、結果をクエリ ウィンドウにコピーして実行します。@van の提案のようにすべてのカーソル コードを記述する必要はありません (ただし、問題なく動作します)。

したがって、あなたの状況では、SQL ステートメントを実行するだけです。

select 'ALTER TABLE ' + table_name + ' ALTER COLUMN ' + column_name + ' datetime [NOT] NULL' 
from INFORMATION_SCHEMA.columns 
where data_type = 'datetime2(7)'.

次に、結果を新しいクエリ ウィンドウにコピーして実行します。"GO"コマンド間に独自の行にステートメントを追加する必要がある場合があります。char(13) + 'GO'その場合は、出力文字列 に追加します。

また、SQL Mgmt Studio で [Results to Grid] オプションの代わりに [Results to Text] オプションを使用してクエリを実行してください。

于 2011-03-31T17:43:27.420 に答える