Почему я не могу назвать свой UDF напрямую? Почему мне нужно квалифицировать его на 3 уровня глубиной?
-
16-10-2019 - |
Вопрос
Я только что создал UDF и тестирую его, я обнаружил, что работает только тогда, когда использую этот синтаксис
SELECT [PMIS].[dbo].[fnIsReportingTo] (50,1132)
Я ожидал, что это сработает так:
select * from fnIsReportingTo (50,1132)
или же
select fnIsReportingTo (50,1132)
Вот мой Create SQL:
create function fnIsReportingTo
(
@BossID int,
@EmployeeID int)
RETURNs bit
AS
begin
declare @ret bit
if exists (select * from dbo.fnGetEmployeeHierarchy(@BossID) where employeeID=@employeeID)
select @ret=1
else
select @ret=0
return @ret
end
Решение
Скаляр UDF должны быть квалифицированы со схемой. Вам не нужна часть базы данных квалифицированного имени, если это не в другой базе данных, конечно.
SELECT [dbo].[fnIsReportingTo] (50,1132)
В пункте вы можете использовать только таблица оценена функции
Видеть "Типы функций" в MSDN
РЕДАКТИРОВАТЬ: В качестве наблюдения я бы склонен избегать:
- Вложение UDFS это
- Использование поиска таблиц в скалярных UDF
Если вы используете эту функцию для каждой строки другой таблицы, у вас есть курсор, который итерация по таблице в UDF для каждой внешней строки
Даже это лучше. Сейчас таблица ценится и расширяется как вид.
create function fnIsReportingTo (
@BossID int,
@EmployeeID int)
RETURNs table
AS
return (
select CAST(COUNT(*) AS bit) AS FooBar
from dbo.fnGetEmployeeHierarchy(@BossID)
where employeeID=@employeeID)
GO
Не связан с dba.stackexchange