问题 有没有办法在函数之前使用Microsoft SQL Server查询上的函数而不使用“dbo。”?


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

使用:

SELECT USERFUNCTION(PARAM1, PARAM2, PARAM3, PARAMN)

代替:

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

4028
2018-03-05 21:54


起源

不,为什么要打扰?只需使用模式前缀,继续您的编程生活...... - marc_s
@marc_s避免“dbo”的一个很好的理由。前缀是编写对不同DBMS有效的SQL代码。 - bluish
@bluish:好的 - 但是在T-SQL / SQL Server中,通常无法在没有模式前缀的情况下调用存储的函数 - marc_s


答案:


这是不可能的 SELECT 句法。 BOL国家:“必须至少使用函数的两部分名称来调用标量值函数

但是,此语法有效。

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

GO

DECLARE @rc INT

EXEC @rc = USERFUNCTION 1

SELECT @rc

最佳做法是始终对您引用的对象进行模式限定,以避免解决模式的一些开销(我认为也是出于计划缓存的原因)


8
2018-03-05 22:10



好吧,似乎这就是为什么我不能使用像MySQL这样的功能的答案,谢谢。 - alexzm1
是的,出于计划缓存的原因。 UserA和UserB在没有模式限定的情况下不会使用相同的计划,因为可能有userA.table和OtherSchema.table - gbn


有很多方法可以做到这一点,如果我们认为你对看到“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”。函数名称的前缀,那你为什么要这样做呢?


2
2018-03-05 23:01



我正在使用Microsoft SQL Server 2005,我正在尝试直接传递用户定义的函数,就像我可以使用MySQL 5.0+一样,但我开始看到这些数据库之间存在差异。 - alexzm1
@alex然后会遇到更多的差异。快乐的过渡 - RichardTheKiwi
感谢你对这次艰难过渡@Richard的祝福 - alexzm1


是的可能, 实际上当函数返回标量值时,你必须使用模式名称调用,如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); 

原因是您将值作为表返回。


0
2018-06-13 10:59