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

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

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

SELECT USERFUNCTION(PARAM1, PARAM2, PARAM3, PARAMN)

вместо:

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

person alexzm1    schedule 05.03.2011    source источник
comment
Нет. Зачем ?? Просто используйте префикс схемы и продолжайте программировать ...   -  person marc_s    schedule 06.03.2011
comment
@marc_s Хорошая причина избегать dbo. префикс записывает SQL-код, действующий для разных СУБД ».   -  person bluish    schedule 23.09.2016
comment
@bluish: ОК, но хранимые функции обычно не могут быть вызваны без префикса схемы в T-SQL / SQL Server   -  person marc_s    schedule 24.09.2016


Ответы (3)


Это невозможно для синтаксиса SELECT. Состояния BOL: Скалярные функции должны вызываться с использованием как минимум двухчастного название функции

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

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

GO

DECLARE @rc INT

EXEC @rc = USERFUNCTION 1

SELECT @rc

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

person Martin Smith    schedule 05.03.2011
comment
ну, похоже, это ответ на то, почему я не могу использовать такую ​​функцию, как я мог бы сделать это в MySQL, спасибо. - person alexzm1; 06.03.2011
comment
да, по причинам кеширования планов. UserA и UserB не будут использовать один и тот же план без квалификации схемы, потому что могут быть userA.table и OtherSchema.table - person gbn; 06.03.2011

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

В SQL Server 2000 есть способ превратить UDF в системные функции путем небольшого переключения. Эта «функция» была удалена из SQL Server 2005 и далее, поэтому я не буду вдаваться в подробности, если вы действительно все еще не используете 2000.

Вы можете использовать OPENQUERY с синтаксисом 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». префикс к имени функции, так зачем вам это делать?

person RichardTheKiwi    schedule 05.03.2011
comment
Я использую Microsoft SQL Server 2005, и я пытаюсь передать определяемые пользователем функции напрямую, как я мог бы сделать это с MySQL 5.0+, но я начинаю видеть различия между этими СУБД. - person alexzm1; 06.03.2011
comment
@alex, тогда есть еще много различий, с которыми можно столкнуться. счастливый переход - person RichardTheKiwi; 06.03.2011

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

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

person Jagadeesh G    schedule 13.06.2013