この投稿は、SELECT INTO With SQL Azureを意訳したものです。随時、意味がとりやすいよう手を加えていますので、オリジナルと文意が変わっている箇所があるかもしれません。
SQL Azureでは、(データを入れる際に)すべてのテーブルにクラスター化インデックスが必要なので、SELECT INTO文でのテーブル作成、クラスター化インデックスの作成をサポートしていません。
SQL Azureへの移行を計画する場合、SELECT INTO文の代わりにテーブルを作成するコードを準備する必要があります。クラスター化インデックスが必要の無い一時テーブルを使用するか、通常のテーブルを使用するかで対応します。
実験するために、簡単に移行元のサンプルデータを用意します。
CREATE TABLE Source (Id int NOT NULL IDENTITY, [Name] nvarchar(max), [Color] nvarchar(10),
CONSTRAINT [PK_Source] PRIMARY KEY CLUSTERED
(
[Id] ASC
))
INSERT INTO Source([Name], [Color]) VALUES ('Shirt','Red')
INSERT INTO Source([Name], [Color]) VALUES ('Pants','Red')
INSERT INTO Source([Name], [Color]) VALUES ('Tie','Pink')
試しにSELECT INTOを使用してみます。
クラスター化インデックスを必要としない一時テーブルにSELECT INTOを使用します。
SELECT *
INTO #Destination
FROM Source
WHERE [Color] LIKE 'Red'
-- Do Something
--DROP TABLE #Destination
このSQLをSQL Azureに使用すると、クラスター化インデックスを必要としない一時テーブルでも失敗し、エラーが表示されます。
メッセージ 40510, レベル 15, 状態 2, 行 1
Statement ‘SELECT INTO’ is not supported in this version of SQL Server.
次に、あらかじめクラスター化インデックスが無い一時テーブルを作成した状態で、SELECT INTO文を使用してみます。
CREATE TABLE #Destination (Id int NOT NULL, [Name] nvarchar(max), [Color] nvarchar(10))
INSERT INTO #Destination(Id, [Name], [Color])
SELECT Id, [Name], [Color]
FROM Source
WHERE [Color] LIKE 'Red';
-- Do Something
DROP TABLE #Destination
結果は、2行正しく処理されます。
まとめ
SELECT INTO文を使用する場合は、下のどちらかを選択しなければなりません。
- 予め移行先のテーブルを準備し、クラスター化インデックスを作成しておく
- 予め移行先のテーブルとして、(クラスター化インデックスが必要のない)一時テーブルを作成しておく