2014-12-01 3 views
0

Я занимался чтением и исследованиями для некоторых вещей, над которыми я работаю. Я знаю, что делают объемные вставки и как их делать. Хотя я нахожусь в блоке. Используя триггеры sql, вы можете сделать некоторые интересные вещи на вставке. Но что происходит на объемной вставке. В основном. делает ли объемная вставка чем-то вроде этого в простом контекстеМассовая вставка. Что это на самом деле?

Insert into table values('some value')--->sql triger 
Insert into table values('some value')--->sql triger 
Insert into table values('some value')--->sql triger 

и так далее. , в этом случае после каждой строки срабатывает триггер для вставки, и sql будет ждать, пока это не будет выполнено до тех пор, пока не будет достигнута следующая строка.

Я немного читал здесь on bulk inserts и обнаружил, что всегда будет лучше. Но как это влияет на триггеры для вставки? Извинения за любые плохие объяснения или что-то еще.

ответ

0

Как документировано, триггеры не работают на объемной вставке.

Но вы можете вставлять массив в временную таблицу, затем делать INSERT INTO SELECT FROM TEMP TABLE, и вы получаете все преимущества как для быстрой загрузки, так и для запуска и т. Д.

Если вы делаете C#, то это также позволяет избежать ужасного кода блокировки в классе SqlBulkCopy (в таблице).

+0

Мне нравится простота при работе, и я действительно не понимаю, что именно происходит. С решением в руке у меня есть еще один вопрос, который я добавлю к моему вопросу через мгновение. – Jonny

+2

Другой вопрос, который вы НЕ ДОБАВЛЯЕТЕ, ВЫ СПРОСИТЕ это - в отдельном вопросе. У этого есть ответ. – TomTom

0

В SQL триггеры на таблицах могут выполняться как для каждой строки, так и для каждого оператора. Поведение, которое вы описываете, характерно для триггеров, которые выполняются для каждой строки, но SQL-код SQL (так называемый Transact-SQL) не поддерживает их. В SQL Server есть только триггеры для каждого оператора.

Кроме того, если под «навалом вставить» вы имеете в виду конкретное BULK INSERT заявление Transact-SQL, то, что TomTom сказал в ответ его почти правда: триггеры не выполняются на BULK INSERT по умолчанию. Вы можете указать, что они делают, добавив предложение FIRE_TRIGGERS, и в этом случае каждый триггер вставки будет выполняться один раз для каждого оператора, как уже было объяснено.