Почему я не могу назвать свой UDF напрямую? Почему мне нужно квалифицировать его на 3 уровня глубиной?

dba.stackexchange https://dba.stackexchange.com/questions/1221

Вопрос

Я только что создал 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top