Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 是否有一种方法可以在Microsoft SQL Server查询中使用函数而不使用;dbo。”;在功能之前?_Sql Server_User Defined Functions_Dbo - Fatal编程技术网

Sql server 是否有一种方法可以在Microsoft SQL Server查询中使用函数而不使用;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

有没有一种方法可以在函数名和参数之前不使用“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”有负面反应

在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);