8

私は得ています

ステートメント'SELECTINTO'は、SQLServerのこのバージョンのSQLServerではサポートされていません。

ストアドプロシージャ内の以下のクエリの場合

DECLARE @sql NVARCHAR(MAX)
,@sqlSelect NVARCHAR(MAX) = ''
,@sqlFrom NVARCHAR(MAX) = ''
,@sqlTempTable NVARCHAR(MAX) = '#itemSearch'
,@sqlInto NVARCHAR(MAX) = ''
,@params NVARCHAR(MAX)


SET @sqlSelect ='SELECT     
,IT.ITEMNR
,IT.USERNR
,IT.ShopNR
,IT.ITEMID'                 

SET @sqlFrom =' FROM        dbo.ITEM AS IT' 
SET @sqlInto = ' INTO ' + @sqlTempTable + ' ';  

IF (@cityId > 0)
    BEGIN
        SET @sqlFrom = @sqlFrom +
            ' INNER JOIN    dbo.CITY AS CI2
                        ON  CI2.CITYID = @cityId'

        SET @sqlSelect = @sqlSelect +
            'CI2.LATITUDE AS CITYLATITUDE
            ,CI2.LONGITUDE AS CITYLONGITUDE'
    END

SELECT @params =N'@cityId int ' 

SET @sql =  @sqlSelect +@sqlInto +@sqlFrom 

EXEC sp_executesql @sql,@params

約50,000件のレコードがあるので、TempTableを使用することにしました。しかし、このエラーを見て驚いた。

SQL Azureで同じことを実現するにはどうすればよいですか?

編集:このブログhttp://blogs.msdn.com/b/sqlazure/archive/2010/05/04/10007212.aspxを読んで、Tempテーブルの代わりにデータを格納するためのストアドプロシージャ内にテーブルを作成することを提案しています。並行性の下で安全ですか?パフォーマンスに影響しますか?

http://blog.sqlauthority.com/2011/05/28/sql-server-a-quick-notes-on-sql-azure/から取得したいくつかのポイントを追加します

  • 各テーブルには、クラスター化インデックスが必要です。クラスタ化インデックスのないテーブルはサポートされていません。
  • 各接続は単一のデータベースを使用できます。1つのトランザクションでの複数のデータベースはサポートされていません。
  • 「USEDATABASE」はAzureでは使用できません。
  • グローバル一時テーブル(または一時オブジェクト)はサポートされていません。
  • 相互データベース接続の概念がないため、現時点では、リンクサーバーはAzureの概念ではありません。
  • SQL Azureは共有環境であり、同じため、Windowsログインの概念はありません。
  • TempDBに圧力がかかるため、TempDBオブジェクトは必要に応じて必ず削除してください。
  • 降圧挿入中にbatchsizeオプションを使用して、挿入される行数を制限します。これにより、トランザクションログスペースの使用が制限されます。
  • ハイエンドのメモリ使用量につながるため、操作によるORDERのグループ化またはブロックの不要な使用は避けてください。
4

4 に答える 4

7

SELECT INTO is one of the many things that you can unfortunately not perform in SQL Azure.

What you'd have to do is first create the temporary table, then perform the insert. Something like:

CREATE TABLE #itemSearch (ITEMNR INT, USERNR INT, IT.ShopNR INT, IT.ITEMID INT)
INSERT INTO #itemSearch
SELECT IT.ITEMNR, IT.USERNR, IT.ShopNR ,IT.ITEMID                  
FROM dbo.ITEM AS IT
于 2013-03-12T11:42:54.417 に答える
5

新しいAzure DB Update プレビューでは、この問題が解決されています。

V12 プレビューでは、クラスター化インデックスを持たないテーブルを作成できます。この機能は、クエリ結果からテーブルを作成する T-SQL SELECT...INTO ステートメントのサポートに特に役立ちます。

http://azure.microsoft.com/en-us/documentation/articles/sql-database-preview-whats-new/

于 2015-01-14T01:10:09.583 に答える
2

#プレフィックスを使用してテーブルを作成します。たとえばcreate table #itemsearch、 を使用しますinsert into。一時テーブルのスコープはセッションに限定されるため、同時実行の問題は発生しません。

于 2013-03-12T11:39:11.230 に答える
-1

よく知られているように、SQL Azure テーブルにはクラスター化されたインデックスが必要です。そのため、あるテーブルから別のテーブルにデータをコピーするときに SELECT INTO が失敗します。移行する場合は、最初に同じ構造のテーブルを作成してから、INSERT INTO ステートメントを実行する必要があります。# が後に続く一時テーブルの場合、インデックスを作成する必要はありません。

インデックスを作成する方法と、一時テーブルに対して挿入を実行する方法は?

于 2015-08-01T06:40:45.397 に答える