Perché non è possibile chiamare direttamente il mio UDF? Perché ho bisogno di qualificare 3 livelli di profondità?

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

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
È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top