Warum kann ich meine UDF nicht direkt anrufen? Warum muss ich es 3 Level tief qualifizieren?


7

Ich habe gerade eine UDF erstellt und sie getestet. Ich habe festgestellt, dass sie 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 meine SQL erstellen:

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

Antworten:


8

Skalares UDFS muss mit einem Schema qualifiziert sein. Sie benötigen den Datenbankteil des qualifizierten Namens nur, wenn er sich in einer anderen Datenbank befindet.

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

In der FROM-Klausel können Sie nur Tabellenwertfunktionen verwenden

Siehe "Arten von Funktionen" in MSDN

Bearbeiten: Als Beobachtung würde ich eher vermeiden:

  • Verschachteln von UDFs
  • Verwenden von Tabellensuchen in skalaren 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 ist jetzt Tabellenwert 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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.