Por qué no puedo llamar directamente a mi UDF? ¿Por qué necesito para calificarlo 3 niveles de profundidad?
-
16-10-2019 - |
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
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