Вставить значения из табличной переменной в уже СУЩЕСТВУЮЩУЮ временную таблицу

Я успешно вставляю значения из переменной таблицы в новую (еще не существующую таблицу) временную таблицу. Не возникает проблем при вставке небольшого количества строк (например, 10 000), но при вставке в переменную таблицы большого количества строк (например, 30 000) возникает ошибка «На сервере недостаточно памяти и внешних ресурсов). проблема: я разделил свои (60 000) строк переменных таблицы на небольшие партии (например, 10 000) в каждой, думая, что смогу вставить новые данные в уже существующую временную таблицу, но я получаю это сообщение об ошибке:

В базе данных уже есть объект с именем '##TempTable'.

Мой код:

USE MyDataBase;
Go

Declare @@TableVariable TABLE
(
[ID] bigint PRIMARY KEY,
[BLD_ID] int NOT NULL
-- 25 more columns
)
Insert Into @@TableVariable VALUES
(1,25),
(2,30)
-- 61,000 more rows

Select * Into #TempTable From @@TableVariable;
Select Count(*) From #TempTable;

Ниже приведено сообщение об ошибке, которое я получаю

введите здесь описание изображения


person enigma6205    schedule 06.05.2016    source источник
comment
Я предполагаю, что это предел для сценариев.   -  person Gordon Linoff    schedule 07.05.2016
comment
Помните, что @@Tables хранятся в памяти, поэтому, если у вас есть сообщение OutOfmemory, возможно, вам не хватает памяти. Я предложил создать pyhiscal tempTable (без @@Table), если вы можете, и проверить, получаете ли вы такое же сообщение.   -  person Beto    schedule 07.05.2016
comment
У меня нет разрешения на создание чего-либо... Вы случайно не знаете, могу ли я добавить новые данные в существующую TempTable из источника Table Variable?   -  person enigma6205    schedule 07.05.2016


Ответы (1)


Проблема в том, что SELECT INTO хочет создать целевую таблицу, поэтому при втором запуске вы получаете ошибку.

сначала вам нужно создать #TempTable:

/* this creates the temptable copying the @TableVariable structure*/
Select * 
Into #TempTable 
From @TableVariable
where 1=0;

теперь вы можете перебирать свои партии и вызывать эту вставку столько раз, сколько хотите.

insert Into #TempTable 
Select * From @TableVariable;

обратите внимание, что #TempTable отличается от ##TempTable ( # = Local, ## = Global ) и не забудьте удалить его, когда закончите.

также вы должны НЕ использовать @@ для своей табличной переменной, используйте только @TableVariable

Я надеюсь, что это поможет

person MtwStark    schedule 16.06.2016