2014-01-16 2 views
0

Извините за плохой титул, я еще не придумал лучшего.Вставьте несколько записей со значениями, основанными друг на друга

В настоящее время я оптимизирую инструмент, который в основном делает тысячи выборок и вставок.

Предположим следующее соотношение

class A 
{ 
    public long ID; // This is an automatic key by the sqlserver 
    ...Some other values 
} 

class B 
{ 
    public long RefID // Reference to A.ID; 
    ... some other values... 
} 

class C 
{ 
    public long RefID // Reference to A.ID; 
    ... some other values 
} 

Что в настоящее время происходит является ВЫБРАТЬ, чтобы получить Objecta, , если оно не существует, создайте новый. Запрос возвращает идентификатор (OUTPUT INSERTED.ID)

Затем он выбирает (вставки, если не несуществующие) объекты В и С.

Есть ли способ, чтобы сжать это в одном операторе SQL?

Im борется за ту часть, где происходит автоматическая генерация объекта A.

Так он должен сделать что-то вроде этого:

IF NOT EXISTS(SELECT * FROM TableA WHERE someConditions) 
    INSERT... and get the ID 
ELSE 
    REMEMBER THE ID? 

IF NOT EXISTS(SELECT * FROM TableB WERE RefID = ourRememberedID) 
    INSERT... 

IF NOT EXISTS(SELECT * FROM TableC WERE RefID = ourRememberedID) 
    INSERT... 

Пожалуйста, обратите внимание, что хранимые процедуры не могут быть использованы.

+0

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

+0

К сожалению, хранимые процедуры не являются опцией в этой среде ... – CSharpie

+0

Сохраненные процедуры не являются опцией? В 2014? –

ответ

0

Небольшая помощь
Вы могли бы выпустить эти три в одном операторе используйте устройство DataReader NextResult

select ID from FROM TableA WHERE someConditions 
select count(*) from TableB where refID = (select ID from FROM TableA WHERE someConditions) 
select count(*) from TableC where refID = (select ID from FROM TableA WHERE someConditions) 

Но даже тогда вы берете на себя риск в TableB или TableC имел вставку, прежде чем вы получили к нему

Если я не мог использовать хранимую процедуру, я думаю, что загрузил данные в #temp с помощью TVP
Я думаю, что вы могли бы сделать 4 заявления в транзакции

+0

Im делает это сейчас, экономит 2/3 времени – CSharpie

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