Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
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] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
Функция пользовательская, на одном сервере есть, на другом нет |
13 окт 15, 16:02 [18273467] Ответить | Цитировать Сообщить модератору |
MSSQLAndDotNet Member Откуда: Сообщений: 10398 |
да вроде есть К сообщению приложен файл. Размер - 5Kb |
13 окт 15, 16:05 [18273489] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
уровень совместимости баз одинаковый поставьте |
13 окт 15, 16:07 [18273509] Ответить | Цитировать Сообщить модератору |
MSSQLAndDotNet Member Откуда: Сообщений: 10398 |
навсякий случай обновил ф-ю все равно ошибка та же |
13 окт 15, 16:07 [18273511] Ответить | Цитировать Сообщить модератору |
MSSQLAndDotNet Member Откуда: Сообщений: 10398 |
момент |
||
13 окт 15, 16:07 [18273516] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37143 |
Уровень совместимости баз поди разный. |
13 окт 15, 16:08 [18273522] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47049 |
Чтобы в аргумент табличной функции поставить имя поля таблицы, надо пользоваться 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] Ответить | Цитировать Сообщить модератору |
MSSQLAndDotNet Member Откуда: Сообщений: 10398 |
поставил уровень совместимости 2008(90) все норм Спасибо! |
13 окт 15, 16:12 [18273557] Ответить | Цитировать Сообщить модератору |
MSSQLAndDotNet Member Откуда: Сообщений: 10398 |
момент |
||
13 окт 15, 16:13 [18273560] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47049 |
А, кстати, да, какой уровень совместимости?EXEC sp_dbcmptlevel @dbname=<DBName> |
13 окт 15, 16:14 [18273568] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47049 |
![]() |
||||
13 окт 15, 16:15 [18273571] Ответить | Цитировать Сообщить модератору |
MSSQLAndDotNet Member Откуда: Сообщений: 10398 |
был 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] Ответить | Цитировать Сообщить модератору |
MSSQLAndDotNet Member Откуда: Сообщений: 10398 |
Т.е на 2000м нельзя было ф-и в подзапросах использовать? |
13 окт 15, 16:17 [18273585] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Нельзя было поля передавать в табличные функции |
||
13 окт 15, 16:18 [18273593] Ответить | Цитировать Сообщить модератору |
MSSQLAndDotNet Member Откуда: Сообщений: 10398 |
Понятно. Всем спасибо! вопрос снят |
||||
13 окт 15, 16:18 [18273596] Ответить | Цитировать Сообщить модератору |
MSSQLAndDotNet Member Откуда: Сообщений: 10398 |
я извиняюсь а что такое (SELECT 0)T(F) Т-это псевдоним я так понял а что такое (F) ? |
||
13 окт 15, 16:22 [18273622] Ответить | Цитировать Сообщить модератору |
WarAnt Member Откуда: Питер Сообщений: 2423 |
Имя для колонки со значением 0 |
||
13 окт 15, 16:33 [18273692] Ответить | Цитировать Сообщить модератору |
MSSQLAndDotNet Member Откуда: Сообщений: 10398 |
тогда нужно было так (SELECT 0 AS F )T |
||||
13 окт 15, 16:41 [18273770] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47049 |
Но не надо брать в голову. Раз дело было в уровне совместимости. |
||||
13 окт 15, 16:43 [18273791] Ответить | Цитировать Сообщить модератору |
MSSQLAndDotNet Member Откуда: Сообщений: 10398 |
мне интересна сама конструкция, я просто не понимаю синтаксис |
||||
13 окт 15, 16:43 [18273797] Ответить | Цитировать Сообщить модератору |
MSSQLAndDotNet Member Откуда: Сообщений: 10398 |
SELECT * FROM (SELECT 0 AS F)T SELECT * FROM (SELECT 0)T(F) ну ничесе да чего техника дошла |
13 окт 15, 16:44 [18273802] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47049 |
А в случае SELECT * FROM (VALUES(0,1),(2,3),(4,5)) T(X,Y)по-другому и не напишешь. |
||||
13 окт 15, 16:45 [18273810] Ответить | Цитировать Сообщить модератору |
MSSQLAndDotNet Member Откуда: Сообщений: 10398 |
iap, т.е. алиасы колонок можно задавать чз T(X,Y) а не в самой выборке |
13 окт 15, 16:46 [18273819] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47049 |
|
||
13 окт 15, 16:47 [18273822] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |