Warum kann ich meinen UDF nicht direkt anrufen? Warum muss ich es 3 Ebenen tief qualifizieren?
-
16-10-2019 - |
Frage
Ich habe gerade ein UDF erstellt und testete es, ich habe nur funktioniert, wenn ich diese Syntax verwende
SELECT [PMIS].[dbo].[fnIsReportingTo] (50,1132)
Ich hatte erwartet, dass es so funktioniert:
select * from fnIsReportingTo (50,1132)
oder
select fnIsReportingTo (50,1132)
Hier ist mein 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
Lösung
Skalar UDFs müssen mit Schema qualifiziert sein. Sie benötigen den Datenbankteil des qualifizierten Namens nicht, es sei denn, sie befindet sich natürlich in einer anderen Datenbank.
SELECT [dbo].[fnIsReportingTo] (50,1132)
In der From -Klausel können Sie nur verwenden Tisch geschätzt Funktionen
Sehen "Arten von Funktionen" in msdn
Bearbeiten: Als Beobachtung würde ich dazu neigen, zu vermeiden:
- udfs nisten
- Verwenden von Tabellen -Lookups in Skalar -UDFs
Wenn Sie diese Funktion für jede Zeile einer anderen Tabelle verwenden, haben Sie einen Cursor, der für jede äußere Zeile über die Tabelle in der UDF iteriert
Auch das ist besser. Es wird jetzt Tisch bewertet und erweitert sich wie eine Ansicht.
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