2013-09-15 5 views
5

У меня очень сложная таблица, я бы хотел сделать временную резервную копию, пока я внес некоторые изменения. Как правило, я бы просто сделать следующее:SQL Azure не поддерживает 'select to' - Есть ли другой способ?

SELECT * 
INTO temp_User 
FROM dbo.[User] AS u 

К сожалению, я использую Azure, и, кажется, это не поддерживается:

Msg 40510, уровень 16, состояние 1, строка 2 Заявление «SELECT INTO» не поддерживает в этой версии SQL Server.

Есть ли способ воссоздать эту функцию в функции, возможно? Я мог бы сделать это, написав таблицу, создав ее, а затем вставив данные с помощью оператора select, но учитывая, как часто я использую Azure, и сколько баз данных, которые мне нужно для работы в этой области, это очень громоздко.

+0

Один из sulotions: http://stackoverflow.com/a/34877208/1151741 – Nigrimmist

ответ

5

новая Azure DB Update preview была эта проблема решена:

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

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

0
INSERT INTO temp_User 
SELECT * FROM dbo.[User] 

Вы можете попробовать вышеуказанное. Это в основном отборное, который применяется к вставки заявления

http://blog.sqlauthority.com/2011/08/10/sql-server-use-insert-into-select-instead-of-cursor/

+0

синтаксически неправильного? И я не думаю, что вы имели в виду вставку? – Codingo

+0

Синтаксис исправлен – TGH

8

Azure требуется кластерный индекс для всех таблиц, поэтому SELECT INTO не поддерживается.

Вы должны:

CREATE TABLE temp_User() --fill in table structure 
INSERT INTO temp_User 
SELECT * 
FROM dbo.[User] 

В таблице сценария легко вы можете написать свой собственный или использовать один из ответов на этот вопрос:

Script CREATE Table SQL Server

Update: As Иордан Б. указал, что V12 будет включать поддержку куч (без требования к кластерному индексу), что означает, что будет работать SELECT INTO. В настоящий момент доступен V12 Preview, Microsoft, конечно же, рекомендует только обновлять тестовые базы данных.

+0

Уверен, я понимаю это и упомянул об этом в моем первоначальном вопросе - но есть ли способ воссоздать этот процесс (возможно, используя системные таблицы?) – Codingo

+0

А, да, см. Обновленный. –

+0

Отлично, спасибо большое! – Codingo

1

К сожалению, это невозможно сделать. Вот как я работал вокруг него:

  1. Open Management SQL Server Studio
  2. правой кнопкой мыши на таблице
  3. Выбор сценария, как ... Создание таблицы
  4. Редактировать сгенерированный скрипт, чтобы изменить имя таблицы к тому, что вы указали в запросе
  5. Выполнить ваш запрос
0

Давайте предположим, что у вас есть таблица с Id, COLUMN1 и COLUMN2. Тогда это может быть вашим решением.

CREATE TABLE YourTableName_TMP .... 
GO 
SET IDENTITY_INSERT YourTableName_TMP ON 
GO 
INSERT INTO YourTableName_TMP 
([Id] ,[Column1] ,[Column2])  
SELECT [Id] ,[Column1] ,[Column2] 
FROM 
(
    SELECT * 
    FROM 
    (
     SELECT [Id] ,[Column1] ,[Column2] ROW_NUMBER() OVER(ORDER BY ID DESC) AS RowNum 
     FROM YourTableName 
    ) 
    WHERE RowNum BETWEEN 0 AND 500000 
) 
GO 
SET IDENTITY_INSERT YourTableName_TMP OFF 
GO 

Сначала вы создаете временную таблицу, а затем вставляете строки в окно. Я знаю, это беспорядок. Мой опыт заключается в том, что выполнение этого с помощью SQL Server Management Studio с клиента составляет примерно 200 000 строк в минуту.

0

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

Это мой образец. Был:

 select emrID, displayName --select into 
     into #tTable 
     from emrs 

     declare @emrid int 
     declare @counter int = 1 
     declare @displayName nvarchar(max) 

     while exists (select * from #tTable) 
     begin 
      -- some business logic 
      select top 1 @displayName = displayname 
      from #tTable 
      group by displayname 
      update emrs set groupId = @counter where @displayName = displayname  
      delete #tTable 
      where @displayName = displayname 
      set @counter = @counter + 1 
     end 
     drop table #tTable 

Modified:

 CREATE TABLE #tTable ([displayName] nvarchar(max)) --create table 
     INSERT INTO #tTable -- insert to next select : 

     select displayName    
     from emrs 

     declare @emrid int 
     declare @counter int = 1 
     declare @displayName nvarchar(max) 

     while exists (select * from #tTable) 
     begin 
      -- some business logic 
      select top 1 @displayName = t.displayName 
      from #tTable as t 
      group by t.displayname 
      update emrs set groupId = @counter where @displayName = displayname  
      delete #tTable 
      where @displayName = displayname 
      set @counter = @counter + 1 
     end 
     drop table #tTable 

Не забудьте уроните временную таблицу. Кроме того, вы можете найти более простой пример с описанием здесь: http://www.dnnsoftware.com/wiki/statement-select-into-is-not-supported-in-this-version-of-sql-server

Смежные вопросы