Как присвоить значение переменной в sql
Перейти к содержимому

Как присвоить значение переменной в sql

  • автор:

Присвоение значений переменных для выделенных пулов SQL в Azure Synapse Analytics

В этой статье вы найдете важные советы по присвоению значений переменных T-SQL в выделенном пуле SQL.

Задание переменных с помощью DECLARE

Переменные в выделенном пуле SQL задаются с помощью операторов DECLARE или SET . Инициализация переменных с помощью DECLARE — один из наиболее гибких способов задать значение переменной в пуле SQL.

DECLARE @v int = 0 ; 

С помощью DECLARE можно задать одновременно несколько переменных. SELECT или UPDATE нельзя использовать для выполнения следующих задач:

DECLARE @v INT = (SELECT TOP 1 c_customer_sk FROM Customer where c_last_name = 'Smith') , @v1 INT = (SELECT TOP 1 c_customer_sk FROM Customer where c_last_name = 'Jones') ; 

Нельзя инициализировать и использовать переменную в одном и том же операторе DECLARE. Чтобы проиллюстрировать это, ниже приведен недопустимый пример, так как @p1 инициализируется и используется в одной и той же инструкции DECLARE. Следующий пример показывает возникающую ошибку:

DECLARE @p1 int = 0 , @p2 int = (SELECT COUNT (*) FROM sys.types where is_user_defined = @p1 ) ; 

Задание значений с помощью SET

SET — это очень распространенный метод задания одной переменной.

Ниже перечислены допустимые способы задания значения с помощью инструкции SET:

SET @v = (Select max(database_id) from sys.databases); SET @v = 1; SET @v = @v+1; SET @v +=1; 

С помощью SET можно одновременно задать только одну переменную. Тем не менее допускаются составные операторы.

Ограничения

Нельзя использовать UPDATE, чтобы присвоить значение переменной.

Дальнейшие действия

Дополнительные советы по разработке приведены в обзоре разработки.

Присвоение переменной значение ячейки

P.S. Вообще запрос немного странный, вы пытаетесь получить некую «последнюю» запись. Но Oracle как и другие СУБД не гарантирует порядка выбора записей без указания точного порядка сортировки. Т.е. «последней» (с максимальным rownum) теоретически может оказаться какая угодно запись.

Отслеживать
ответ дан 14 сен 2016 в 12:42
44.1k 3 3 золотых знака 35 35 серебряных знаков 66 66 бронзовых знаков

1) Присвоение переменной из запроса делается следующим синтаксисом.

declare email varchar(4000); begin select email into email from имя таблицы where . end; 

2) В такой запрос должно возвращаться ровно одно значение, не больше не меньше, иначе оракл выдаст необработанное исключение. Если у вас может возвращаться пустое значение можно либо обрабатывать это исключение или возвращать максимальное значение через функцию max.

3) Если вам нужно вывести список всех адресов через запятую, можно в выборке использовать запросе функцию LISTAGG:

 select LISTAGG (email,',') WITHIN GROUP (ORDER BY email) into email from имя таблицы where id between 10 and 100; 

Как присвоить значение переменной в sql

В этом и последующих разделах описаны все типы операторов, которые понимает PL/pgSQL . Все, что не признается в качестве одного из этих типов операторов, считается командой SQL и отправляется для исполнения в основную машину базы данных, как описано в Подразделе 42.5.2 и Подразделе 42.5.3.

42.5.1. Присваивания

Присваивание значения переменной PL/pgSQL записывается в виде:

переменная < := | = >выражение;

Как описывалось ранее, выражение в таком операторе вычисляется с помощью SQL-команды SELECT , посылаемой в основную машину базы данных. Выражение должно получить одно значение (возможно, значение строки, если это переменная-кортеж или переменная типа record ). Целевая переменная может быть простой переменной (возможно, дополненной именем блока), полем кортежа или записи; или элементом массива, который является простой переменной или полем. Для присваивания можно использовать знак равенства ( = ) вместо совместимого с PL/SQL := .

Если тип данных результата выражения не соответствует типу данных переменной, это значение будет преобразовано к нужному типу с использованием приведения присваивания (см. Раздел 10.4). В случае отсутствия приведения присваивания для этой пары типов, интерпретатор PL/pgSQL попытается преобразовать значение результата через текстовый формат, то есть применив функцию вывода типа результата, а за ней функцию ввода типа переменной. Заметьте, что при этом функция ввода может выдавать ошибки времени выполнения, если не воспримет строковое представление значения результата.

tax := subtotal * 0.06; my_record.user_id := 20;

42.5.2. Выполнение команды, не возвращающей результат

В функции на PL/pgSQL можно выполнить любую команду SQL, не возвращающую строк, просто написав эту команду (например, INSERT без предложения RETURNING ).

Имя любой переменной PL/pgSQL в тексте команды рассматривается как параметр, а затем текущее значение переменной подставляется в качестве значения параметра во время выполнения. Это в точности совпадает с описанной ранее обработкой для выражений; за подробностями обратитесь к Подразделу 42.11.1.

При выполнении SQL-команды таким образом, PL/pgSQL может кешировать и повторно использовать план выполнения команды, как обсуждается в Подразделе 42.11.2.

Иногда бывает полезно вычислить значение выражения или запроса SELECT , но отказаться от результата, например, при вызове функции, у которой есть побочные эффекты, но нет полезного результата. Для этого в PL/pgSQL , используется оператор PERFORM :

PERFORM запрос;

Эта команда выполняет запрос и отбрасывает результат. Запросы пишутся таким же образом, как и в команде SQL SELECT , но ключевое слово SELECT заменяется на PERFORM . Для запросов WITH после PERFORM нужно поместить запрос в скобки. (В этом случае запрос может вернуть только одну строку.) Переменные PL/pgSQL будут подставлены в запрос так же, как и в команду, не возвращающую результат, план запроса также кешируется. Кроме того, специальная переменная FOUND устанавливается в истину, если запрос возвращает, по крайней мере, одну строку, или ложь, если не возвращает ни одной строки (см. Подраздел 42.5.5).

Примечание

Можно предположить, что такой же результат получается непосредственно командой SELECT , но в настоящее время использование PERFORM является единственным способом. Команда SQL, которая может возвращать строки, например SELECT , будет отклонена с ошибкой, если не имеет предложения INTO , как описано в следующем разделе.

PERFORM create_mv('cs_session_page_requests_mv', my_query);

42.5.3. Выполнение запроса, возвращающего одну строку

Результат SQL-команды, возвращающей одну строку (возможно из нескольких столбцов), может быть присвоен переменной типа record , переменной-кортежу или списку скалярных переменных. Для этого нужно к основной команде SQL добавить предложение INTO . Так, например:

SELECT выражения_select INTO [STRICT] цель FROM . ; INSERT . RETURNING выражения INTO [STRICT] цель; UPDATE . RETURNING выражения INTO [STRICT] цель; DELETE . RETURNING выражения INTO [STRICT] цель;

где цель может быть переменной типа record , переменной-кортежем или разделённым запятыми списком скалярных переменных, полей записи/строки. Переменные PL/pgSQL подставляются в оставшуюся часть запроса, план выполнения кешируется, так же, как было описано выше для команд, не возвращающих строки. Это работает для команд SELECT , INSERT / UPDATE / DELETE с предложением RETURNING и служебных команд, возвращающих результат в виде набора строк (таких как EXPLAIN ). За исключением предложения INTO , это те же SQL-команды, как их можно написать вне PL/pgSQL .

Подсказка

Обратите внимание, что данная интерпретация SELECT с INTO полностью отличается от PostgreSQL команды SELECT INTO , где в INTO указывается вновь создаваемая таблица. Если вы хотите в функции на PL/pgSQL создать таблицу, основанную на результате команды SELECT , используйте синтаксис CREATE TABLE . AS SELECT .

Если результат запроса присваивается кортежу или списку переменных, то они должны в точности соответствовать по количеству и типам данных столбцам результата, иначе произойдёт ошибка во время выполнения. Если используется переменная типа record , то она автоматически приводится к типу строки результата запроса.

Предложение INTO может появиться практически в любом месте SQL-команды. Обычно его записывают непосредственно перед или сразу после списка выражения_select в SELECT или в конце команды для команд других типов. Рекомендуется следовать этому соглашению на случай, если правила разбора PL/pgSQL ужесточатся в будущих версиях.

Если указание STRICT отсутствует в предложении INTO , то цели присваивается первая строка, возвращённая запросом; или NULL, если запрос не вернул строк. (Заметим, что понятие « первая строка » определяется неоднозначно без ORDER BY .) Все остальные строки результата после первой отбрасываются. Можно проверить специальную переменную FOUND (см. Подраздел 42.5.5), чтобы определить, была ли возвращена запись:

SELECT * INTO myrec FROM emp WHERE empname = myname; IF NOT FOUND THEN RAISE EXCEPTION 'Сотрудник % не найден', myname; END IF;

Если добавлено указание STRICT , то запрос должен вернуть ровно одну строку или произойдёт ошибка во время выполнения: либо NO_DATA_FOUND (нет строк), либо TOO_MANY_ROWS (более одной строки). Можно использовать секцию исключений в блоке для обработки ошибок, например:

BEGIN SELECT * INTO STRICT myrec FROM emp WHERE empname = myname; EXCEPTION WHEN NO_DATA_FOUND THEN RAISE EXCEPTION 'Сотрудник % не найден', myname; WHEN TOO_MANY_ROWS THEN RAISE EXCEPTION 'Сотрудник % уже существует', myname; END;

После успешного выполнения команды с указанием STRICT , значение переменной FOUND всегда устанавливается в истину.

Для INSERT / UPDATE / DELETE с RETURNING , PL/pgSQL возвращает ошибку, если выбрано более одной строки, даже в том случае, когда указание STRICT отсутствует. Так происходит потому, что у этих команд нет возможности, типа ORDER BY , указать какая из задействованных строк должна быть возвращена.

Если для функции включён режим print_strict_params , то при возникновении ошибки, связанной с нарушением условия STRICT , в детальную ( DETAIL ) часть сообщения об ошибке будет включена информация о параметрах, переданных запросу. Изменить значение print_strict_params можно установкой параметра plpgsql.print_strict_params . Но это повлияет только на функции, скомпилированные после изменения. Для конкретной функции можно использовать указание компилятора, например:

CREATE FUNCTION get_userid(username text) RETURNS int AS $$ #print_strict_params on DECLARE userid int; BEGIN SELECT users.userid INTO STRICT userid FROM users WHERE users.username = get_userid.username; RETURN userid; END; $$ LANGUAGE plpgsql;

В случае сбоя будет сформировано примерно такое сообщение об ошибке

ERROR: query returned no rows DETAIL: parameters: $1 = 'nosuchuser' CONTEXT: PL/pgSQL function get_userid(text) line 6 at SQL statement

Примечание

С указанием STRICT поведение SELECT INTO и связанных операторов соответствует принятому в Oracle PL/SQL.

Как действовать в случаях, когда требуется обработать несколько строк результата, описано в Подразделе 42.6.6.

42.5.4. Выполнение динамически формируемых команд

Часто требуется динамически формировать команды внутри функций на PL/pgSQL , то есть такие команды, в которых при каждом выполнении могут использоваться разные таблицы или типы данных. Обычно PL/pgSQL кеширует планы выполнения (как описано в Подразделе 42.11.2), но в случае с динамическими командами это не будет работать. Для исполнения динамических команд предусмотрен оператор EXECUTE :

EXECUTE строка-команды [ INTO [STRICT] цель ] [ USING выражение [, . ] ];

где строка-команды это выражение, формирующее строку (типа text ) с текстом команды, которую нужно выполнить. Необязательная цель — это переменная-запись, переменная-кортеж или разделённый запятыми список простых переменных и полей записи/кортежа, куда будут помещены результаты команды. Необязательные выражения в USING формируют значения, которые будут вставлены в команду.

В сформированном тексте команды замена имён переменных PL/pgSQL на их значения проводиться не будет. Все необходимые значения переменных должны быть вставлены в командную строку при её построении, либо нужно использовать параметры, как описано ниже.

Также, нет никакого плана кеширования для команд, выполняемых с помощью EXECUTE . Вместо этого план создаётся каждый раз при выполнении. Таким образом, строка команды может динамически создаваться внутри функции для выполнения действий с различными таблицами и столбцами.

Предложение INTO указывает, куда должны быть помещены результаты SQL-команды, возвращающей строки. Если передаётся кортеж или список переменных, то они должны в точности соответствовать структуре результата запроса (когда используется переменная типа record , она автоматически приводится к типу строки результата запроса). Если возвращается несколько строк, то только первая будет присвоена переменной(ым) в INTO . Если не возвращается ни одной строки, то присваивается NULL. Без предложения INTO результаты запроса отбрасываются.

С указанием STRICT запрос должен вернуть ровно одну строку, иначе выдаётся сообщение об ошибке.

В тексте команды можно использовать значения параметров, ссылки на параметры обозначаются как $1 , $2 и т. д. Эти символы указывают на значения, находящиеся в предложении USING . Такой метод зачастую предпочтительнее, чем вставка значений в команду в виде текста: он позволяет исключить во время выполнения дополнительные расходы на преобразования значений в текст и обратно, и не открывает возможности для SQL-инъекций, не требуя применять экранирование или кавычки для спецсимволов. Пример:

EXECUTE 'SELECT count(*) FROM mytable WHERE inserted_by = $1 AND inserted 

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

EXECUTE 'SELECT count(*) FROM ' || quote_ident(tabname) || ' WHERE inserted_by = $1 AND inserted 

В качестве более аккуратного решения, вместо имени таблиц или столбцов можно использовать указание формата %I с функцией format() (текст, разделённый символами новой строки, соединяется вместе):

EXECUTE format('SELECT count(*) FROM %I ' 'WHERE inserted_by = $1 AND inserted 

Ещё одно ограничение состоит в том, что символы параметров могут использоваться только в командах SELECT , INSERT , UPDATE и DELETE . В операторы других типов (обычно называемые служебными) значения нужно вставлять в текстовом виде, даже если это просто значения данных.

Команда EXECUTE c неизменяемым текстом и параметрами USING (как в первом примере выше), функционально эквивалентна команде, записанной напрямую в PL/pgSQL , в которой переменные PL/pgSQL автоматически заменяются значениями. Важное отличие в том, что EXECUTE при каждом исполнении заново строит план команды с учётом текущих значений параметров, тогда как PL/pgSQL строит общий план выполнения и кеширует его при повторном использовании. В тех случаях, когда наилучший план выполнения сильно зависит от значений параметров, может быть полезно использовать EXECUTE для гарантии того, что не будет выбран общий план.

В настоящее время команда SELECT INTO не поддерживается в EXECUTE , вместо этого нужно выполнять обычный SELECT и указать INTO для самой команды EXECUTE .

Примечание

Оператор EXECUTE в PL/pgSQL не имеет отношения к одноимённому SQL-оператору сервера PostgreSQL . Серверный EXECUTE не может напрямую использоваться в функциях на PL/pgSQL (и в этом нет необходимости).

Пример 42.1. Использование кавычек в динамических запросах

При работе с динамическими командами часто приходится иметь дело с экранированием одинарных кавычек. Рекомендуемым методом для взятия текста в кавычки в теле функции является экранирование знаками доллара. (Если имеется унаследованный код, не использующий этот метод, пожалуйста, обратитесь к обзору в Подразделе 42.12.1, это поможет сэкономить усилия при переводе кода к более приемлемому виду.)

Динамические значения требуют особого внимания, так как они могут содержать апострофы. Например, можно использовать функцию format() (предполагается, что тело функции заключается в доллары, так что апострофы дублировать не нужно):

EXECUTE format('UPDATE tbl SET %I = $1 ' 'WHERE key = $2', colname) USING newvalue, keyvalue;

Также можно напрямую вызывать функции заключения в кавычки:

EXECUTE 'UPDATE tbl SET ' || quote_ident(colname) || ' = ' || quote_literal(newvalue) || ' WHERE key = ' || quote_literal(keyvalue);

Этот пример демонстрирует использование функций quote_ident и quote_literal (см. Раздел 9.4). Для надёжности, выражения, содержащие идентификаторы столбцов и таблиц должны использовать функцию quote_ident при добавлении в текст запроса. А для выражений со значениями, которые должны быть обычными строками, используется функция quote_literal . Эти функции выполняют соответствующие шаги, чтобы вернуть текст, по ситуации заключённый в двойные или одинарные кавычки и с правильно экранированными специальными символами.

Так как функция quote_literal помечена как STRICT , то она всегда возвращает NULL, если переданный ей аргумент имеет значение NULL. В приведённом выше примере, если newvalue или keyvalue были NULL, вся строка с текстом запроса станет NULL, что приведёт к ошибке в EXECUTE . Для предотвращения этой проблемы используйте функцию quote_nullable , которая работает так же, как quote_literal за исключением того, что при вызове с пустым аргументом возвращает строку 'NULL'. Например:

EXECUTE 'UPDATE tbl SET ' || quote_ident(colname) || ' = ' || quote_nullable(newvalue) || ' WHERE key = ' || quote_nullable(keyvalue);

Если вы имеете дело со значениями, которые могут быть пустыми, то, как правило, нужно использовать quote_nullable вместо quote_literal .

Как обычно, необходимо убедиться, что значения NULL в запросе не принесут неожиданных результатов. Например, следующее условие WHERE

'WHERE key = ' || quote_nullable(keyvalue)

никогда не выполнится, если keyvalue — NULL, так как применение = с операндом, имеющим значение NULL, всегда даёт NULL. Если требуется, чтобы NULL обрабатывалось как обычное значение, то условие выше нужно переписать так:

'WHERE key IS NOT DISTINCT FROM ' || quote_nullable(keyvalue)

(В настоящее время IS NOT DISTINCT FROM работает менее эффективно, чем = , так что используйте этот способ, только если это действительно необходимо. Подробнее особенности NULL и IS DISTINCT описаны в Разделе 9.2.)

Обратите внимание, что использование знака $ полезно только для взятия в кавычки фиксированного текста. Плохая идея написать этот пример так:

EXECUTE 'UPDATE tbl SET ' || quote_ident(colname) || ' = $$' || newvalue || '$$ WHERE key = ' || quote_literal(keyvalue);

потому что newvalue может также содержать $$ . Эта же проблема может возникнуть и с любым другим разделителем, используемым после знака $ . Поэтому, чтобы безопасно заключить заранее неизвестный текст в кавычки, нужно использовать соответствующие функции: quote_literal , quote_nullable , или quote_ident .

Динамические операторы SQL также можно безопасно сформировать, используя функцию format (см. Подраздел 9.4.1). Например:

EXECUTE format('UPDATE tbl SET %I = %L ' 'WHERE key = %L', colname, newvalue, keyvalue);

Указание %I равнозначно вызову quote_ident , а %L — вызову quote_nullable . Функция format может применяться в сочетании с предложением USING :

EXECUTE format('UPDATE tbl SET %I = $1 WHERE key = $2', colname) USING newvalue, keyvalue;

Эта форма лучше, так как с ней переменные обрабатываются в их собственном формате данных, а не преобразуются безусловно в текст, чтобы затем выводиться с использованием %L . Она также и более эффективна.

Более объёмный пример использования динамической команды и EXECUTE можно увидеть в Примере 42.10. В нём создаётся и динамически выполняется команда CREATE FUNCTION для определения новой функции.

42.5.5. Статус выполнения команды

Определить результат команды можно несколькими способами. Во-первых, можно воспользоваться командой GET DIAGNOSTICS , имеющей форму:

GET [ CURRENT ] DIAGNOSTICS переменная < = | := >элемент [ , . ];

Эта команда позволяет получить системные индикаторы состояния. Слово CURRENT не несёт смысловой нагрузки (но см. также описание GET STACKED DIAGNOSTICS в Подразделе 42.6.8.1). Каждый элемент представляется ключевым словом, указывающим, какое значение состояния нужно присвоить заданной переменной (она должна иметь подходящий тип данных, чтобы принять его). Доступные в настоящее время элементы состояния показаны в Таблице 42.1. Вместо принятого в стандарте SQL присваивания ( = ) можно применять присваивание с двоеточием ( := ). Например:

GET DIAGNOSTICS integer_var = ROW_COUNT;

Таблица 42.1. Доступные элементы диагностики

Имя Тип Описание
ROW_COUNT bigint число строк, обработанных последней командой SQL
PG_CONTEXT text строки текста, описывающие текущий стек вызовов (см. Подраздел 42.6.9)

Второй способ определения статуса выполнения команды заключается в проверке значения специальной переменной FOUND , имеющей тип boolean . При вызове функции на PL/pgSQL , переменная FOUND инициализируется в ложь. Далее, значение переменной изменяется следующими операторами:

SELECT INTO записывает в FOUND true, если строка присвоена, или false, если строки не были получены.

PERFORM записывает в FOUND true, если строки выбраны (и отброшены) или false, если строки не выбраны.

UPDATE , INSERT и DELETE записывают в FOUND true, если при их выполнении была задействована хотя бы одна строка, или false, если ни одна строка не была задействована.

FETCH записывают в FOUND true, если команда вернула строку, или false, если строка не выбрана.

MOVE записывают в FOUND true при успешном перемещении курсора, в противном случае — false.

FOR , как и FOREACH , записывает в FOUND true, если была произведена хотя бы одна итерация цикла, в противном случае — false. При этом значение FOUND будет установлено только после выхода из цикла. Пока цикл выполняется, оператор цикла не изменяет значение переменной. Но другие операторы внутри цикла могут менять значение FOUND .

Другие операторы PL/pgSQL не меняют значение FOUND . Помните в частности, что EXECUTE изменяет вывод GET DIAGNOSTICS , но не меняет FOUND .

FOUND является локальной переменной в каждой функции PL/pgSQL и любые её изменения, влияют только на текущую функцию.

42.5.6. Не делать ничего

Иногда бывает полезен оператор, который не делает ничего. Например, он может показывать, что одна из ветвей if/then/else сознательно оставлена пустой. Для этих целей используется NULL :

NULL;

В следующем примере два фрагмента кода эквивалентны:

BEGIN y := x / 0; EXCEPTION WHEN division_by_zero THEN NULL; -- ошибка игнорируется END;
BEGIN y := x / 0; EXCEPTION WHEN division_by_zero THEN -- ошибка игнорируется END;

Какой вариант выбрать — дело вкуса.

Примечание

В Oracle PL/SQL не допускаются пустые списки операторов, поэтому NULL обязателен в подобных ситуациях. В PL/pgSQL разрешается не писать ничего.

Пред. Наверх След.
42.4. Выражения Начало 42.6. Управляющие структуры

7) Переменная SQL Server

В MS SQL переменные – это объект, который выступает в качестве заполнителя для области памяти. Переменная содержит одно значение данных.

В этом уроке вы узнаете:

  • Что такое переменная?
  • Типы переменных: локальные, глобальные
  • Как ОБЪЯВИТЬ переменную
  • Присвоение значения переменному
    • При объявлении переменной используется ключевое слово DECLARE.
    • Использование SET
    • ИСПОЛЬЗОВАНИЕ ВЫБРАТЬ
    • Другие примеры

    Типы переменных: локальные, глобальные

    MS SQL имеет два типа переменных:

    1. Локальная переменная
    2. Глобальная переменная.

    Однако пользователь может создать только локальную переменную.

    Ниже на рисунке показаны два типа переменных, доступных на сервере MS SQL.

    Локальная переменная:

    • Пользователь объявляет локальную переменную.
    • По умолчанию локальная переменная начинается с @.
    • Каждая область локальной переменной имеет ограничение на текущий пакет или процедуру в пределах любого данного сеанса.

    Глобальная переменная:

    • Система поддерживает глобальную переменную . Пользователь не может их объявить.
    • Глобальная переменная начинается с @@
    • Он хранит информацию о сеансе .

    Как ОБЪЯВИТЬ переменную

    • Перед использованием любой переменной в пакете или процедуре, вам необходимо объявить переменную.
    • Команда DECLARE используется для переменной DECLARE, которая выступает в качестве заполнителя для ячейки памяти.
    • Только после того, как объявление сделано, переменная может использоваться в последующей части пакета или процедуры.

    Синтаксис TSQL:

    DECLARE

    Правила:

    • Инициализация – необязательная вещь при объявлении.
    • По умолчанию, DECLARE инициализирует переменную в NULL.
    • Использование ключевого слова «AS» необязательно.
    • Чтобы объявить более одной локальной переменной, используйте запятую после определения первой локальной переменной, а затем определите имя следующей локальной переменной и тип данных.

    Примеры объявления переменной:

    Запрос: с «КАК»

    DECLARE @COURSE_ID AS INT;

    Запрос: без ‘AS’

    DECLARE @COURSE_NAME VARCHAR (10);

    Запрос: ОБЪЯВИТЬ две переменные

    DECLARE @COURSE_ID AS INT, @COURSE_NAME VARCHAR (10);

    Присвоение значения переменному

    Вы можете присвоить значение переменной следующими тремя способами :

    1. При объявлении переменной используется ключевое слово DECLARE.
    2. Использование SET
    3. Использование SELECT

    Давайте посмотрим на все три способа в деталях:

    При объявлении переменной используется ключевое слово DECLARE.

    Синтаксис T-SQL:

    DECLARE

    Здесь после типа данных мы можем использовать ‘=’, за которым следует присвоить значение

    Запрос:

    DECLARE @COURSE_ID AS INT = 5 PRINT @COURSE_ID

    Использование SET

    Иногда мы хотим разделить объявление и инициализацию. SET может использоваться для назначения значений переменной, после объявления переменной. Ниже приведены различные способы назначения значений с помощью SET:

    Пример : присвоение значения переменной с помощью SET

    Синтаксис:

    DECLARE @Local_Variable SET @Local_Variable =

    Запрос:

    DECLARE @COURSE_ID AS INT SET @COURSE_ID = 5 PRINT @COURSE_ID

    Пример : присвоить значение нескольким переменным с помощью SET.

    Синтаксис:

    DECLARE @Local_Variable _1 , @Local_Variable_2 , SET @Local_Variable_1 = SET @Local_Variable_2 =

    Правило: одно ключевое слово SET может использоваться для присвоения значения только одной переменной .

    Запрос:

    DECLARE @COURSE_ID as INT, @COURSE_NAME AS VARCHAR(5) SET @COURSE_ID = 5 SET @COURSE_NAME = 'UNIX' PRINT @COURSE_ID PRINT @COURSE_NAME

    Пример : присвоение значения переменной с помощью скалярного подзапроса с помощью SET

    Синтаксис:

    DECLARE @Local_Variable_1 , @Local_Variable_2 ,SET @Local_Variable_1 = (SELECT from where )

    Правила:

    • Заключите запрос в скобки.
    • Запрос должен быть скалярным запросом. Скалярный запрос – это запрос с результатами в виде одной строки и одного столбца. В противном случае запрос выдаст ошибку.
    • Если запрос возвращает ноль строк, то для переменной устанавливается значение EMPTY, т.е. NULL.

    Предположение: предположим, что у нас есть таблица «Guru99» с двумя столбцами, как показано ниже:

    Мы будем использовать таблицу «Guru99» в дальнейших уроках

    Пример 1: Когда подзапрос возвращает одну строку в результате.

    DECLARE @COURSE_NAME VARCHAR (10) SET @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 3) PRINT @COURSE_NAME

    Пример 2: когда подзапрос возвращает нулевую строку в результате

    DECLARE @COURSE_NAME VARCHAR (10) SET @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 5) PRINT @COURSE_NAME

    В данном конкретном случае значением переменной является ПУСТО, то есть ПУСТО (NULL).

    ИСПОЛЬЗОВАНИЕ ВЫБРАТЬ

    Так же, как SET, мы также можем использовать SELECT для присвоения значений переменным, после объявления переменной с помощью DECLARE. Ниже приведены различные способы присвоения значения с помощью SELECT:

    Пример : присвоение значения переменной с помощью SELECT

    Синтаксис:

    DECLARE @LOCAL_VARIABLE SELECT @LOCAL_VARIABLE =

    Запрос:

    DECLARE @COURSE_ID INT SELECT @COURSE_ID = 5 PRINT @COURSE_ID

    Пример : присвоение значения нескольким переменным с помощью SELECT

    Синтаксис:

    DECLARE @Local_Variable _1 , @Local_Variable _2 ,SELECT @Local_Variable _1 = , @Local_Variable _2 =

    Правила: В отличие от SET, SELECT может использоваться для присвоения значения нескольким переменным, разделенным запятой .

    DECLARE @COURSE_ID as INT, @COURSE_NAME AS VARCHAR(5) SELECT @COURSE_ID = 5, @COURSE_NAME = 'UNIX' PRINT @COURSE_ID PRINT @COURSE_NAME

    Пример : присвоение значения переменной с помощью подзапроса с помощью SELECT

    Синтаксис:

    DECLARE @Local_Variable_1 , @Local_Variable _2 ,SELECT @Local_Variable _1 = (SELECT from where )

    Правила:

    • Заключите запрос в круглые скобки.
    • Запрос должен быть скалярным запросом. Скалярный запрос – это запрос с результатом в виде одной строки и одного столбца. В противном случае запрос выдаст ошибку.
    • Если запрос возвращает ноль строк, то переменная имеет значение EMPTY, то есть NULL.
    • Пересмотрите нашу таблицу ‘Guru99’

    Пример 1: Когда подзапрос возвращает одну строку в результате.

    DECLARE @COURSE_NAME VARCHAR (10) SELECT @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 1) PRINT @COURSE_NAME

    Пример 2: когда подзапрос возвращает нулевую строку в результате

    DECLARE @COURSE_NAME VARCHAR (10) SELECT @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 5) PRINT @COURSE_NAME

    В данном конкретном случае переменная имеет значение ПУСТО, то есть NULL.

    Пример 3. Присвойте значение переменной с помощью регулярного оператора SELECT.

    Синтаксис:

    DECLARE @Local_Variable _1 , @Local_Variable _2 ,SELECT @Local_Variable _1 = from where

    Правила:

    • В отличие от SET, если запрос приводит к нескольким строкам, тогда значение переменной устанавливается равным значению последней строки.
    • Если запрос возвращает ноль строк, то для переменной устанавливается значение EMPTY, т.е. NULL.

    Запрос 1: запрос возвращает одну строку.

    DECLARE @COURSE_NAME VARCHAR (10) SELECT @COURSE_NAME = Tutorial_name from Guru99 where Tutorial_ID = 3 PRINT @COURSE_NAME

    Запрос 2: запрос возвращает несколько строк.

    DECLARE @COURSE_NAME VARCHAR (10) SELECT @COURSE_NAME = Tutorial_name from Guru99 PRINT @COURSE_NAME

    В этом особом случае значение переменной устанавливается равным значению последней строки .

    Запрос 3: запрос возвращает ноль строк.

    DECLARE @COURSE_NAME VARCHAR (10) SELECT @COURSE_NAME = Tutorial_name from Guru99 where Tutorial_ID = 5 PRINT @COURSE_NAME

    В этом конкретном случае переменная является ПУСТОЙ, т. Е. NULL.

    Другие примеры

    Использование переменной в запросе

    Запрос:

    DECLARE @COURSE_ID Int = 1 SELECT * from Guru99 where Tutorial_id = @COURSE_ID

    Интересные факты!

    • Локальная переменная может быть отображена с помощью PRINT, а также SELECT COMMAND
    • Таблица Тип данных не позволяет использовать «AS» во время объявления.
    • SET соответствует стандартам ANSI, а SELECT – нет.
    • Создание локальной переменной с именем как @ также разрешено. Мы можем объявить это как, например:
    'DECLARE @@ as VARCHAR (10)'

    Резюме:

    • Переменные – это объект, который действует как заполнитель.
    • Существуют два типа переменных: локальный и глобальный
    • Мы можем назначить переменную следующими тремя способами: При использовании DECLARE
      Использование SET
      USING SELECT

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

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