Есть ли способ вызвать пользовательскую функцию без использования «dbo». перед именем функции и параметрами?
С использованием:
SELECT USERFUNCTION(PARAM1, PARAM2, PARAM3, PARAMN)
вместо:
SELECT dbo.USERFUNCTION(PARAM1, PARAM2, PARAM3, PARAMN)
Есть ли способ вызвать пользовательскую функцию без использования «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.".
В 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». префикс к имени функции, так зачем вам это делать?
Да Возможно. На самом деле, когда функция возвращает скалярное значение, вы должны вызывать ее с именем схемы, например 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);
Причина в том, что вы возвращаете значение в виде таблицы.