Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Есть ли такое?  [new]
I dont know
Member

Откуда: Tyumen
Сообщений: 332
Доброго всем времени суток. Пишу запрос и по использую в нём по сути несколько одинаковых подзапросов(в них меняется только один аргумент). Можно ли их как нибудь вынести в отдельную функцию или процедуру, но так чтогбы они не сохранялись на сервере, а выполнялись. Потому как вроде если объявлять процедуру declare procedure то она сохранится на серваке, с функцией тоже самое.

т.е сначала например объявляем её где-нибудь выше основного запроса
например функция вернёт выборку
функция БББ(параметры)
код
. . .
. . .

а потом используем в запросе
select A from БББ ... и т.д
9 июл 09, 09:29    [7394467]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такое?  [new]
Tosh
Member

Откуда: Vladivostok
Сообщений: 2956
Если версия 2005 или 2008 - читаем в BOL о том, что такое CLR и как этим пользоваться
9 июл 09, 09:31    [7394474]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такое?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
Пишу запрос и по использую в нём по сути несколько одинаковых подзапросов(в них меняется только один аргумент). Можно ли их как нибудь вынести в отдельную функцию или процедуру, но так чтогбы они не сохранялись на сервере, а выполнялись.


Можно создать временную хранимую процедуру, но прямой SELECT из нее невозможен. Только через вставку результата работы этой хп во временную таблицу или табличную переменную, если версия >= 2005.

ЗЫ. Привели бы пример скрипта. М.б. можно было и CTE, как-нибудь использовать...

Сообщение было отредактировано: 9 июл 09, 09:37
9 июл 09, 09:35    [7394486]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такое?  [new]
I dont know
Member

Откуда: Tyumen
Сообщений: 332
Tosh
Если версия 2005 или 2008 - читаем в BOL о том, что такое CLR и как этим пользоваться


Этот запрос который я пишу, будет потом вызываться из другой программы(т.е там будет вставлен как строка аргументом функции и выполнен, в результате вернётся таблица, которую я уже буду обрабатывать средствами этой программы), поэтому думаю использовать CLR не получится.

P.S. MS SQL 2005
9 июл 09, 09:42    [7394515]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такое?  [new]
Tosh
Member

Откуда: Vladivostok
Сообщений: 2956
тьфу - о своем думаю - я о CTE говорил
9 июл 09, 09:44    [7394530]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такое?  [new]
I dont know
Member

Откуда: Tyumen
Сообщений: 332
скрипт:
set dateformat dmy
declare @avtor table(anl int, nam varchar(64), cnt int);

insert into @avtor
select avtor_t.analit as analit, avtor_t.namean as nam, count(avtor_t.analit) as cnt from mbanalit,   	
			(select analit, namean  from mbanalit where vid = '3311' and (ourfirm2 = '38838' and fio is not null)) avtor_t
	 where vid = '3318' and (avtorrezolucii = avtor_t.analit) and otvetst = '121523' and (date5 between '01.01.2008' and '30.06.2008')
	 group by avtor_t.analit, avtor_t.namean

declare @avtor2 table(anl int, nam varchar(64), cnt int);
insert into @avtor2
select avtor_t.analit as analit, avtor_t.namean as nam, count(avtor_t.analit) as cnt from mbanalit,   	
			(select analit, namean  from mbanalit where vid = '3311' and (ourfirm2 = '38838' and fio is not null)) avtor_t
	 where vid = '3318' and (avtorrezolucii = avtor_t.analit) and otvetst = '121523' and (date5 between '01.01.2009' and '30.06.2009')
	 group by avtor_t.analit, avtor_t.namean

declare @full_avtor table(code int, nam varchar(64));
insert into @full_avtor
select analit, namean  from mbanalit where vid = '3311' and (ourfirm2 = '38838' and fio is not null)

select fav.nam, avt.cnt as '2008', avt2.cnt as '2009', avt2.cnt-avt.cnt as 'Динамика' from 
     @full_avtor fav left join @avtor avt
	 on fav.code = avt.anl left join @avtor2 avt2 
	 on avt2.anl = fav.code

здесь отличие в avtor и avtor2 только в датах... как понимаете писать одно и тоже дважды(даже четырежды, потому как сейчас ещё добавлю парочку таких, только условие немного другим будет, а так тоже самое) не есть хорошо, посему и прошу совета )
9 июл 09, 09:47    [7394543]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такое?  [new]
I dont know
Member

Откуда: Tyumen
Сообщений: 332
как я понял параметры в CTE тоже можно использовать? тогда это похоже то что нужно :)
9 июл 09, 09:52    [7394575]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такое?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
I dont know,

у Вас INSERTы в разные табличные переменные. Поэтому CTE не поможет.
А переделать на INSERT в одну таблицу никак нельзя? Записи же всё равно датами отличаются.
Можно и поле специальное добавить, чтобы различать, откуда записи пришли.

P.S. Вместо SET DATEFORMAT лучше применяйте строковое представление даты 'YYYYMMDD'
9 июл 09, 09:57    [7394610]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такое?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Убей те меня, не пойму, зачем здесь временные таблицы, вставка в них и затем выборка из них. Юзайте derived tables.
9 июл 09, 10:00    [7394628]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такое?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
pkarklin
Убей те меня, не пойму, зачем здесь временные таблицы, вставка в них и затем выборка из них. Юзайте derived tables.
+1000
Последний SELECT я что-то не досмотрел. Это всё для него делается?
9 июл 09, 10:03    [7394644]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такое?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
pkarklin
Убей те меня, не пойму, зачем здесь временные таблицы, вставка в них и затем выборка из них. Юзайте derived tables.


Читать как "табличные переменные".
9 июл 09, 10:04    [7394653]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такое?  [new]
I dont know
Member

Откуда: Tyumen
Сообщений: 332
iap,

да, это всё для него... в нём всё собирается "в кучу" ))
9 июл 09, 10:05    [7394663]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такое?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
I dont know
iap,

да, это всё для него... в нём всё собирается "в кучу" ))
А что мешает написать просто один
SELECT ... FROM mbanalit WHERE ...
?
9 июл 09, 10:10    [7394705]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такое?  [new]
I dont know
Member

Откуда: Tyumen
Сообщений: 332
iap,

думаю он получится огромным, и я сам в нём запутаюсь раньше чем допишу его )))
9 июл 09, 10:19    [7394757]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такое?  [new]
I dont know
Member

Откуда: Tyumen
Сообщений: 332
склепал вот такой CTE :

with avtor_2 as
(
	select avtor_t.analit as analit, avtor_t.namean as nam, count(avtor_t.analit) as cnt from mbanalit,   	
			(select analit, namean  from mbanalit where vid = '3311' and (ourfirm2 = '38838' and fio is not null)) avtor_t
	 where vid = '3318' and (avtorrezolucii = avtor_t.analit) and otvetst = '121523' and (date5 between '01.01.2009' and '30.06.2009')
	 group by avtor_t.analit, avtor_t.namean
)

выжделил этот кусок, запустил, он почему то на последнюю скобку ругается... хотя запрос в нём рабочий, может не так что написал?
9 июл 09, 10:28    [7394812]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такое?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
I dont know
склепал вот такой CTE :

with avtor_2 as
(
	select avtor_t.analit as analit, avtor_t.namean as nam, count(avtor_t.analit) as cnt from mbanalit,   	
			(select analit, namean  from mbanalit where vid = '3311' and (ourfirm2 = '38838' and fio is not null)) avtor_t
	 where vid = '3318' and (avtorrezolucii = avtor_t.analit) and otvetst = '121523' and (date5 between '01.01.2009' and '30.06.2009')
	 group by avtor_t.analit, avtor_t.namean
)

выжделил этот кусок, запустил, он почему то на последнюю скобку ругается... хотя запрос в нём рабочий, может не так что написал?
А SELECT или INSERT или UPDATE или DELETE из CTE кто писать будет?
9 июл 09, 10:35    [7394886]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такое?  [new]
I dont know
Member

Откуда: Tyumen
Сообщений: 332
тут я просто его выделил и запустил, проверял всё ли правильно, нет ли ошибок.. всегда так делаю, например вложенный какой-то подзапрос выделил и запустил, проверил всё ли работает... даже если ничего не возвращается то хотя бы сообщений об ошибке не появляется, пишется что обработано столько-то строк и всё... а тут он прям заругался... ))))) значит как я понял для CTE надо сразу выборку из него делать? А то как я понял он ругается на этот CTE в принципе
9 июл 09, 10:43    [7394958]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такое?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
I dont know
значит как я понял для CTE надо сразу выборку из него делать? А то как я понял он ругается на этот CTE в принципе
Я ж Вам поэтому и говорил, что для нескольких INSERTов (в разные таблицы) CTE не поможет.
9 июл 09, 11:31    [7395317]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такое?  [new]
I dont know
Member

Откуда: Tyumen
Сообщений: 332
всё не могу никак понять, при чём тут INSERT я же ничего не вставляю в CTE, чёт я нитак делаю... т.е полный запрос получился

set dateformat dmy
declare @avtor table(anl int, nam varchar(64), cnt int);

insert into @avtor
select avtor_t.analit as analit, avtor_t.namean as nam, count(avtor_t.analit) as cnt from mbanalit,   	
			(select analit, namean  from mbanalit where vid = '3311' and (ourfirm2 = '38838' and fio is not null)) avtor_t
	 where vid = '3318' and (avtorrezolucii = avtor_t.analit) and otvetst = '121523' and (date5 between '01.01.2008' and '30.06.2008')
	 group by avtor_t.analit, avtor_t.namean

declare @avtor2 table(anl int, nam varchar(64), cnt int);
insert into @avtor2
select avtor_t.analit as analit, avtor_t.namean as nam, count(avtor_t.analit) as cnt from mbanalit,   	
			(select analit, namean  from mbanalit where vid = '3311' and (ourfirm2 = '38838' and fio is not null)) avtor_t
	 where vid = '3318' and (avtorrezolucii = avtor_t.analit) and otvetst = '121523' and (date5 between '01.01.2009' and '30.06.2009')
	 group by avtor_t.analit, avtor_t.namean

declare @full_avtor table(code int, nam varchar(64));
insert into @full_avtor
select analit, namean  from mbanalit where vid = '3311' and (ourfirm2 = '38838' and fio is not null)

-- этот кусок я добавил, выделил его и F5(запустил) и он началругаться---------------------------
with avtor_2 as
(
	select avtor_t.analit as analit, avtor_t.namean as nam, count(avtor_t.analit) as cnt from mbanalit,   	
			(select analit, namean  from mbanalit where vid = '3311' and (ourfirm2 = '38838' and fio is not null)) avtor_t
	 where vid = '3318' and (avtorrezolucii = avtor_t.analit) and otvetst = '121523' and (date5 between '01.01.2009' and '30.06.2009')
	 group by avtor_t.analit, avtor_t.namean
)
----------------------------------------------------------------------------------------------------


select fav.nam, avt.cnt as '2008', avt2.cnt as '2009', avt2.cnt-avt.cnt as 'Динамика' from 
     @full_avtor fav left join @avtor avt
	 on fav.code = avt.anl left join @avtor2 avt2 
	 on avt2.anl = fav.code
9 июл 09, 12:18    [7395695]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такое?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
I dont know
всё не могу никак понять, при чём тут INSERT я же ничего не вставляю в CTE, чёт я нитак делаю... т.е полный запрос получился
Имеется в виду
WITH CTE AS
(
select avtor_t.analit as analit, avtor_t.namean as nam, count(avtor_t.analit) as cnt from mbanalit,   	
			(select analit, namean  from mbanalit where vid = '3311' and (ourfirm2 = '38838' and fio is not null)) avtor_t
	 where vid = '3318' and (avtorrezolucii = avtor_t.analit) and otvetst = '121523' and (date5 between '01.01.2008' and '30.06.2008')
	 group by avtor_t.analit, avtor_t.namean
)
insert into @avtor
from CTE;
Но, повторяю, в Вашем случае не надо никаких INSERTов.
Всё можно оформить в виде одного SELECTа, ну, может быть, нескольких
SELECTов, объединённых с помощью UNION ALL
9 июл 09, 12:26    [7395756]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такое?  [new]
I dont know
Member

Откуда: Tyumen
Сообщений: 332
Спасибо, буду пробовать :)
9 июл 09, 12:51    [7395972]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить