首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能直接打电话给我的UDF?为什么我需要达到3级的深度?

为什么我不能直接打电话给我的UDF?为什么我需要达到3级的深度?
EN

Database Administration用户
提问于 2011-02-14 20:31:58
回答 1查看 397关注 0票数 7

我刚刚创建了一个UDF,并对它进行了测试,我发现只有当我使用这个语法时才能工作。

代码语言:javascript
复制
SELECT [PMIS].[dbo].[fnIsReportingTo] (50,1132)

我以为它会像这样工作:

代码语言:javascript
复制
select * from fnIsReportingTo (50,1132)

代码语言:javascript
复制
select fnIsReportingTo (50,1132)

下面是我创建的SQL:

代码语言:javascript
复制
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
EN

回答 1

Database Administration用户

回答已采纳

发布于 2011-02-14 20:40:40

标量UDFS必须使用架构进行限定。当然,您不需要限定名的数据库部分,除非它位于不同的数据库中。

代码语言:javascript
复制
SELECT [dbo].[fnIsReportingTo] (50,1132)

在FROM子句中,只能使用表值函数。

参见MSDN中的“职能类型”

编辑:作为观察,我倾向于避免:

  • 嵌套UDF
  • 在标量UDF中使用表查找

如果对另一个表的每一行使用此函数,则有一个游标对UDF中的表进行每一外层行的迭代。

即使这样也更好。它现在是表的值和扩展像一个视图。

代码语言:javascript
复制
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
票数 8
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档