Есть ли способ вызвать пользовательскую функцию без использования "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 State: " Scalar -значные функции должны вызываться, используя хотя бы двухкомпонентное имя функции"
Однако этот синтаксис работает.
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, аналогичным тому, что показал Мартин.
Вы можете переключить функцию 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". префикс имени функции, так почему бы вам это сделать?
Да Возможно, Фактически, когда функция возвращает скалярное значение, вы должны вызывать с именем схемы, например 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);
Причина в том, что вы возвращаете значение в качестве таблицы.