Перейти к содержимому

Как вызвать функцию в sql

  • автор:

Практическое руководство. Встроенный вызов пользовательских функций

Пользовательские функции можно вызывать из строки кода, однако функции, включенные в запрос, выполнение которого отложено, выполняются только одновременно с запросом. Дополнительные сведения см. в разделе Введение в запросы LINQ (C#).

При вызове той же функции за пределами запроса LINQ to SQL создает простой запрос из выражения вызова метода. Ниже показан синтаксис SQL (параметр @p0 привязан к передаваемой константе).

SELECT dbo.ReverseCustName(@p0) 

LINQ to SQL создает следующее:

string str = db.ReverseCustName("LINQ to SQL"); 
Dim str As String = db.ReverseCustName("LINQ to SQL") 

Пример

В следующем запросе LINQ to SQL можно увидеть встроенный вызов созданной определяемой пользователем функции ReverseCustName . Функция не выполняется немедленно, поскольку выполнение запроса отложено. Код SQL, созданный для этого запроса, преобразуется в вызов пользовательской функции в базе данных (см. код SQL, расположенный после запроса).

var custQuery = from cust in db.Customers select new ; 
Dim custQuery = _ From cust In db.Customers _ Select cust.ContactName, Title = _ db.ReverseCustName(cust.ContactTitle) 
SELECT [t0].[ContactName], dbo.ReverseCustName([t0].[ContactTitle]) AS [Title] FROM [Customers] AS [t0] 

См. также

Выполнение определяемых пользователем функций

Выполните определяемую пользователем функцию с помощью Transact-SQL.

ограничения

В Transact-SQL параметры можно предоставлять с помощью значения или с помощью значения @parameter_name=. Параметр не является частью транзакции; Таким образом, если параметр изменяется в транзакции, которая позже откатывается, значение параметра не возвращается к предыдущему значению. Возвращаемым вызывающему значением всегда является то значение, которое существует на момент выхода из модуля.

Разрешения

Разрешения не требуются для выполнения инструкции EXECUTE . Однако необходимы разрешения на защищаемые объекты, на которые ссылается командная строка в инструкции EXECUTE. Например, если строка содержит инструкцию INSERT , вызывающий инструкцию EXECUTE пользователь должен иметь разрешение INSERT на целевую таблицу. Разрешения проверяются в месте нахождения инструкции EXECUTE, даже если она содержится внутри модуля. Дополнительные сведения см. в разделе EXECUTE (Transact-SQL)

Использование Transact-SQL

В этом примере используется скалярная функция ufnGetSalesOrderStatusText , которая доступна в большинстве выпусков AdventureWorks . Функция предназначена для возврата текстового значения для состояния продаж из заданного целого числа. Изменяйте пример путем передачи целых чисел 1–7 параметру @Status .

USE [AdventureWorks2022] GO -- Declare a variable to return the results of the function. DECLARE @ret nvarchar(15); -- Execute the function while passing a value to the @status parameter EXEC @ret = dbo.ufnGetSalesOrderStatusText @Status = 5; -- View the returned value. The Execute and Select statements must be executed at the same time. SELECT N'Order Status: ' + @ret; -- Result: -- Order Status: Shipped 

См. также

  • Определяемые пользователем функции
  • CREATE FUNCTION (Transact SQL)

Как вызвать функцию в sql

PostgreSQL позволяет вызывать функции с именованными параметрами, используя запись с позиционной или именной передачей аргументов. Именная передача особенно полезна для функций со множеством параметров, так как она делает связь параметров и аргументов более явной и надёжной. В позиционной записи значения аргументов функции указываются в том же порядке, в каком они описаны в определении функции. При именной передаче аргументы сопоставляются с параметрами функции по именам и указывать их можно в любом порядке. Для каждого варианта вызова также учитывайте влияние типов аргументов функций, описанное в Разделе 10.3.

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

PostgreSQL также поддерживает смешанную передачу, когда параметры передаются и по именам, и по позиции. В этом случае позиционные параметры должны идти перед параметрами, передаваемыми по именам.

Мы рассмотрим все три варианта записи на примере следующей функции:

CREATE FUNCTION concat_lower_or_upper(a text, b text, uppercase boolean DEFAULT false) RETURNS text AS $$ SELECT CASE WHEN $3 THEN UPPER($1 || ' ' || $2) ELSE LOWER($1 || ' ' || $2) END; $$ LANGUAGE SQL IMMUTABLE STRICT;

Функция concat_lower_or_upper имеет два обязательных параметра: a и b . Кроме того, есть один необязательный параметр uppercase , который по умолчанию имеет значение false . Аргументы a и b будут сложены вместе и переведены в верхний или нижний регистр, в зависимости от параметра uppercase . Остальные тонкости реализации функции сейчас не важны (подробнее о них рассказано в Главе 36).

4.3.1. Позиционная передача

Позиционная передача — это традиционный механизм передачи аргументов функции в PostgreSQL . Пример такой записи:

SELECT concat_lower_or_upper('Hello', 'World', true); concat_lower_or_upper ----------------------- HELLO WORLD (1 row)

Все аргументы указаны в заданном порядке. Результат возвращён в верхнем регистре, так как параметр uppercase имеет значение true . Ещё один пример:

SELECT concat_lower_or_upper('Hello', 'World'); concat_lower_or_upper ----------------------- hello world (1 row)

Здесь параметр uppercase опущен, и поэтому он принимает значение по умолчанию ( false ), и результат переводится в нижний регистр. В позиционной записи любые аргументы с определённым значением по умолчанию можно опускать справа налево.

4.3.2. Именная передача

При именной передаче для аргумента добавляется имя, которое отделяется от выражения значения знаками => . Например:

SELECT concat_lower_or_upper(a => 'Hello', b => 'World'); concat_lower_or_upper ----------------------- hello world (1 row)

Здесь аргумент uppercase был так же опущен, так что он неявно получил значение false . Преимуществом такой записи является возможность записывать аргументы в любом порядке, например:

SELECT concat_lower_or_upper(a => 'Hello', b => 'World', uppercase => true); concat_lower_or_upper ----------------------- HELLO WORLD (1 row) SELECT concat_lower_or_upper(a => 'Hello', uppercase => true, b => 'World'); concat_lower_or_upper ----------------------- HELLO WORLD (1 row)

Для обратной совместимости поддерживается и старый синтаксис с «:=»:

SELECT concat_lower_or_upper(a := 'Hello', uppercase := true, b := 'World'); concat_lower_or_upper ----------------------- HELLO WORLD (1 row)

4.3.3. Смешанная передача

При смешанной передаче параметры передаются и по именам, и по позиции. Однако как уже было сказано, именованные аргументы не могут стоять перед позиционными. Например:

SELECT concat_lower_or_upper('Hello', 'World', uppercase => true); concat_lower_or_upper ----------------------- HELLO WORLD (1 row)

В данном запросе аргументы a и b передаются по позиции, а uppercase — по имени. Единственное обоснование такого вызова здесь — он стал чуть более читаемым. Однако для более сложных функций с множеством аргументов, часть из которых имеют значения по умолчанию, именная или смешанная передача позволяют записать вызов эффективнее и уменьшить вероятность ошибок.

Примечание

Именная и смешанная передача в настоящий момент не может использоваться при вызове агрегатной функции (но они допускаются, если агрегатная функция используется в качестве оконной).

Пред. Наверх След.
4.2. Выражения значения Начало Глава 5. Определение данных

Как запустить функцию и поместить ее результат в переменную?

Есть функция, как её запустить, чтобы результат поместить в переменную?

  • Вопрос задан более трёх лет назад
  • 143 просмотра

Комментировать

Решения вопроса 1

tsklab

Константин Цветков @tsklab Куратор тега SQL Server

Здесь отвечаю на вопросы.

DECLARE @G INT SELECT @G = dbo.GetConfigID( 1 )

Ответ написан более трёх лет назад

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *