Есть ли способ использовать функцию в запросе Microsoft SQL Server без использования "dbo". перед функцией?

Есть ли способ вызвать пользовательскую функцию без использования "dbo". перед именем функции и параметрами?

Использование:

SELECT USERFUNCTION(PARAM1, PARAM2, PARAM3, PARAMN)

вместо:

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

Ответ 1

Это невозможно для синтаксиса SELECT. BOL State: " Scalar -значные функции должны вызываться, используя хотя бы двухкомпонентное имя функции"

Однако этот синтаксис работает.

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

GO

DECLARE @rc INT

EXEC @rc = USERFUNCTION 1

SELECT @rc

Лучше всего всегда иметь в виду, что объекты схемы, к которым вы ссылаетесь, всегда имеют смысл, но чтобы избежать некоторых накладных расходов для решения схемы (и я думаю, что для целей плана также есть)

Ответ 2

Существуют различные способы сделать это, если мы считаем, что у вас есть негативная реакция на "dbo".

В SQL Server 2000 есть способ превратить UDF в системные функции, переключая бит. Эта "функция" была удалена из SQL Server 2005, поэтому я не буду вдаваться в подробности, если вы по-прежнему не используете 2000.

Вы можете использовать OPENQUERY с синтаксисом PROC, аналогичным тому, что показал Мартин.

Вы можете переключить функцию Scalar в функцию, зависящую от таблицы, либо путем ее перезаписи, либо путем ее переноса в TVF. Однако синтаксис изменяется, поэтому

select dbo.udf(a,b) from c

--becomes
select d
from c
cross apply tvf(a,b) e(d)  -- look, no "dbo"!

Но ни одно из приведенных выше не выглядит просто, как просто наложение простого "dbo". префикс имени функции, так почему бы вам это сделать?

Ответ 3

Да Возможно, Фактически, когда функция возвращает скалярное значение, вы должны вызывать с именем схемы, например 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); 

Причина в том, что вы возвращаете значение в качестве таблицы.