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
War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top