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

Откуда:
Сообщений: 27
Здравствуйте уважаемые форумчане.
Подобная тема уже есть на форуме, на на мой взгляд название темы не отражает суть, да и решение проблемы из неё я так и не нашёл
Задача:
есть некий код
with d as ( select * from Dogovors where type_id = @type_id and first_date <= @last_date and @first_date <= last_date )
  select * 
    from d 
    where not exists( select * from d as d1 where d.Client_id = d1.Client_id and d.first_date <= d1.last_date and d1.first_date <= d.last_date )


задача: определить переменные @type_id, @first_date, @last_date

пробую через declare перед with

DECLARE
@first_date date = '2018-12-01',
@last_date date = '2018-12-31',
@type_id int = 1
WITH...

ошибка:
[Err] 42000 - [SQL Server]Неправильный синтаксис около ключевого слова "with". Если эта инструкция является обобщенным табличным выражением, предложением xmlnamespaces или предложением в контексте отслеживания изменений, предыдущую инструкцию необходимо завершить точкой с запятой.


пробую поставить ; после завершения инструкции declare
DECLARE
@first_date date = '2018-12-01',
@last_date date = '2018-12-31',
@type_id int = 1
;
WITH...

получаю ошибку
[Err] 42000 - [SQL Server]Необходимо объявить скалярную переменную "@last_date".
23 янв 19, 09:11    [21791768]     Ответить | Цитировать Сообщить модератору
 Re: объявление переменной до with  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1527
Domianos,
вы ищете не там, где потеряли...
в вашей ситуации все говорит о том, что @last_date в декларации и @last_date в запросе - две разные вещи. Сделайте их одинаковыми. Для чего проверьте все буковки, особенно схожие по виду с кириллицей.
23 янв 19, 09:19    [21791775]     Ответить | Цитировать Сообщить модератору
 Re: объявление переменной до with  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Domianos,

Суть в том, что у вас MySql
23 янв 19, 09:47    [21791796]     Ответить | Цитировать Сообщить модератору
 Re: объявление переменной до with  [new]
iap
Member

Откуда: Москва
Сообщений: 46983
Domianos
DECLARE
@first_date date = '2018-12-01',
@last_date date = '2018-12-31',
@type_id int = 1
;
WITH...
А так сработает?
DECLARE @first_date date;
DECLARE @last_date date;
DECLARE @type_id int;
SET @first_date = '2018-12-01';
SET @last_date = '2018-12-31';
SET @type_id = 1;
WITH...
23 янв 19, 10:19    [21791824]     Ответить | Цитировать Сообщить модератору
 Re: объявление переменной до with  [new]
iap
Member

Откуда: Москва
Сообщений: 46983
Domianos,

и что возвращает
PRINT @@VERSION;
???
23 янв 19, 10:19    [21791825]     Ответить | Цитировать Сообщить модератору
 Re: объявление переменной до with  [new]
Domianos
Member

Откуда:
Сообщений: 27
TaPaK,
да нет, это ms sqlserver
23 янв 19, 11:00    [21791876]     Ответить | Цитировать Сообщить модератору
 Re: объявление переменной до with  [new]
Domianos
Member

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

[SQL]PRINT @@VERSION
Microsoft SQL Server 2008 (SP3) - 10.0.5512.0 (Intel X86)
Aug 22 2012 15:16:00
Copyright (c) 1988-2008 Microsoft Corporation
Enterprise Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2)

Affected rows: 0
Time: 0.024s
23 янв 19, 11:00    [21791878]     Ответить | Цитировать Сообщить модератору
 Re: объявление переменной до with  [new]
Domianos
Member

Откуда:
Сообщений: 27
iap
Domianos
DECLARE
@first_date date = '2018-12-01',
@last_date date = '2018-12-31',
@type_id int = 1
;
WITH...
А так сработает?
DECLARE @first_date date;
DECLARE @last_date date;
DECLARE @type_id int;
SET @first_date = '2018-12-01';
SET @last_date = '2018-12-31';
SET @type_id = 1;
WITH...


нет. таже ошибка
23 янв 19, 11:01    [21791883]     Ответить | Цитировать Сообщить модератору
 Re: объявление переменной до with  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Domianos,

полностью запрос показывайте
23 янв 19, 11:02    [21791885]     Ответить | Цитировать Сообщить модератору
 Re: объявление переменной до with  [new]
Domianos
Member

Откуда:
Сообщений: 27
Sergey Sizov
Domianos,
вы ищете не там, где потеряли...
в вашей ситуации все говорит о том, что @last_date в декларации и @last_date в запросе - две разные вещи. Сделайте их одинаковыми. Для чего проверьте все буковки, особенно схожие по виду с кириллицей.


попробовал, нет
тут суть в том что почемуто в with он не видит декларированные до него переменные,
а вот в основном селекте - без проблем
23 янв 19, 11:03    [21791887]     Ответить | Цитировать Сообщить модератору
 Re: объявление переменной до with  [new]
Domianos
Member

Откуда:
Сообщений: 27
TaPaK
Domianos,

полностью запрос показывайте


DECLARE
@first_date date = '2018-12-01',
@last_date date = '2018-12-31',
@type_id int = 1;
with d as ( select * from Dogovors where  first_date <= @last_date and @first_date <= last_date and type_id = @type_id )
  select * 
    from d
    where not exists( select * from d as d1 where d.Client_id = d1.Client_id and d.first_date <= d1.last_date and d1.first_date <= d.last_date )
go
23 янв 19, 11:06    [21791895]     Ответить | Цитировать Сообщить модератору
 Re: объявление переменной до with  [new]
court
Member

Откуда:
Сообщений: 2021
Domianos,

всё он "видит"
ты вместо того, что бы "диагнозы ставить", код полностью показал

declare @n int=100
;with cte as 
	(select * from master..spt_values where number<@n)
select * from cte 
23 янв 19, 11:07    [21791897]     Ответить | Цитировать Сообщить модератору
 Re: объявление переменной до with  [new]
Domianos
Member

Откуда:
Сообщений: 27
таблица
Dogovors(
	Client_id	int 	not null 	-- клиент
	,type_id	int 	not null		-- тип договора
	,first_date	date	not null		-- первый день действия договора
	,last_date	date			-- последний день действия договора (м.б. не указан)
)
23 янв 19, 11:08    [21791899]     Ответить | Цитировать Сообщить модератору
 Re: объявление переменной до with  [new]
Domianos
Member

Откуда:
Сообщений: 27
court
Domianos,

всё он "видит"
ты вместо того, что бы "диагнозы ставить", код полностью показал

declare @n int=100
;with cte as 
	(select * from master..spt_values where number<@n)
select * from cte 


сделал под свою таблицу
declare @n int=1
;with cte as 
	(select * from Dogovors where type_id=@n)
select * from cte 


ошибка
[Err] 42000 - [SQL Server]Необходимо объявить скалярную переменную "@n".
23 янв 19, 11:10    [21791905]     Ответить | Цитировать Сообщить модератору
 Re: объявление переменной до with  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Domianos
court
Domianos,

всё он "видит"
ты вместо того, что бы "диагнозы ставить", код полностью показал

declare @n int=100
;with cte as 
	(select * from master..spt_values where number<@n)
select * from cte 


сделал под свою таблицу
declare @n int=1
;with cte as 
	(select * from Dogovors where type_id=@n)
select * from cte 


ошибка
[Err] 42000 - [SQL Server]Необходимо объявить скалярную переменную "@n".


Указанные запросы рабочие и на 2008
23 янв 19, 11:11    [21791906]     Ответить | Цитировать Сообщить модератору
 Re: объявление переменной до with  [new]
court
Member

Откуда:
Сообщений: 2021
Domianos
declare @n int=1
;with cte as 
	(select * from Dogovors where type_id=@n)
select * from cte
а ты где это всё выполняешь ?
Не SSMS-е ?
23 янв 19, 11:12    [21791907]     Ответить | Цитировать Сообщить модератору
 Re: объявление переменной до with  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
судя по тексту ошибок это через какой-то ODBC, смотрите что там
23 янв 19, 11:13    [21791909]     Ответить | Цитировать Сообщить модератору
 Re: объявление переменной до with  [new]
court
Member

Откуда:
Сообщений: 2021
Domianos,

в общем, на крайняк, можно все твои переменные задать в ещё одном сте и дальше использовать
типа
with 
d0 as (select cast('2018-12-01' as date) as first_date, cast('2018-12-31' as date) as last_date, 1 as type_id )
,d as ( select * from Dogovors d1 cross join d0 where d1.type_id = d0.type_id and d1.first_date <= d0.last_date and d0.first_date <= d1.last_date )
  select * 
    from d 
    where not exists( select * from d as d1 where d.Client_id = d1.Client_id and d.first_date <= d1.last_date and d1.first_date <= d.last_date )
23 янв 19, 11:20    [21791915]     Ответить | Цитировать Сообщить модератору
 Re: объявление переменной до with  [new]
Domianos
Member

Откуда:
Сообщений: 27
делаю в Navicat Premium в разделе Query

хах, мб действительно в этом трабла
23 янв 19, 11:20    [21791917]     Ответить | Цитировать Сообщить модератору
 Re: объявление переменной до with  [new]
Domianos
Member

Откуда:
Сообщений: 27
court,

спасибо, если что попробую
23 янв 19, 11:21    [21791918]     Ответить | Цитировать Сообщить модератору
 Re: объявление переменной до with  [new]
iap
Member

Откуда: Москва
Сообщений: 46983
Domianos
iap,

[SQL]PRINT @@VERSION
Microsoft SQL Server 2008 (SP3) - 10.0.5512.0 (Intel X86)
Aug 22 2012 15:16:00
Copyright (c) 1988-2008 Microsoft Corporation
Enterprise Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2)

Affected rows: 0
Time: 0.024s
А что вернёт это:
EXEC sp_dbcmptlevel <ИмяБазы>
???
23 янв 19, 11:24    [21791920]     Ответить | Цитировать Сообщить модератору
 Re: объявление переменной до with  [new]
Domianos
Member

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

[SQL]EXEC sp_dbcmptlevel ARCHDOC_1

Текущий уровень совместимости 100.

Affected rows: 0
Time: 0.033s
23 янв 19, 11:26    [21791922]     Ответить | Цитировать Сообщить модератору
 Re: объявление переменной до with  [new]
iap
Member

Откуда: Москва
Сообщений: 46983
Domianos
iap,

[SQL]EXEC sp_dbcmptlevel ARCHDOC_1

Текущий уровень совместимости 100.

Affected rows: 0
Time: 0.033s
Всё должно работать. Я тут у себя проверил...
Попробуйте, всё же, в MS SQL ManagerStudio выполнить.
23 янв 19, 11:27    [21791924]     Ответить | Цитировать Сообщить модератору
 Re: объявление переменной до with  [new]
Domianos
Member

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

проверил в SSMS действительно все работает,
ох уж этот Navicat.
всем спасибо!!!

вопрос закрыт!
23 янв 19, 11:30    [21791928]     Ответить | Цитировать Сообщить модератору
 Re: объявление переменной до with  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31371
Domianos
делаю в Navicat Premium в разделе Query

хах, мб действительно в этом трабла
Удивительно, как это у него получается, он что, запросы правит, перед тем, как отослать их на сервер???
23 янв 19, 11:44    [21791944]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить