有没有办法在不使用“dbo”的情况下调用用户定义的函数。在函数名和参数之前?
使用:
SELECT USERFUNCTION(PARAM1, PARAM2, PARAM3, PARAMN)
代替:
SELECT dbo.USERFUNCTION(PARAM1, PARAM2, PARAM3, PARAMN)
有没有办法在不使用“dbo”的情况下调用用户定义的函数。在函数名和参数之前?
使用:
SELECT USERFUNCTION(PARAM1, PARAM2, PARAM3, PARAMN)
代替:
SELECT dbo.USERFUNCTION(PARAM1, PARAM2, PARAM3, PARAMN)
SELECT
这对于语法是不可能的。BOL 状态:“标量值函数必须至少使用函数的两部分名称来调用”
但是,此语法有效。
CREATE FUNCTION USERFUNCTION
(@p INT)
RETURNS INT
AS
BEGIN
RETURN (2)
END
GO
DECLARE @rc INT
EXEC @rc = USERFUNCTION 1
SELECT @rc
最好的做法是始终显式地限定您正在引用的对象,尽管这样可以避免解析架构的一些开销(并避免架构无法隐式解析或以不希望的方式解析的可能性)
有多种方法可以做到这一点,如果我们认为您对看到“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”更简单。函数名的前缀,那你为什么要这样做呢?
是可能的,实际上当函数返回标量值时,您必须使用 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 。