Замена однотипных запросов единым

roman_lenko
Дата: 07.02.2013 01:27:14
День добрый!

Подскажите, пожалуйста, есть ли какой-либо способ объеденить несколько однотипных комманд в одну? - т.е., чтобы в результате была одна общая результирующая таблица. Например:

select name, email from users where id = 1;
select name, email from users where id = 2;
select name, email from users where id = 3;
select name, email from users where id = 4;
select name, email from users where id = 5;
......
select name, email from users where id = 57;
select name, email from users where id = 58;
select name, email from users where id = 59;
.......


Т.е., как видите, комманды абсолютно одинаковы по своей структуре, исполняются быстро. Но, если обращение к SQL Server'у идет, скажем, через интерфейс .NET:

using(SqlCommand cmd = new SqlCommand(...)){
  .........
};


то получается, что для выполнения каждой комманды прийдётся создавать новую и новую инстанцию SqlCommand - что накладно с точки зрения рессурсов.

В общем, вопрос мой прост - есть ли альтернатива?

Спасибо.
=)8)
Дата: 07.02.2013 01:38:29
select name, email from users where id between 1 and 5 or id in (57,58,59)
roman_lenko
Дата: 07.02.2013 01:44:52
Спасибо. Судя по всему, я недостаточно правильно описал ситуацию.

Идентификаторы(id) не обязательно идут по порядку, т.е. может быть как:

select name, email from users where id = 1;
select name, email from users where id = 8;
select name, email from users where id = 9;
select name, email from users where id = 27;
select name, email from users where id = 643;
select name, email from users where id = 47;
....


Поэтому BETWEEN, как я понимаю, не подходит.
LenaV
Дата: 07.02.2013 02:12:47
UNION подходит?
qwerty112
Дата: 07.02.2013 02:26:38
roman_lenko
Спасибо. Судя по всему, я недостаточно правильно описал ситуацию.

Идентификаторы(id) не обязательно идут по порядку, т.е. может быть как:
...

нее, это тебе скорее всего "недошло"

тут, тебе нужно смотреть, на это
=)8)
select name, email from users where id between 1 and 5 or id in (57,58,59)

т.е. в своём "интерфейс .NET" - формируеш динамически строку запроса,
где в секции where id in (57,58,59), в IN будут перечисленны все нужные тебе ID
roman_lenko
Дата: 07.02.2013 17:02:53
select name, email from users where id between 1 and 5 or id in (57,58,59)


Ok - а зачем тогда условие "between 1 and 5 or"?
П-Л
Дата: 07.02.2013 17:05:24
roman_lenko
Спасибо. Судя по всему, я недостаточно правильно описал ситуацию.

Идентификаторы(id) не обязательно идут по порядку, т.е. может быть как:

select name, email from users where id = 1;
select name, email from users where id = 8;
select name, email from users where id = 9;
select name, email from users where id = 27;
select name, email from users where id = 643;
select name, email from users where id = 47;
....


Поэтому BETWEEN, как я понимаю, не подходит.

Вот этот вот перечень (1, 8, 9, ...) должен быть в таблице ВыбранныеСКакой-тоЦельюАйдишники. Тогда все сводится к простейшему джоину.
Мистер Хенки
Дата: 07.02.2013 17:35:20
roman_lenko,
передавайте табличную переменную серверу со всеми ид которые вам нужны, а сервер пускай вам резалсет возвращает. Это для 2008 сервера.
Для более ранних версий можно xml с идишками или список значений в строку, которые потом в процедуре разобрать и получить ту же таблицу с нужными ид. Ну вот примерно так.
leov
Дата: 07.02.2013 17:56:45
roman_lenko,
у вас вероятно какая-то проблема с архитектурой
я вот не представляю чтобы мне вот такое понадобилось писать
ну может инсерты бы я из экселевой таблицы генерил для заливки в таблицу
а вот конкретно такую кучу селектов....
вопрос - откуда все эти id взялись то?
если они из клиентской программы то закручиваете на клиенте цикл и генерите все эти селекты вставляя туда нужные id
если id растут из другой таблицы тут же в базе то надо с ней джойнить и одним селектом все сразу доставать
если хочется выпендрится можно и на стороне сервера цикл while закрутить и в нем собирать динамически эти селекты и исполнять через exec
вот тот ваш using....... это в принципе то самое и будет только не на sql написаное а на чем там у вас клиент
но вопрос - откуда вы те id возмете и как в тот using... воткнете?
.........
Мистер Хенки
Дата: 07.02.2013 18:00:54
leov
закручиваете на клиенте цикл и генерите все эти селекты вставляя туда нужные id
.........

это уж лучше на сервер таблицу или список значений передавать чем таким заниматься.