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

Откуда:
Сообщений: 311
В BOL сказано следующее по поводу CTE
When a CTE is used in a statement that is part of a batch, the statement before it must be followed by a semicolon.

и пример
select 1

with c(a) as (select a = 1) select * from c

вываливается с ошибкой, пока не поставишь этот самый семиколон в нужное место
но если тот же пример изменить следующим образом
declare @t int
select 1
select @t = 1
with c(a) as (select a = 1) select * from c
то он прекрасно отрабатывает

Вопрос: присвоение переменной значения определяет границу нового пакета?
почему второй пример работает?
1 дек 11, 11:50    [11688253]     Ответить | Цитировать Сообщить модератору
 Re: Поведение cte  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> то он прекрасно отрабатывает

select @@version

?

Posted via ActualForum NNTP Server 1.4

1 дек 11, 11:57    [11688338]     Ответить | Цитировать Сообщить модератору
 Re: Поведение cte  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
bacalavr,
declare @t int
select 1
select @t = 1
with c(a) as (select a = 1) select * from c
Msg 319, Level 15, State 1, Line 4
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.

Для MS SQL 2008R2 требует точку с запятой перед with

Почему у Вас прекрасно работает, не знаю.
1 дек 11, 12:01    [11688374]     Ответить | Цитировать Сообщить модератору
 Re: Поведение cte  [new]
iap
Member

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

а может, у Вас так:
declare @t int
select 1
select @t = 1                                                                                                                                                                     ;
with c(a) as (select a = 1) select * from c
?
1 дек 11, 12:05    [11688402]     Ответить | Цитировать Сообщить модератору
 Re: Поведение cte  [new]
Baddy
Member

Откуда: Харьков
Сообщений: 174
iap
bacalavr,

а может, у Вас так:
declare @t int
select 1
select @t = 1                                                                                                                                                                     ;
with c(a) as (select a = 1) select * from c
?

а так работает??
1 дек 11, 12:10    [11688432]     Ответить | Цитировать Сообщить модератору
 Re: Поведение cte  [new]
bacalavr
Member

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

select @@version
Microsoft SQL Server 2008 (SP2) - 10.0.4000.0 (X64) Sep 16 2010 19:43:16 Copyright (c) 1988-2008 Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 5.2 <X64> (Build 3790: Service Pack 2)


на
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)

также все отрабатывает

может отсутствие последних сп играет свою роль?

iap,
не нашел различия между вашим и моим примером =(
1 дек 11, 12:23    [11688505]     Ответить | Цитировать Сообщить модератору
 Re: Поведение cte  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31950
Baddy
iap
bacalavr,

а может, у Вас так:

а так работает??
Разумеется, а как же, ведь есть ";".

Вы бы всё таки написали select @@version, чего скрывать-то.
1 дек 11, 12:25    [11688520]     Ответить | Цитировать Сообщить модератору
 Re: Поведение cte  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
bacalavr
iap,
не нашел различия между вашим и моим примером =(
Воспользуйтесь горизонтальным сколлбаром!
1 дек 11, 12:27    [11688539]     Ответить | Цитировать Сообщить модератору
 Re: Поведение cte  [new]
bacalavr
Member

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

оу, теперь вижу этот йаповский семиколон
нет, у меня его нет
1 дек 11, 12:27    [11688540]     Ответить | Цитировать Сообщить модератору
 Re: Поведение cte  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

и если так сделать, то даже результат "777" выдает?
declare @t int
select 1
select @t = 777
with c(a) as (select a = @t) select * from c

Posted via ActualForum NNTP Server 1.4

1 дек 11, 12:55    [11688782]     Ответить | Цитировать Сообщить модератору
 Re: Поведение cte  [new]
bacalavr
Member

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

да, выдает
1 дек 11, 13:44    [11689185]     Ответить | Цитировать Сообщить модератору
 Re: Поведение cte  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

ну, и для полной уверенности:
declare @sql nvarchar(max)
set @sql =
'declare @t int' + char(13) + char(10)
+ 'select @t = 777' + char(13) + char(10)
+ 'with c(a) as (select a = @t) select * from c'

print @sql
exec(@sql)

Posted via ActualForum NNTP Server 1.4

1 дек 11, 13:58    [11689295]     Ответить | Цитировать Сообщить модератору
 Re: Поведение cte  [new]
bacalavr
Member

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

да, и так отрабатывает

К сообщению приложен файл. Размер - 13Kb
1 дек 11, 14:43    [11689748]     Ответить | Цитировать Сообщить модератору
 Re: Поведение cte  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

нашел. при уровне совместимости базы 80 такое получается.
проверьте: exec sp_dbcmptlevel 'ИмяБазы'
в документации сходу ничего не вижу на тему. побочный эффект какой-то, возможно.
не заморачивайтесь - при переводе в правильный уровень вылезают ошибки.

Posted via ActualForum NNTP Server 1.4

1 дек 11, 15:04    [11689962]     Ответить | Цитировать Сообщить модератору
 Re: Поведение cte  [new]
bacalavr
Member

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

ага, база как раз 80 уровень совместимости
1 дек 11, 15:18    [11690114]     Ответить | Цитировать Сообщить модератору
 Re: Поведение cte  [new]
ZOOKABAKODER
Member

Откуда:
Сообщений: 178
Ну вообще на такие случаи мегадоллар уже с себя ответственность снял, отправив в resticted инструкции не оканчивающиеся на ";". Так что увы надо теперь писать так:
select 1;

with c(a) as (select a = 1) select * from c;
Радоваться что всё работает и любить господина ПэЖэ.
1 дек 11, 16:42    [11690892]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить