Pourquoi ne puis-je appeler mon UDF directement? Pourquoi ai-je besoin de le qualifier 3 niveaux de profondeur?

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

Question

Je viens de créer une UDF et le tester, j'ai trouvé ne fonctionne que lorsque j'utilise cette syntaxe

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

Je me attendais à ce travail comme ceci:

select * from fnIsReportingTo (50,1132)

ou

select fnIsReportingTo (50,1132)

voici mon SQL créer:

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
Était-ce utile?

La solution

Scalar UDFS doit être qualifié avec le schéma. Vous n'avez pas besoin de la partie base de données du nom qualifié à moins qu'il soit dans une autre base de données bien sûr.

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

Dans la clause FROM, vous ne pouvez utiliser valeur table Fonctions

Voir "Les types de fonctions" dans MSDN

Edit: A titre d'observation, je tendraient à éviter:

  • UDFs nidification ce
  • à l'aide de la table dans lookups UDFs scalaire

si vous utilisez cette fonction pour chaque ligne d'une autre table que vous avez un curseur qui itère sur la table dans l'UDF pour chaque rangée extérieure

Même ce qui est mieux. Il est maintenant évalué la table et élargit la portée comme une vue.

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top