19

有没有办法在不使用“dbo”的情况下调用用户定义的函数。在函数名和参数之前?

使用:

SELECT USERFUNCTION(PARAM1, PARAM2, PARAM3, PARAMN)

代替:

SELECT dbo.USERFUNCTION(PARAM1, PARAM2, PARAM3, PARAMN)
4

3 回答 3

13

SELECT这对于语法是不可能的。BOL 状态:“标量值函数必须至少使用函数的两部分名称来调用

但是,此语法有效。

CREATE FUNCTION USERFUNCTION
(@p INT)
RETURNS INT
AS
BEGIN
RETURN (2)
END

GO

DECLARE @rc INT

EXEC @rc = USERFUNCTION 1

SELECT @rc

最好的做法是始终显式地限定您正在引用的对象,尽管这样可以避免解析架构的一些开销(并避免架构无法隐式解析或以不希望的方式解析的可能性)

于 2011-03-05T22:10:46.950 回答
2

有多种方法可以做到这一点,如果我们认为您对看到“dbo.”有负面反应。

在 SQL Server 2000 中,有一种方法可以通过稍微切换将 UDF 转换为系统函数。从 SQL Server 2005 开始,这个“功能”已经被删除,所以除非你真的还在使用 2000,否则我不会详细介绍。

您可以使用类似于 Martin 所展示的带有 PROC 语法的 OPENQUERY。

您可以通过重写或将其包装在 TVF 中来将标量函数转换为表值函数。然而,语法发生了变化,所以

select dbo.udf(a,b) from c

--becomes
select d
from c
cross apply tvf(a,b) e(d)  -- look, no "dbo"!

但是上面的任何一个看起来都比简单的“dbo”更简单。函数名的前缀,那你为什么要这样做呢?

于 2011-03-05T23:01:54.313 回答
-1

是可能的,实际上当函数返回标量值时,您必须使用 dbo.yourfunction 之类的架构名称调用,如果您不想调用没有架构名称的函数,您应该按如下方式创建函数。

示例代码:

CREATE FUNCTION [dbo].[FN_MAPCOUNT] 
(

    @countValue int
)
RETURNS @TEMPTABLE Table(cntValue int)
as
begin
  DECLARE @countValueint
  @countValue= select count(*) from mappings;

   INSERT @TEMPTABLE (cntValue) VALUES (@countValue) 
    RETURN
end
Go

select * from FN_MAPCOUNT(1); 

原因是您将值返回为 table 。

于 2013-06-13T10:59:57.447 回答