2

、、、などintのさまざまなデータ型で作成された625列のSQLServerテーブルがあります。varchar(25)decimal(18, 2)

ここで、すべての列のデータ型をに変更することに関心がありますvarchar(255)。すべての列に対して以下のクエリを1つずつ実行する代わりに、テーブル内のすべての列のデータ型を一度に変更する単一のSQL Serverクエリがありますか?

ALTER TABLE dbo.Employee 
ALTER COLUMN FirstName VARCHAR(255) NOT NULL

ご返信をお待ちしております。

4

3 に答える 3

5

これを行うための単一の「魔法の」弾丸はありません。これはかなり珍しい操作であるため、ネイティブではサポートされていません。

実行できることは、システムカタログビューからテーブルの列を反復処理し、そのようなALTERステートメントをその場で作成し、それを実行することです-次のようになります。

DECLARE AlterTableCursor CURSOR FAST_FORWARD 
FOR
    SELECT 
        AlterCmd = 'ALTER TABLE dbo.YourTableNameHere ALTER COLUMN ' + name + ' VARCHAR(255) NULL'
    FROM 
        sys.columns
    WHERE 
        object_id = OBJECT_ID('dbo.YourTableNameHere')

DECLARE @AlterTableCmd NVARCHAR(200)

OPEN AlterTableCursor

FETCH NEXT FROM AlterTableCursor INTO @AlterTableCmd

WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC (@AlterTableCmd)

    FETCH NEXT FROM AlterTableCursor INTO @AlterTableCmd
END

CLOSE AlterTableCursor
DEALLOCATE AlterTableCursor

を実際のテーブル名に置き換えてYourTableNameHereください。これで問題ありません。最初にライブデータのコピーでこれをテストしてください!

于 2012-06-22T06:10:37.250 に答える
4

不可能である。これを1つずつ行う必要があります。あなたは次のことをすることができます-

  1. 必要な列とタイプを使用して一時テーブルを作成できます。
  2. 元のテーブルから一時テーブルにデータをコピーします。
  3. 元のテーブルを削除する
  4. 一時テーブルの名前を元の名前に変更します
于 2012-06-22T05:45:56.930 に答える
1

1つのテーブルに625列を含めるのは良い設計ではないと思いますが、要求されたことは何でも実行します。

SQL複数のALTERステートメントを含む文字列を生成し、それをで実行できEXECます。ただし、データ変換には注意する必要があります。これが、変更できない列の考えられる例外をキャッチできるため、カーソルで実行する方がおそらく良い理由です。これは2つのステップでそれを行う簡単なコードです:

  • SQL文字列を生成します。
  • を使用して実行しますEXEC

コードサンプル:

SELECT * FROM sys.columns WHERE OBJECT_NAME(object_id) = 'Employee'

DECLARE @SQL VARCHAR(MAX)
SET @SQL = (
SELECT '
ALTER TABLE dbo.Employee ALTER COLUMN ' + c.name + ' VARCHAR(255) NULL;
'
FROM sys.columns c WHERE OBJECT_NAME(object_id) = 'Employee'
FOR XML PATH(''), TYPE
).value('text()[1]', 'VARCHAR(MAX)')

PRINT @SQL

EXEC(@SQL)

SELECT * FROM sys.columns WHERE OBJECT_NAME(object_id) = 'Employee'
于 2012-06-22T06:22:21.130 に答える