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

Откуда:
Сообщений: 3
declare
@query varchar(500);
set @query='

declare
@firstlimit int
set
@firstlimit =30

declare
@secondlimit int=
set @secondlimit =60

declare
@thirdlimit int
set @thirdlimit =90;

select 
distinct np.id as ''ID физлица'',
dbo.fn_get_fio(np.surname,np.name,np.patronymic) as ''ФИО'',
c.contact_content as ''Телефон'',
--o.id as ''id заказа'' ,
o.date_to_archive,
(select count(*) from orders where id_client=np.id and date_to_archive between GETDATE()-@firstlimit and GETDATE()) as [' + (select convert(varchar, GETDATE()-@firstlimit, 104) + ' - ' + convert(varchar, GETDATE(), 104)) + '],
(select count(*) from orders where id_client=np.id and date_to_archive between getdate()-@secondlimit and GETDATE()-@firstlimit) [' + (select convert(varchar, GETDATE()-@secondlimit, 104) + ' - ' + convert(varchar, GETDATE() - @firstlimit, 104)) + '],
(select count(*) from orders where id_client=np.id and date_to_archive between getdate()-@thirdlimit and GETDATE()-@secondlimit) [' + (select convert(varchar, GETDATE()-@thirdlimit, 104) + ' - ' + convert(varchar, GETDATE() - @secondlimit, 104)) + '],

from orders o
left join natural_person np on np.id=o.id_client
left join contacts c on c.id_parent=np.id and c.parent_type=0 
where 
id_client is not null
group by np.id, np.surname,np.name,np.patronymic,c.contact_content,o.id,o.date_to_archive
'

exec(@query)


Сообщение 137, уровень 15, состояние 2, строка 26
Необходимо объявить скалярную переменную "@firstlimit".
Сообщение 137, уровень 15, состояние 2, строка 27
Необходимо объявить скалярную переменную "@secondlimit".
Сообщение 137, уровень 15, состояние 2, строка 28
Необходимо объявить скалярную переменную "@thirdlimit".

Ругается на видимость переменных. Как я их только не объявлял и где, и внутри динамич. запроса, и снаружи. Подскажите как правильно решить вопрос
15 май 15, 15:16    [17645863]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL и область видимости переменных  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37202
declare
@query varchar(500);

declare
@firstlimit int
set
@firstlimit =30

declare
@secondlimit int=
set @secondlimit =60

declare
@thirdlimit int
set @thirdlimit =90;

set @query='

select 
distinct np.id as ''ID физлица'',
dbo.fn_get_fio(np.surname,np.name,np.patronymic) as ''ФИО'',
c.contact_content as ''Телефон'',
--o.id as ''id заказа'' ,
o.date_to_archive,
(select count(*) from orders where id_client=np.id and date_to_archive between GETDATE()-@firstlimit and GETDATE()) as [' + (select convert(varchar, GETDATE()-@firstlimit, 104) + ' - ' + convert(varchar, GETDATE(), 104)) + '],
(select count(*) from orders where id_client=np.id and date_to_archive between getdate()-@secondlimit and GETDATE()-@firstlimit) [' + (select convert(varchar, GETDATE()-@secondlimit, 104) + ' - ' + convert(varchar, GETDATE() - @firstlimit, 104)) + '],
(select count(*) from orders where id_client=np.id and date_to_archive between getdate()-@thirdlimit and GETDATE()-@secondlimit) [' + (select convert(varchar, GETDATE()-@thirdlimit, 104) + ' - ' + convert(varchar, GETDATE() - @secondlimit, 104)) + '],

from orders o
left join natural_person np on np.id=o.id_client
left join contacts c on c.id_parent=np.id and c.parent_type=0 
where 
id_client is not null
group by np.id, np.surname,np.name,np.patronymic,c.contact_content,o.id,o.date_to_archive
'

exec(@query)
15 май 15, 15:18    [17645879]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL и область видимости переменных  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Antykus, да ладно? Прямо везде объявляли?


declare
@firstlimit int
set
@firstlimit =30

declare
@secondlimit int=
set @secondlimit =60

declare
@thirdlimit int
set @thirdlimit =90;

declare
@query varchar(500);
set @query='
select 
distinct np.id as ''ID физлица'',
dbo.fn_get_fio(np.surname,np.name,np.patronymic) as ''ФИО'',
c.contact_content as ''Телефон'',
--o.id as ''id заказа'' ,
o.date_to_archive,
(select count(*) from orders where id_client=np.id and date_to_archive between GETDATE()-@firstlimit and GETDATE()) as [' + (select convert(varchar, GETDATE()-@firstlimit, 104) + ' - ' + convert(varchar, GETDATE(), 104)) + '],
(select count(*) from orders where id_client=np.id and date_to_archive between getdate()-@secondlimit and GETDATE()-@firstlimit) [' + (select convert(varchar, GETDATE()-@secondlimit, 104) + ' - ' + convert(varchar, GETDATE() - @firstlimit, 104)) + '],
(select count(*) from orders where id_client=np.id and date_to_archive between getdate()-@thirdlimit and GETDATE()-@secondlimit) [' + (select convert(varchar, GETDATE()-@thirdlimit, 104) + ' - ' + convert(varchar, GETDATE() - @secondlimit, 104)) + '],

from orders o
left join natural_person np on np.id=o.id_client
left join contacts c on c.id_parent=np.id and c.parent_type=0 
where 
id_client is not null
group by np.id, np.surname,np.name,np.patronymic,c.contact_content,o.id,o.date_to_archive
'

exec(@query)
15 май 15, 15:19    [17645886]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL и область видимости переменных  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37202
Ну и как бы @firstlimit в тексте запроса тоже надо раскрыть.
Или использовать sp_executesql.
15 май 15, 15:23    [17645920]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL и область видимости переменных  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Упс, ту же ошибку совершил :)

То,что я выше привел, неверно.

Если вы снаружи объявляете переменные, внутри @query к ним уже нельзя обращаться. Если внутри объявляете, нельзя обращаться снаружи (т.е. складывать их).

Поскольку вам переменные нужно запихнуть в алиас колонки, обращаться внутри к ним нельзя, обращайтесь снаружи:


set @query = '...(select count(*) from orders where id_client=np.id and date_to_archive between GETDATE()-' + cast(@firstlimit as nvarchar(max) + ' and GETDATE()) as [' + (select convert(varchar, GETDATE()-@firstlimit, 104) + ' - ' + convert(varchar, GETDATE(), 104)) + '],...'
15 май 15, 15:26    [17645946]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL и область видимости переменных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31824
Antykus
Как я их только не объявлял и где, и внутри динамич. запроса, и снаружи. Подскажите как правильно решить вопрос
При выволнении динамич. запроса посредством EXE() никакой видимости переменных не достичь. Всё - раскрывать.

При выволнении динамич. запроса посредством sp_executesql переменные, определённые наружи, можно передавать внутрь и обратно, объявив их при вызове. См. синтаксис sp_executesql
15 май 15, 18:40    [17647128]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL и область видимости переменных  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8494
Что за непотребства, называйте динамически поля в отчетах, а не в запросах.
15 май 15, 20:26    [17647430]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить