Sql server 是否有一种方法可以在Microsoft SQL Server查询中使用函数而不使用;dbo。”;在功能之前?
有没有一种方法可以在函数名和参数之前不使用“dbo.”调用用户定义的函数 使用:Sql server 是否有一种方法可以在Microsoft SQL Server查询中使用函数而不使用;dbo。”;在功能之前?,sql-server,user-defined-functions,dbo,Sql Server,User Defined Functions,Dbo,有没有一种方法可以在函数名和参数之前不使用“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
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”有负面反应 在SQLServer2000中,有一种方法可以通过稍微切换将UDF转换为系统函数。从SQLServer2005开始,这个“功能”已经被删除,所以除非您仍然使用2000,否则我不会详细介绍 您可以使用OPENQUERY和类似于Martin所展示的PROC语法 可以通过重写标量函数或将其包装到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)调用函数,如果您不想调用没有模式名的函数,您应该按如下方式创建函数
示例代码:
原因是您将值返回为表。否。为什么要麻烦呢??只要使用模式前缀,就可以开始编程了…@marc_这是避免使用“dbo”的一个很好的理由。前缀是编写对不同DBM有效的SQL代码。@bluish:OK-但是在T-SQL/SQL Server中,如果没有模式前缀,通常无法调用存储函数。我使用的是Microsoft SQL Server 2005,我试图直接传递用户定义的函数,就像我可以用MySQL 5.0+一样,但我开始看到这些DBMS之间的差异。@alex然后还有很多不同之处要遇到。很好,这就是为什么我不能使用MySQL中的函数的原因,谢谢。是的,出于计划缓存的原因。UserA和UserB在没有模式限定的情况下不会使用同一个计划,因为可能存在UserA.table和OtherSchema.table
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);