Por qué no puedo llamar directamente a mi UDF? ¿Por qué necesito para calificarlo 3 niveles de profundidad?

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

Pregunta

Me acaba de crear una UDF y pruebas que he encontrado sólo funciona cuando se utiliza esta sintaxis

SELECT [PMIS].[dbo].[fnIsReportingTo] (50,1132)

Me esperaba que el trabajo de esta manera:

select * from fnIsReportingTo (50,1132)

o

select fnIsReportingTo (50,1132)

aquí está mi crear 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
¿Fue útil?

Solución

escalar UDF debe ser calificado con esquema. No es necesario la parte de la base de datos del nombre calificado a menos que sea en una base de datos diferente, por supuesto.

SELECT [dbo].[fnIsReportingTo] (50,1132)

En la cláusula FROM, sólo se puede utilizar valores de tabla funciones

"Tipos de funciones" en MSDN

Edit: Como una observación, me tienden a evitar:

  • UDF anidación de este
  • mediante búsquedas en tablas en las UDF escalares

Si se utiliza esta función para cada fila de otra tabla que tiene un cursor que itera sobre la mesa de la UDF para cada fila externa

A pesar de que esto es mejor. Está ahora con valores de tabla y se expande como una vista.

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top