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

Откуда:
Сообщений: 10398
Почему этот запрос
		DECLARE @boss_role UNIQUEIDENTIFIER = 'e7efe413-3b7f-48c6-a085-f4576bb3d926'
		DECLARE @emp_bosses TABLE(id UNIQUEIDENTIFIER)
		INSERT INTO @emp_bosses
		SELECT e.emp_id
		FROM Employee AS e
		WHERE e.fl_deleted IS NULL AND EXISTS(SELECT r.id FROM dbo.fnEmployeeRoles(e.emp_id) AS r WHERE r.id = @boss_role)


на этом выполняется
Microsoft SQL Server 2008 (SP3) - 10.0.5520.0 (X64) Jul 11 2014 16:11:50 Copyright (c) 1988-2008 Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

, а на этом нет
Microsoft SQL Server 2008 (SP3) - 10.0.5538.0 (X64) Apr 3 2015 14:50:02 Copyright (c) 1988-2008 Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

?

Сообщение 102, уровень 15, состояние 1, строка 6
Incorrect syntax near '.'.


ругается на: dbo.fnEmployeeRoles(e.emp_id)

Спасибо.
13 окт 15, 15:59    [18273436]     Ответить | Цитировать Сообщить модератору
 Re: Дайте тынц в документацию  [new]
o-o
Guest
Функция пользовательская, на одном сервере есть, на другом нет
13 окт 15, 16:02    [18273467]     Ответить | Цитировать Сообщить модератору
 Re: Дайте тынц в документацию  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
да вроде есть

К сообщению приложен файл. Размер - 5Kb
13 окт 15, 16:05    [18273489]     Ответить | Цитировать Сообщить модератору
 Re: Дайте тынц в документацию  [new]
Glory
Member

Откуда:
Сообщений: 104751
уровень совместимости баз одинаковый поставьте
13 окт 15, 16:07    [18273509]     Ответить | Цитировать Сообщить модератору
 Re: Дайте тынц в документацию  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
навсякий случай обновил ф-ю
все равно ошибка та же
13 окт 15, 16:07    [18273511]     Ответить | Цитировать Сообщить модератору
 Re: Дайте тынц в документацию  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
Glory
уровень совместимости баз одинаковый поставьте

момент
13 окт 15, 16:07    [18273516]     Ответить | Цитировать Сообщить модератору
 Re: Дайте тынц в документацию  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Уровень совместимости баз поди разный.
13 окт 15, 16:08    [18273522]     Ответить | Цитировать Сообщить модератору
 Re: Дайте тынц в документацию  [new]
iap
Member

Откуда: Москва
Сообщений: 47194
Чтобы в аргумент табличной функции поставить имя поля таблицы, надо пользоваться APPLY.
Наверно, в плане запроса на первом сервере сначала выполняется внешний запрос и в функцию попадает константа.
А на втором сервере оптимизатор пытается сначала выполнить подзапрос, но тогда в аргумент подставляется поле таблицы.
Правда, я не уверен, может, чушь написал.
А если подзапрос написать так:
EXISTS(SELECT * FROM (SELECT 0)T(F) CROSS APPLY dbo.fnEmployeeRoles(e.emp_id) r WHERE r.id=@boss_role)
?
13 окт 15, 16:10    [18273543]     Ответить | Цитировать Сообщить модератору
 Re: Дайте тынц в документацию  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
поставил уровень совместимости 2008(90) все норм
Спасибо!
13 окт 15, 16:12    [18273557]     Ответить | Цитировать Сообщить модератору
 Re: Дайте тынц в документацию  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
iap
Чтобы в аргумент табличной функции поставить имя поля таблицы, надо пользоваться APPLY.
Наверно, в плане запроса на первом сервере сначала выполняется внешний запрос и в функцию попадает константа.
А на втором сервере оптимизатор пытается сначала выполнить подзапрос, но тогда в аргумент подставляется поле таблицы.
Правда, я не уверен, может, чушь написал.
А если подзапрос написать так:
EXISTS(SELECT * FROM (SELECT 0)T(F) CROSS APPLY dbo.fnEmployeeRoles(e.emp_id) r WHERE r.id=@boss_role)
?

момент
13 окт 15, 16:13    [18273560]     Ответить | Цитировать Сообщить модератору
 Re: Дайте тынц в документацию  [new]
iap
Member

Откуда: Москва
Сообщений: 47194
А, кстати, да, какой уровень совместимости?
EXEC sp_dbcmptlevel @dbname=<DBName>
13 окт 15, 16:14    [18273568]     Ответить | Цитировать Сообщить модератору
 Re: Дайте тынц в документацию  [new]
iap
Member

Откуда: Москва
Сообщений: 47194
MSSQLAndDotNet
iap
Чтобы в аргумент табличной функции поставить имя поля таблицы, надо пользоваться APPLY.
Наверно, в плане запроса на первом сервере сначала выполняется внешний запрос и в функцию попадает константа.
А на втором сервере оптимизатор пытается сначала выполнить подзапрос, но тогда в аргумент подставляется поле таблицы.
Правда, я не уверен, может, чушь написал.
А если подзапрос написать так:
EXISTS(SELECT * FROM (SELECT 0)T(F) CROSS APPLY dbo.fnEmployeeRoles(e.emp_id) r WHERE r.id=@boss_role)

?

момент
Очевидно, написал я чушь. Сумимасен!
13 окт 15, 16:15    [18273571]     Ответить | Цитировать Сообщить модератору
 Re: Дайте тынц в документацию  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
iap
А, кстати, да, какой уровень совместимости?
EXEC sp_dbcmptlevel @dbname=<DBName>

был 2000(80)
поставил на 2005(90)

с подзапросом
EXISTS(SELECT * FROM (SELECT 0)T(F) CROSS APPLY dbo.fnEmployeeRoles(e.emp_id) r WHERE r.id=@boss_role)

ошибка та же была
13 окт 15, 16:16    [18273578]     Ответить | Цитировать Сообщить модератору
 Re: Дайте тынц в документацию  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
Т.е на 2000м нельзя было ф-и в подзапросах использовать?
13 окт 15, 16:17    [18273585]     Ответить | Цитировать Сообщить модератору
 Re: Дайте тынц в документацию  [new]
Glory
Member

Откуда:
Сообщений: 104751
MSSQLAndDotNet
Т.е на 2000м нельзя было ф-и в подзапросах использовать?

Нельзя было поля передавать в табличные функции
13 окт 15, 16:18    [18273593]     Ответить | Цитировать Сообщить модератору
 Re: Дайте тынц в документацию  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
Glory
MSSQLAndDotNet
Т.е на 2000м нельзя было ф-и в подзапросах использовать?

Нельзя было поля передавать в табличные функции

Понятно.
Всем спасибо!
вопрос снят
13 окт 15, 16:18    [18273596]     Ответить | Цитировать Сообщить модератору
 Re: Дайте тынц в документацию  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
iap
Чтобы в аргумент табличной функции поставить имя поля таблицы, надо пользоваться APPLY.
Наверно, в плане запроса на первом сервере сначала выполняется внешний запрос и в функцию попадает константа.
А на втором сервере оптимизатор пытается сначала выполнить подзапрос, но тогда в аргумент подставляется поле таблицы.
Правда, я не уверен, может, чушь написал.
А если подзапрос написать так:
EXISTS(SELECT * FROM (SELECT 0)T(F) CROSS APPLY dbo.fnEmployeeRoles(e.emp_id) r WHERE r.id=@boss_role)
?

я извиняюсь
а что такое

(SELECT 0)T(F)


Т-это псевдоним я так понял
а что такое (F)

?
13 окт 15, 16:22    [18273622]     Ответить | Цитировать Сообщить модератору
 Re: Дайте тынц в документацию  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
MSSQLAndDotNet
Т-это псевдоним я так понял
а что такое (F)

?


Имя для колонки со значением 0
13 окт 15, 16:33    [18273692]     Ответить | Цитировать Сообщить модератору
 Re: Дайте тынц в документацию  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
WarAnt
MSSQLAndDotNet
Т-это псевдоним я так понял
а что такое (F)

?


Имя для колонки со значением 0

тогда нужно было так
(SELECT 0 AS F )T
13 окт 15, 16:41    [18273770]     Ответить | Цитировать Сообщить модератору
 Re: Дайте тынц в документацию  [new]
iap
Member

Откуда: Москва
Сообщений: 47194
MSSQLAndDotNet
iap
Чтобы в аргумент табличной функции поставить имя поля таблицы, надо пользоваться APPLY.
Наверно, в плане запроса на первом сервере сначала выполняется внешний запрос и в функцию попадает константа.
А на втором сервере оптимизатор пытается сначала выполнить подзапрос, но тогда в аргумент подставляется поле таблицы.
Правда, я не уверен, может, чушь написал.
А если подзапрос написать так:
EXISTS(SELECT * FROM (SELECT 0)T(F) CROSS APPLY dbo.fnEmployeeRoles(e.emp_id) r WHERE r.id=@boss_role)

?

я извиняюсь
а что такое

(SELECT 0)T(F)



Т-это псевдоним я так понял
а что такое (F)

?
Просто CROSS APPLY же не напишешь.
Но не надо брать в голову. Раз дело было в уровне совместимости.
13 окт 15, 16:43    [18273791]     Ответить | Цитировать Сообщить модератору
 Re: Дайте тынц в документацию  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
iap
MSSQLAndDotNet
пропущено...

я извиняюсь
а что такое

(SELECT 0)T(F)



Т-это псевдоним я так понял
а что такое (F)

?
Просто CROSS APPLY же не напишешь.
Но не надо брать в голову. Раз дело было в уровне совместимости.

мне интересна сама конструкция, я просто не понимаю синтаксис
13 окт 15, 16:43    [18273797]     Ответить | Цитировать Сообщить модератору
 Re: Дайте тынц в документацию  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
SELECT * FROM
(SELECT 0 AS F)T


SELECT * FROM
(SELECT 0)T(F)


ну ничесе да чего техника дошла
13 окт 15, 16:44    [18273802]     Ответить | Цитировать Сообщить модератору
 Re: Дайте тынц в документацию  [new]
iap
Member

Откуда: Москва
Сообщений: 47194
MSSQLAndDotNet
WarAnt
пропущено...


Имя для колонки со значением 0

тогда нужно было так
(SELECT 0 AS F )T
Можно и так, и так.
А в случае
SELECT * FROM (VALUES(0,1),(2,3),(4,5)) T(X,Y)
по-другому и не напишешь.
13 окт 15, 16:45    [18273810]     Ответить | Цитировать Сообщить модератору
 Re: Дайте тынц в документацию  [new]
MSSQLAndDotNet
Member

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

т.е. алиасы колонок можно задавать чз T(X,Y) а не в самой выборке
13 окт 15, 16:46    [18273819]     Ответить | Цитировать Сообщить модератору
 Re: Дайте тынц в документацию  [new]
iap
Member

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

т.е. алиасы колонок можно задавать чз T(X,Y) а не в самой выборке
И всегда можно было!
13 окт 15, 16:47    [18273822]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить