Оператор SELECT INTO не поддерживается в этой версии SQL Server - SQL Azure

Я получаю

Оператор SELECT INTO не поддерживается в этой версии SQL Server в SQL Server

для следующего запроса внутри хранимой процедуры

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

У меня около 50000 записей, поэтому я решил использовать Temp Table. Но удивился, увидев эту ошибку.

Как я могу добиться того же в 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/

  • Каждая таблица должна иметь кластерный индекс. Таблицы без кластеризованного индекса не поддерживаются.
  • Каждое соединение может использовать одну базу данных. Несколько баз данных в одной транзакции не поддерживается.
  • "ИСПОЛЬЗОВАТЬ БАЗУ ДАННЫХ" нельзя использовать в Azure.
  • Глобальные временные таблицы (или временные объекты) не поддерживаются.
  • Поскольку в настоящее время отсутствует понятие кросс-соединения с базой данных, связанный сервер не является концепцией в Azure.
  • SQL Azure является общей средой, и поэтому концепция входа в Windows отсутствует.
  • Всегда удаляйте объекты TempDB после их необходимости, поскольку они создают давление на TempDB.
  • Во время вставки вставки используйте параметр размера партии, чтобы ограничить количество строк, которые будут вставлены. Это ограничит использование пространства журнала транзакций.
  • Избегайте ненужного использования группировки или блокировки ORDER для операций, поскольку они приводят к высокому уровню использования памяти.

4 ответа

SELECT INTO это одна из многих вещей, которые вы, к сожалению, не можете выполнить в SQL Azure.

Что вам нужно сделать, это сначала создать временную таблицу, а затем выполнить вставку. Что-то вроде:

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

В новом предварительном просмотре обновления базы данных Azure эта проблема решена:

Предварительный просмотр V12 позволяет создать таблицу без кластерного индекса. Эта функция особенно полезна для поддержки оператора T-SQL SELECT...INTO, который создает таблицу из результата запроса.

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

Создать таблицу с помощью # префикс, например create table #itemsearch затем используйте insert into, Область действия временной таблицы ограничена сеансом, поэтому проблем с параллелизмом не возникнет.

Ну, как мы все знаем, таблица SQL Azure должна иметь кластеризованный индекс, поэтому при сбое SELECT INTO происходит копирование данных из одной таблицы в другую. Если вы хотите выполнить миграцию, вы должны сначала создать таблицу с той же структурой, а затем выполнить инструкцию INSERT INTO. Для временной таблицы, за которой следует #, вам не нужно создавать Index.

Как создать индекс и как выполнить вставку в для временной таблицы?

Другие вопросы по тегам