Есть ли способ использовать функцию в запросе 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);
Причина в том, что вы возвращаете значение в качестве таблицы.