Присвоение значений переменных для выделенных пулов 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 имеет два типа переменных:
- Локальная переменная
- Глобальная переменная.
Однако пользователь может создать только локальную переменную.
Ниже на рисунке показаны два типа переменных, доступных на сервере 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);
Присвоение значения переменному
Вы можете присвоить значение переменной следующими тремя способами :
- При объявлении переменной используется ключевое слово DECLARE.
- Использование SET
- Использование 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