Perché non è possibile chiamare direttamente il mio UDF? Perché ho bisogno di qualificare 3 livelli di profondità?
-
16-10-2019 - |
Domanda
Ho appena creato un'UDF e testarlo ho trovato funziona solo quando uso questa sintassi
SELECT [PMIS].[dbo].[fnIsReportingTo] (50,1132)
mi aspettavo che il lavoro in questo modo:
select * from fnIsReportingTo (50,1132)
o
select fnIsReportingTo (50,1132)
ecco la mia creare 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
Soluzione
Scalar UDFS deve essere qualificato con schema. Non è necessario la parte del database del nome completo a meno che non si trova in una diversa banca dati, naturalmente.
SELECT [dbo].[fnIsReportingTo] (50,1132)
Nella clausola FROM, è possibile utilizzare solo con valori di tabella funzioni
"Tipi di funzioni" in MSDN
Edit: Come un'osservazione, mi piacerebbe tendono ad evitare:
- UDF nidificazione questo
- utilizzando le ricerche di tabella nelle UDF scalari
se si utilizza questa funzione per ogni riga di un'altra tabella si dispone di un cursore che scorre sopra il tavolo in UDF per ogni fila esterna
Anche questo è meglio. E 'ormai valori di tabella e si espande come una visione.
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