有没有办法在不使用“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);
原因是您将值作为表返回。