SQL AzureでSELECT INTO

2010-11-21

この投稿は、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文を使用する場合は、下のどちらかを選択しなければなりません。

  • 予め移行先のテーブルを準備し、クラスター化インデックスを作成しておく
  • 予め移行先のテーブルとして、(クラスター化インデックスが必要のない)一時テーブルを作成しておく