DECLARE @local_variable (Transact-SQL)
Переменные объявляются в теле пакета или процедуры при помощи инструкции DECLARE, а значения им присваиваются при помощи инструкций SET или SELECT. При помощи этой инструкции можно объявлять переменные курсоров для использования в других инструкциях. После декларации все переменные инициализируются значением NULL, если иное значение не предоставляется как часть декларации.
Синтаксис
Следующий синтаксис предназначен для SQL Server и Базы данных SQL Azure:
DECLARE < < @local_variable [AS] data_type [ = value ] >| < @cursor_variable_name CURSOR >> [ . n ] | < @table_variable_name [AS] > ::= TABLE ( < | | > > [ . n ] ) ::= column_name < scalar_data_type | AS computed_column_expression >[ COLLATE collation_name ] [ [ DEFAULT constant_expression ] | IDENTITY [ (seed, increment ) ] ] [ ROWGUIDCOL ] [ ] [ ] ::= < [ NULL | NOT NULL ] < PRIMARY KEY | UNIQUE >[ CLUSTERED | NONCLUSTERED ] [ WITH FILLFACTOR = fillfactor | WITH ( < index_option >[ . n ] ) [ ON < filegroup | "default" >] | [ CHECK ( logical_expression ) ] [ . n ] > ::= INDEX index_name [ CLUSTERED | NONCLUSTERED ] [ WITH ( [ . n ] ) ] [ ON < partition_scheme_name (column_name ) | filegroup_name | default >] [ FILESTREAM_ON < filestream_filegroup_name | partition_scheme_name | "NULL" >] ::= < < PRIMARY KEY | UNIQUE >[ CLUSTERED | NONCLUSTERED ] ( column_name [ ASC | DESC ] [ . n ] [ WITH FILLFACTOR = fillfactor | WITH ( [ . n ] ) | [ CHECK ( logical_expression ) ] [ . n ] > ::= < < INDEX index_name [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] (column_name [ ASC | DESC ] [ . n ] ) | INDEX index_name CLUSTERED COLUMNSTORE | INDEX index_name [ NONCLUSTERED ] COLUMNSTORE ( column_name [ . n ] ) >[ WITH ( [ . n ] ) ] [ ON < partition_scheme_name ( column_name ) | filegroup_name | default >] [ FILESTREAM_ON < filestream_filegroup_name | partition_scheme_name | "NULL" >] > ::= < PAD_INDEX = < ON | OFF >| FILLFACTOR = fillfactor | IGNORE_DUP_KEY = < ON | OFF >| STATISTICS_NORECOMPUTE = < ON | OFF >| STATISTICS_INCREMENTAL = < ON | OFF >| ALLOW_ROW_LOCKS = < ON | OFF >| ALLOW_PAGE_LOCKS = < ON | OFF >| OPTIMIZE_FOR_SEQUENTIAL_KEY = < ON | OFF >| COMPRESSION_DELAY = < 0 | delay [ Minutes ] >| DATA_COMPRESSION = < NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE >[ ON PARTITIONS ( < partition_number_expression | > [ , . n ] ) ] | XML_COMPRESSION = < ON | OFF >[ ON PARTITIONS ( < | > [ , . n ] ) ] ] >
Следующий синтаксис предназначен для Azure Synapse Analytics и Parallel Data Warehouse и Microsoft Fabric:
DECLARE < < @local_variable [AS] data_type >[ = value [ COLLATE ] ] > [ . n ]
Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.
Аргументы
@local_variable
Имя переменной. Имена переменных должны начинаться с символа @. Имена локальных переменных должны соответствовать правилам для идентификаторов.
data_type
Любой системный тип данных, определяемый пользователем табличный тип среды CLR или псевдоним типа данных. Переменная не может иметь тип данных text, ntext или image.
Дополнительные сведения о типах данных в системе см. в разделе Типы данных (Transact-SQL). Дополнительные сведения об определяемых пользователем типах данных CLR или о псевдонимах типов данных см. в разделе CREATE TYPE(Transact-SQL).
= значение
Подставляет значение переменной. Значение может быть константой или выражением, но должно совпадать с объявленным типом переменной или явно преобразовываться в этот тип. Дополнительные сведения см. в статье Выражения (Transact-SQL).
@cursor_variable_name
Имя переменной курсора. Имена переменных курсора должны начинаться с символа @ и должны соответствовать правилам именования идентификаторов.
CURSOR
Указывает, что переменная является локальной переменной курсора.
@table_variable_name
Имя переменной типа table. Имена переменных должны начинаться с символа @ и соответствовать правилам именования идентификаторов.
Определяет тип данных table. Декларация таблицы включает определения столбцов, имен, типов данных и ограничений. Допустимы только ограничения PRIMARY KEY, UNIQUE, NULL и CHECK. Псевдоним типа данных не может использоваться как скалярный тип данных столбца, если к этому столбцу привязано правило или значение по умолчанию.
Аргумент представляет собой подмножество данных, используемых для определения таблицы в инструкции CREATE TABLE. Сюда включены элементы и наиболее существенные определения. Дополнительные сведения см. в статье CREATE TABLE (Transact-SQL).
n
Заполнитель, указывающий на то, что могут быть заданы несколько переменных и им могут быть присвоены значения. При объявлении переменных типа table в инструкции DECLARE единственной объявляемой переменной должна быть переменная типа table.
column_name
Имя столбца в таблице.
scalar_data_type
Указывает, что столбец имеет скалярный тип данных.
computed_column_expression
Выражение, определяющее значение вычисляемого столбца. Значение вычисляется из выражения при помощи других столбцов той же таблицы. Например, вычисляемый столбец может иметь определение cost AS price * qty. Выражение может быть именем невычисляемого столбца, константой, встроенной функцией, переменной или любым их сочетанием, созданным с помощью одного или нескольких операторов. Выражение не может быть вложенным запросом или определяемой пользователем функцией. Выражение не может ссылаться на определяемый пользователем тип данных CLR.
[ COLLATE collation_name ]
Задает параметры сортировки для столбца. Аргумент collation_name может быть либо именем параметров сортировки Windows, либо именем параметров сортировки SQL и применим только к столбцам типа char, varchar, text, nchar, nvarchar и ntext. Если этот аргумент не указан, столбцу назначаются либо параметры сортировки определяемого пользователем типа данных (если столбец принадлежит к определяемому пользователем типу данных), либо параметры сортировки текущей базы данных.
Дополнительные сведения об именах параметров сортировки Windows и SQL: COLLATE (Transact-SQL).
ПО УМОЛЧАНИЮ
Указывает значение, присваиваемое столбцу в случае отсутствия явно заданного значения при вставке. Определения DEFAULT могут применяться к любым столбцам, кроме имеющих тип timestamp или обладающих свойством IDENTITY. Определения DEFAULT удаляются, когда таблица удаляется из памяти. По умолчанию могут использоваться только константные значения, например символьные строки, системные функции, например SYSTEM_USER(), или NULL. Для обеспечения совместимости с более ранними версиями SQL Server можно назначить имя ограничения default.
constant_expression
Константа, NULL или системная функция, используемые в качестве значения по умолчанию для столбца.
IDENTITY
Указывает, что новый столбец является столбцом идентификаторов. При добавлении новой строки в таблицу SQL Server предоставляет уникальное добавочное значение для столбца. Столбцы идентификаторов обычно используются с ограничением PRIMARY KEY для поддержания уникальности идентификаторов строк в таблице. Свойство IDENTITY может назначаться для столбцов типа tinyint, smallint, int, decimal(p,0) или numeric(p,0). Для каждой таблицы можно создать только один столбец идентификаторов. Ограниченные значения по умолчанию и ограничения DEFAULT не могут использоваться в столбце идентификаторов. Необходимо указывать либо оба значения seed и increment, либо ни тот, ни другой. Если ничего не указано, применяется значение по умолчанию (1,1).
seed
Значение, используемое для первой строки, загружаемой в таблицу.
increment
Значение, добавляемое к значению идентификатора предыдущей загруженной строки.
ROWGUIDCOL
Указывает, что новый столбец является столбцом глобального уникального идентификатора строки. Только один столбец типа uniqueidentifier в таблице может быть назначен в качестве столбца ROWGUIDCOL. Свойство ROWGUIDCOL может быть присвоено только столбцу типа uniqueidentifier.
NULL | NOT NULL
Указывает, является ли значение null допустимым в переменной. По умолчанию имеет значение NULL.
ПЕРВИЧНЫЙ КЛЮЧ
Ограничение, которое с помощью уникального индекса требует целостности сущностей для данного столбца или столбцов. Можно создать только одно ограничение PRIMARY KEY для таблицы.
UNIQUE
Ограничение, которое с помощью уникального индекса обеспечивает целостность сущностей для данного столбца или столбцов. В таблице может быть несколько ограничений UNIQUE.
CLUSTERED | NONCLUSTERED
Указывает, что для ограничения PRIMARY KEY или UNIQUE создается кластеризованный или некластеризованный индекс. Ограничения PRIMARY KEY используют параметр CLUSTERED, а ограничения UNIQUE используют параметр NONCLUSTERED.
Параметр CLUSTERED может быть указан только для одного ограничения. Если параметр CLUSTERED указан для ограничения UNIQUE и указано ограничение PRIMARY KEY, то PRIMARY KEY использует NONCLUSTERED.
ПРОВЕРКА
Ограничение, обеспечивающее целостность домена путем ограничения возможных значений, которые могут быть введены в столбец или столбцы.
logical_expression
Логическое выражение, возвращающее значения TRUE или FALSE.
Указывает один или более параметров индекса. Для переменных table нельзя явно создавать индексы, при этом статистика для переменных table не сохраняется. Начиная с SQL Server 2014 (12.x) реализован новый синтаксис, который позволяет создавать определенные типы индекса прямо в коде определения таблицы. С помощью этого нового синтаксиса можно создавать индексы в переменной table как часть определения таблицы. В некоторых случаях можно добиться повышения производительности за счет использования временных таблиц, которые позволяют работать с индексами и статистикой.
Полное описание этих параметров см. в разделе CREATE TABLE.
Табличные переменные и расчетное количество строк
Для переменных Table не предусмотрена статистика распределения. Во многих случаях оптимизатор строит план запроса на предположении, что у табличной переменной нет строк или есть одна строка. Дополнительные сведения см. в описании типа данных таблицы — ограничения.
По этой причине следует проявлять осторожность относительно использования табличной переменной, если ожидается большое число строк (больше 100). Рассмотрите один из следующих вариантов:
- Временные таблицы могут быть более эффективным решением, чем табличные переменные, если это число строк может быть большим (больше 100).
- Для запросов, которые объединяют табличную переменную с другими таблицами, используйте указание RECOMPILE, чтобы оптимизатор использовал правильную кратность для табличной переменной.
- В Базе данных SQL Azure, начиная с SQL Server 2019 (15.x) функция отложенной компиляции в табличной переменной будет распространять оценки кратности в зависимости от фактического количества строк табличных переменных, предоставляя уточненное число строк для оптимизации плана выполнения. Дополнительные сведения см. в статье Интеллектуальная обработка запросов в базах данных SQL.
Замечания
Переменные часто используются в пакете или процедуре в качестве счетчиков для циклов WHILE, LOOP или в блоке IF…ELSE.
Переменные могут использоваться только в выражениях, но не вместо имен объектов или ключевых слов. Для построения динамических инструкций SQL используйте EXECUTE.
Областью локальной переменной является пакет, в котором она объявлена.
Табличная переменная необязательно является резидентной. В случае нехватки памяти страницы, относящиеся к табличной переменной, можно перенести в базу данных tempdb .
Встроенный индекс можно определить в табличной переменной.
На переменную курсора, которая в настоящее время содержит назначенный ей курсор, можно ссылаться в качестве источника из:
- Инструкция CLOSE
- DEALLOCATE, инструкция
- FETCH, инструкция
- OPEN, инструкция
- позиционированных инструкций DELETE или UPDATE;
- инструкции SET CURSOR с использованием переменных (в правой части).
Во всех этих инструкциях SQL Server формирует ошибку, если переменная курсора, на которую они ссылаются, существует, но не содержит курсора, назначенного ей в настоящее время. Если переменной курсора, на которую производится ссылка, не существует, сервер SQL Server формирует ту же ошибку, что и для необъявленной переменной другого типа.
- Может быть целью типа курсора или другой переменной курсора. Дополнительные сведения см. в разделе SET @local_variable (Transact-SQL).
- Может быть объектом ссылки в качестве цели выходного параметра курсора в инструкции EXECUTE, если эта переменная не содержит курсора, назначенного ей в настоящее время.
- Должна рассматриваться в качестве указателя на курсор.
Примеры
А. Использование инструкции DECLARE
В следующем примере локальная переменная с именем @find используется для получения контактных данных для лиц с фамилией, начинающейся на Man .
USE AdventureWorks2022; GO DECLARE @find VARCHAR(30); /* Also allowed: DECLARE @find VARCHAR(30) = 'Man%'; */ SET @find = 'Man%'; SELECT p.LastName, p.FirstName, ph.PhoneNumber FROM Person.Person AS p JOIN Person.PersonPhone AS ph ON p.BusinessEntityID = ph.BusinessEntityID WHERE LastName LIKE @find;
LastName FirstName Phone ------------------- ----------------------- ------------------------- Manchepalli Ajay 1 (11) 500 555-0174 Manek Parul 1 (11) 500 555-0146 Manzanares Tomas 1 (11) 500 555-0178 (3 row(s) affected)
B. Использование инструкции DECLARE с двумя переменными
В следующем примере извлекаются имена представителей продаж Adventure Works Cycles, которые находятся на территории продаж Северная Америка n и имеют по крайней мере $2000 000 в продажах в течение года.
USE AdventureWorks2022; GO SET NOCOUNT ON; GO DECLARE @Group nvarchar(50), @Sales MONEY; SET @Group = N'North America'; SET @Sales = 2000000; SET NOCOUNT OFF; SELECT FirstName, LastName, SalesYTD FROM Sales.vSalesPerson WHERE TerritoryGroup = @Group and SalesYTD >= @Sales;
C. Объявление переменной типа table
В следующем примере создается переменная типа table , в которой хранятся значения, задаваемые в предложении OUTPUT инструкции UPDATE. Две следующие инструкции SELECT возвращают значения в табличную переменную @MyTableVar , а результаты операции обновления — в таблицу Employee . Результаты в столбце INSERTED.ModifiedDate отличаются от значений в столбце ModifiedDate таблицы Employee . Это связано с тем, что для таблицы AFTER UPDATE определен триггер ModifiedDate , обновляющий значение Employee до текущей даты. Однако столбцы, возвращенные из OUTPUT , отражают состояние данных перед срабатыванием триггеров. Дополнительные сведения см. в статье Предложение OUTPUT (Transact-SQL).
USE AdventureWorks2022; GO DECLARE @MyTableVar TABLE ( EmpID INT NOT NULL, OldVacationHours INT, NewVacationHours INT, ModifiedDate DATETIME); UPDATE TOP (10) HumanResources.Employee SET VacationHours = VacationHours * 1.25 OUTPUT INSERTED.BusinessEntityID, DELETED.VacationHours, INSERTED.VacationHours, INSERTED.ModifiedDate INTO @MyTableVar; --Display the result set of the table variable. SELECT EmpID, OldVacationHours, NewVacationHours, ModifiedDate FROM @MyTableVar; GO --Display the result set of the table. --Note that ModifiedDate reflects the value generated by an --AFTER UPDATE trigger. SELECT TOP (10) BusinessEntityID, VacationHours, ModifiedDate FROM HumanResources.Employee; GO
D. Объявление переменной таблицы типов со встроенными индексами
В указанном ниже примере создается переменная table с кластеризованным встроенным индексом и двумя некластеризованными встроенными индексами.
DECLARE @MyTableVar TABLE ( EmpID INT NOT NULL, PRIMARY KEY CLUSTERED (EmpID), UNIQUE NONCLUSTERED (EmpID), INDEX CustomNonClusteredIndex NONCLUSTERED (EmpID) ); GO
Указанный ниже запрос возвращает сведения об индексах, созданных в предыдущем запросе.
SELECT * FROM tempdb.sys.indexes WHERE object_id < 0; GO
Д. Объявление переменной определяемого пользователем табличного типа
Следующий пример демонстрирует создание параметра, возвращающего табличное значение, или табличной переменной с именем @LocationTVP . Здесь требуется соответствующий определяемый пользователем табличный тип с именем LocationTableType . Дополнительные сведения о создании определяемого пользователем табличного типа см. в разделе CREATE TYPE (Transact-SQL). Дополнительные сведения о возвращающих табличные значения параметрах см. в разделе Использование параметров, возвращающих табличные значения (ядро СУБД).
DECLARE @LocationTVP AS LocationTableType;
Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)
F. Использование инструкции DECLARE
В следующем примере локальная переменная с именем @find используется для получения контактных данных для лиц с фамилией, начинающейся на Walt .
-- Uses AdventureWorks DECLARE @find VARCHAR(30); /* Also allowed: DECLARE @find VARCHAR(30) = 'Man%'; */ SET @find = 'Walt%'; SELECT LastName, FirstName, Phone FROM DimEmployee WHERE LastName LIKE @find;
G. Использование инструкции DECLARE с двумя переменными
В следующем примере используются переменные для указания имен и фамилий сотрудников в таблице DimEmployee .
-- Uses AdventureWorks DECLARE @lastName VARCHAR(30), @firstName VARCHAR(30); SET @lastName = 'Walt%'; SET @firstName = 'Bryan'; SELECT LastName, FirstName, Phone FROM DimEmployee WHERE LastName LIKE @lastName AND FirstName LIKE @firstName;
См. также
- EXECUTE (Transact-SQL)
- Встроенные функции (Transact-SQL)
- SELECT (Transact-SQL)
- table (Transact-SQL)
- Сравнение типизированного и нетипизированного XML
Обратная связь
Были ли сведения на этой странице полезными?
Что такое declare в sql
DECLARE — определить курсор
Синтаксис
DECLAREимя[ BINARY ] [ INSENSITIVE ] [ [ NO ] SCROLL ] CURSOR [ < WITH | WITHOUT >HOLD ] FORзапрос
Описание
Оператор DECLARE позволяет пользователю создавать курсоры, с помощью которых можно выбирать по очереди некоторое количество строк из результата большого запроса. Когда курсор создан, через него можно получать строки, применяя команду FETCH .
Примечание
На этой странице описывается применение курсоров на уровне команд SQL. Если вы попытаетесь использовать курсоры внутри функции PL/pgSQL , правила будут другими — см. Раздел 40.7.
Параметры
Имя создаваемого курсора. BINARY
Курсор с таким свойством возвращает данные в двоичном, а не текстовом формате. INSENSITIVE
Указывает, что данные, считываемые из курсора, не должны зависеть от изменений, которые могут происходить в нижележащих таблицах после создания курсора. В PostgreSQL это поведение подразумевается по умолчанию, так что это ключевое слово ни на что не влияет и принимается только для совместимости со стандартом SQL. SCROLL
NO SCROLL
Указание SCROLL определяет, что курсор может прокручивать набор данных и получать строки непоследовательно (например, в обратном порядке). В зависимости от сложности плана запроса указание SCROLL может отрицательно отразиться на скорости выполнения запроса. Указание NO SCROLL , напротив, определяет, что через курсор нельзя будет получать строки в произвольном порядке. По умолчанию прокрутка в некоторых случаях разрешается; но это не равнозначно эффекту указания SCROLL . За подробностями обратитесь к Замечания. WITH HOLD
WITHOUT HOLD
Указание WITH HOLD определяет, что курсор можно продолжать использовать после успешной фиксации создавшей его транзакции. WITHOUT HOLD определяет, что курсор нельзя будет использовать за рамками транзакции, создавшей его. Если не указано ни WITHOUT HOLD , ни WITH HOLD , по умолчанию подразумевается WITHOUT HOLD . запрос
Команда SELECT или VALUES , выдающая строки, которые будут получены через курсор.
Ключевые слова BINARY , INSENSITIVE и SCROLL могут указываться в любом порядке.
Замечания
Обычный курсор выдаёт данные в текстовом виде, в каком их выдаёт SELECT . Однако с указанием BINARY курсор может выдавать их и в двоичном формате. Это упрощает операции преобразования данных для сервера и клиента, за счёт дополнительных усилий, требующихся от программиста для работы с платформозависимыми двоичными форматами. Например, если запрос получает значение 1 из целочисленного столбца, обычный курсор выдаст строку, содержащую 1 , тогда как через двоичный курсор будет получено четырёхбайтовое поле, содержащее внутреннее представление значения (с сетевым порядком байтов).
Двоичные курсоры должны применяться с осмотрительностью. Многие приложения, в том числе psql , не приспособлены к работе с двоичными курсорами и ожидают, что данные будут поступать в текстовом формате.
Примечание
Когда клиентское приложение выполняет команду FETCH , используя протокол « расширенных запросов » , в сообщении Bind этого протокола указывается, в каком формате, текстовом или двоичном, должны быть получены данные. Это указание переопределяет свойство курсора, заданное в его объявлении. Таким образом, концепция курсора, объявляемого двоичным, становится устаревшей при использовании протокола расширенных запросов — любой курсор может быть прочитан как текстовый или двоичный.
Если в команде объявления курсора не указано WITH HOLD , созданный ей курсор может использоваться только в текущей транзакции. Таким образом, оператор DECLARE без WITH HOLD бесполезен вне блока транзакции: курсор будет существовать только до завершения этого оператора. Поэтому PostgreSQL сообщает об ошибке, если такая команда выполняется вне блока транзакции. Чтобы определить блок транзакции, примените команды BEGIN и COMMIT (или ROLLBACK ).
Если в объявлении курсора указано WITH HOLD и транзакция, создавшая курсор, успешно фиксируется, к этому курсору могут продолжать обращаться последующие транзакции в этом сеансе. (Но если создавшая курсор транзакция прерывается, курсор уничтожается.) Курсор со свойством WITH HOLD (удерживаемый) может быть закрыт явно, командой CLOSE , либо неявно, по завершении сеанса. В текущей реализации строки, представляемые удерживаемым курсором, копируются во временный файл или в область памяти, так что они остаются доступными для следующих транзакций.
Объявить курсор со свойством WITH HOLD можно, только если запрос не содержит указаний FOR UPDATE и FOR SHARE .
Указание SCROLL добавляется при определении курсора, который будет выбирать данные в обратном порядке. Это поведение требуется стандартом SQL. Однако для совместимости с предыдущими версиями, PostgreSQL допускает выборку в обратном направлении и без указания SCROLL , если план запроса курсора достаточно прост, чтобы реализовать прокрутку назад без дополнительных операций. Тем не менее, разработчикам приложений не следует рассчитывать на то, что курсор, созданный без указания SCROLL , можно будет прокручивать назад. С указанием NO SCROLL прокрутка назад запрещается в любом случае.
Выборка в обратном направлении также запрещается, если запрос содержит указания FOR UPDATE и FOR SHARE ; в этом случае указание SCROLL не принимается.
Внимание
Прокручиваемые и удерживаемые ( WITH HOLD ) курсоры могут выдавать неожиданные результаты, если они вызывают изменчивые функции (см. Раздел 35.6). Когда повторно выбирается ранее прочитанная строка, функции могут вызываться снова и выдавать результаты, отличные от полученных в первый раз. Один из способов обойти эту проблему — объявить курсор с указанием WITH HOLD и зафиксировать транзакцию, прежде чем читать из него какие-либо строки. В этом случае весь набор данных курсора будет материализован во временном хранилище, так что изменчивые функции будут выполнены для каждой строки лишь единожды.
Если запрос в определении курсора включает указания FOR UPDATE или FOR SHARE , возвращаемые курсором строки блокируются в момент первой выборки, так же, как это происходит при выполнении SELECT с этими указаниями. Кроме того, при чтении строк будут возвращаться их наиболее актуальные версии; таким образом, с этими указаниями курсор будет вести себя как « чувствительный курсор » , определённый в стандарте SQL. (Указать INSENSITIVE для курсора с запросом FOR UPDATE или FOR SHARE нельзя.)
Внимание
Обычно рекомендуется использовать FOR UPDATE , если курсор предназначается для применения в командах UPDATE . WHERE CURRENT OF и DELETE . WHERE CURRENT OF . Указание FOR UPDATE предотвращает изменение строк другими сеансами после того, как они были считаны, и до того, как выполнится команда. Без FOR UPDATE последующая команда с WHERE CURRENT OF не сработает, если строка будет изменена после создания курсора.
Ещё одна причина использовать указание FOR UPDATE в том, что без него последующие команды с WHERE CURRENT OF могут выдать ошибку, если запрос курсора не удовлетворяет оговоренному в стандарте SQL критерию « простой изменяемости » (в частности, курсор должен ссылаться только на одну таблицу и не должен использовать группировку и сортировку ( ORDER BY )). Курсоры, не удовлетворяющие этому критерию, могут работать либо не работать, в зависимости от конкретного выбранного плана; так что в худшем случае приложение может работать в тестовой, но сломается в производственной среде. С указанием FOR UPDATE курсор гарантированно будет изменяемым.
Не использовать же FOR UPDATE для команд с WHERE CURRENT OF в основном имеет смысл, только если требуется получить прокручиваемый курсор или курсор, не отражающий последующие изменения (то есть, продолжающий показывать прежние данные). Если это действительно необходимо, обязательно учтите при реализации приведённые выше замечания.
В стандарте SQL механизм курсоров предусмотрен только для встраиваемого SQL . Сервер PostgreSQL не реализует для курсоров оператор OPEN ; курсор считается открытым при объявлении. Однако ECPG , встраиваемый препроцессор SQL для PostgreSQL , следует соглашениям стандарта, в том числе поддерживая для курсоров операторы DECLARE и OPEN .
Получить список всех доступных курсоров можно, обратившись к системному представлению pg_cursors .
Примеры
DECLARE liahona CURSOR FOR SELECT * FROM films;
Другие примеры использования курсора можно найти в FETCH .
Совместимость
В стандарте SQL говорится, что чувствительность курсоров к параллельному обновлению нижележащих данных по умолчанию определяется реализацией. В PostgreSQL курсоры по умолчанию нечувствительные, а чувствительными их можно сделать с помощью указания FOR UPDATE . Другие СУБД могут работать иначе.
Стандарт SQL допускает курсоры только во встраиваемом SQL и в модулях. PostgreSQL позволяет использовать курсоры интерактивно.
Двоичные курсоры являются расширением PostgreSQL .
См. также
| Пред. | Наверх | След. |
| DEALLOCATE | Начало | DELETE |
DECLARE SQL: объявление переменных и работа с ними в MS SQL
В этой статье мы рассмотрим, что такое переменные SQL, для чего они нужны, их преимущества и недостатки. Вы узнаете, как в СУБД MS SQL происходит объявление переменных с помощью оператора DECLARE SQL. Также разберем, как присваивать значения переменным, и приведем пару примеров.
Что такое переменные SQL
В SQL переменные — именованные объекты, предназначенные для хранения временных значений. Переменные позволяют упростить написание запросов, улучшить производительность и обеспечить большую гибкость при создании сложных запросов.
В SQL переменные применяются, например, для хранения промежуточных результатов, которые используются в последующих запросах. Также они полезны в качестве параметров для хранимых процедур, которые принимают значения извне и возвращают результаты. Это упрощает процесс написания и вызова процедур и позволяет использовать одну и ту же процедуру с разными значениями параметров.
Кроме того, переменные SQL находят применение в динамических запросах, которые создаются на основе значений, полученных из других таблиц или процедур. В этом случае переменная может использоваться для хранения промежуточных результатов и конструирования запроса.
Также переменные могут использоваться для управления логикой выполнения запросов. Например, они могут использоваться для определения порядка выполнения операций или для установки условий выполнения запроса.
Далее рассмотрим на примерах объявление и использование переменных в MS SQL.
DECLARE: объявление переменных в MS SQL
В Microsoft SQL Server переменные объявляются с помощью оператора DECLARE , за которым следует имя переменной и ее тип данных. Пример объявления переменной в MS SQL:
DECLARE @someVar INT;
Здесь мы объявляем переменную @someVar типа integer . Мы можем также установить значение переменной при ее объявлении:
DECLARE @someVar INT = 24;
В этом примере мы устанавливаем значение переменной @someVar равным 24 при ее объявлении.
Также можно объявлять несколько переменных одновременно, разделяя их запятыми:
DECLARE @someVar1 INT, @someVar2 VARCHAR(50);
Здесь мы объявляем две переменные: @someVar1 типа integer и @someVar2 типа varchar с длиной 50 символов.
Присваивание значений переменным в MS SQL
В MS SQL присваивание значение переменным выполняется с помощью оператора присваивания = и ключевого слова SET . Для присвоения значения переменной используется следующий синтаксис:
SET @someVar = someValue;
Здесь @someVar — имя переменной, которой мы хотим присвоить значение, а someValue — присваиваемое значение.
К примеру, для присваивания переменной @FirstName значения Andy , можно использовать следующий запрос:
DECLARE @FirstName VARCHAR(50); SET @FirstName = 'Andy';
Этот запрос объявляет переменную @FirstName типа varchar с максимальной длиной 50 символов, а затем присваивает ей значение Andy .
Кроме того, в MS SQL Server можно также присваивать значения переменным прямо в запросах SELECT , используя ключевое слово SELECT и оператор присваивания = .
Например, чтобы присвоить переменной @TotalSum значение суммы всех значений столбца Price в таблице Products , можно использовать следующий запрос:
DECLARE @TotalCost DECIMAL(10, 2); SELECT @TotalCost = SUM(Price) FROM Products;
Вышеуказанный код объявляет переменную @TotalCost типа decimal с точностью 10 и масштабом 2 , а затем присваивает ей значение суммы всех значений столбца Price в таблице Products .
Примеры
Приведем два примера работы с переменными в MS SQL.
Допустим, у нас есть таблица Orders с полями OrderId , CustomerId , OrderDate , OrderTotal . Мы хотим написать запрос, который будет выводить информацию о заказах для конкретного клиента и в определенный период. Однако, даты начала и конца периода могут изменяться, в зависимости от условий запроса.
В этом случае мы можем использовать переменные для хранения дат начала и конца периода. Например:
DECLARE @startDate DATETIME, @endDate DATETIME; SET @startDate = '2022-01-01'; SET @endDate = '2022-12-31'; SELECT OrderId, OrderDate, OrderTotal FROM Orders WHERE CustomerId = 123 AND OrderDate BETWEEN @startDate AND @endDate;
В примере выше мы объявляем две переменные @startDate и @endDate , и присваиваем им значения начала и конца периода. Затем мы используем эти переменные в условии WHERE запроса, чтобы выбрать только те заказы, которые были сделаны для клиента 123 в период с @startDate по @endDate .
Таким образом, использование переменных позволяет нам формировать динамические запросы, управлять логикой выполнения запросов и упрощать код.
Приведем еще один пример с использованием оператора цикла WHILE для выполнения итеративных действий в базе данных.
Допустим, у нас есть таблица Products с полями ProductId , ProductName , UnitsInStock , UnitPrice . Мы хотим увеличить цену всех товаров на 10% до тех пор, пока общая стоимость всех товаров на складе не достигнет определенного значения.
В этом случае, мы можем использовать переменные для хранения текущей суммы стоимости всех товаров и количества итераций цикла. Например:
DECLARE @totalValue MONEY, @count INT; SET @totalValue = 0; SET @count = 0; WHILE @totalValue < 10000 BEGIN SET @count = @count + 1; UPDATE Products SET UnitPrice = UnitPrice * 1.1 WHERE UnitsInStock >0; SET @totalValue = (SELECT SUM(UnitsInStock * UnitPrice) FROM Products); END; SELECT 'Number of iterations: ' + CAST(@count AS VARCHAR);
В этом примере мы объявляем две переменные @totalValue и @count и присваиваем им значения значения 0 . Затем мы используем цикл WHILE , чтобы увеличить цену всех товаров на 10% до тех пор, пока общая цена товаров не достигнет 10000 . В каждой итерации цикла мы увеличиваем значение переменной @count , обновляем цену товаров и вычисляем новое значение переменной @totalValue . После того как цикл завершается, мы выводим количество итераций, которое потребовалось для достижения целевого значения общей стоимости.
Таким образом, использование переменных позволяет нам контролировать процесс выполнения итеративных действий.
Преимущества и недостатки переменных SQL
Переменные в SQL имеют ряд преимуществ и недостатков, которые необходимо учитывать при их использовании.
Преимущества переменных SQL:
- Упрощение кода: переменные позволяют сохранять промежуточные результаты и передавать значения между различными частями запроса, что упрощает написание SQL-кода.
- Удобство использования: переменные позволяют использовать имена вместо значений, что упрощает понимание кода и делает его более удобным для работы.
- Гибкость и адаптивность: переменные могут быть использованы для управления логикой выполнения запросов и обработки данных, что делает SQL-код более гибким и адаптивным к различным условиям.
Недостатки переменных SQL:
- Производительность: при использовании переменных может наблюдаться ухудшение производительности SQL-запросов, особенно при работе с большими объемами данных.
- Сложность: использование переменных может привести к увеличению сложности SQL-запросов и усложнению их отладки и сопровождения.
- Ограничения: переменные имеют свои ограничения, такие как типы данных, область видимости и временные таблицы, что может ограничивать их использование в некоторых случаях.
Заключение
Таким образом, переменные в SQL являются довольно полезным инструментом. Они позволяют создавать динамические запросы и управлять логикой их выполнения. Переменные в SQL могут использоваться в различных сценариях, от простых запросов до сложных хранимых процедур. Использование переменных позволяет сделать разработку проще и эффективнее. Однако следует помнить и о недостатках применения переменных. Например, о возможном увеличении времени выполнения запросов.
Declare SQL: краткое описание. Transact-SQL

Сегодня практически каждый современный программист знает, что такое Transact-SQL. Это расширение, которое используется в SQL Server. Данная разработка тесно интегрирована в язык Microsoft SQL и добавляет конструкторы программирования, которые изначально не предусмотрены в базах данных. T-SQL поддерживает переменные, как и в большинстве других разработках. Однако это расширение ограничивает использование переменных способами, которые не распространены в других средах.
Объявление переменных в DECLARE SQL
Для объявления переменной в T-SQL используется оператор DECLARE (). Например, в случае объявления переменной i как целое с использованием данного оператора команда будет выглядеть так: DECLARE @i int.
Зачастую при использовании SQL для выборки информации из таблиц, пользователь получает избыточные.

Хотя Microsoft не документирует эту функцию, T-SQL также поддерживает указание ключевого слова AS между именем переменной и ее типом данных, как в следующем примере: DECLARE @i AS int. Ключевое слово AS упрощает чтение инструкции DECLARE. Единственный тип данных, который не позволяет указать ключевое слово AS, - это тип данных таблицы, который является новым в SQL Server 2000. Он дает возможность определить переменную, содержащую полную таблицу.
DECLARE SQL: описание

T-SQL поддерживает только локальные переменные, которые доступны исключительно в той партии, которая их создала. Пакет - это оператор (или группа операторов), который база данных анализирует как единицу. Каждый клиентский инструмент или интерфейс имеет свой собственный способ указания, где заканчивается пакет. Например, в Query Analyzer вы используете команду GO, чтобы указать, где заканчивается пакет. Если у вас есть синтаксическая ошибка в любом заявлении, пакет не проходит фазу разбора, поэтому клиентский инструмент не отправляет пакет на SQL Server для дальнейшей обработки. Вы можете запустить код, который объявляет переменную таблицы, а затем вставляет строку в таблицу в той же партии.
Большинство пользователей современных компьютерных систем понятия не.
Пример SQL Declare Table:
DECLARE @mytable table
col1 int NOT NULL
INSERT INTO @mytable VALUES (1)
GO
Теперь объявите переменную таблицы в одной партии, а затем вставьте строку в таблицу в другую партию:
DECLARE @mytable table
col1 int NOT NULL
INSERT INTO @mytable VALUES (1)GO
Оператор INSERT терпит неудачу, потому что переменная таблицы выходит за пределы области видимости, и появляется следующее сообщение об ошибке:
Сервер: Msg 137, уровень 15, состояние 2, строка 2.
Переменные в процедурах (инструкции DECLARE, SET)

Поддержка локальных переменных в процедурах SQL позволяет назначать и извлекать значения данных в поддержку логики процедур. Переменные в процедурах определяются с помощью оператора DECLARE SQL. Значения могут присваиваться переменным с помощью инструкции SET или в качестве значения по умолчанию при объявлении переменной. Литералам, выражениям, результатам запроса и специальным значениям регистра могут быть присвоены переменные.
Значения переменных могут быть назначены параметрам процедуры, другим переменным, а также могут быть указаны как параметры в операторах SQL, выполняемых в рамках процедуры.
Стремительное развитие информационного общества повлекло за собой.
Алгоритм
При объявлении переменной вы можете указать значение по умолчанию, используя предложение DEFAULT. Строка показывает объявление переменной типа Boolean со значением по умолчанию FALSE. Оператор SET может использоваться для назначения одного значения переменной. Переменные также могут быть установлены путем выполнения инструкции SELECT или FETCH в сочетании с предложением INTO. Оператор VALUES INTO может использоваться для оценки функции или специального регистра и присваивать значение нескольким переменным.
Вы также можете присвоить результат оператора GET DIAGNOSTICS переменной. GET DIAGNOSTICS может использоваться для получения дескриптора количества затронутых строк (обновляется для оператора UPDATE, DELETE - для оператора DELETE) или статуса возврата только что выполненного SQL-оператора
Особенности
Строка DECLARE SQL демонстрирует, как часть логики может использоваться для определения значения, которое должно быть присвоено переменной. В этом случае, если строки были изменены как часть более раннего оператора DELETE, а выполнение GET DIAGNOSTICS привело к тому, что переменной v_rcount присвоено значение, большее нуля, переменной is_done присваивается значение TRUE.
Процедуры
Процедуры DECLARE SQL - это процедуры, полностью реализованные с использованием SQL, которые могут использоваться для инкапсуляции логики. Та же в свою очередь может быть вызвана как подпрограмма программирования.

В архитектуре базы данных существует много полезных приложений SQL-процедур. Они используются для создания простых сценариев для быстрого запроса на преобразование и обновление данных, генерации базовых отчетов, повышения производительности и модуляции приложений, а также для улучшения общего проектирования и обеспечения безопасности баз данных.
Существует множество функций процедур, которые делают их мощным инструментом обработки. Прежде чем принять решение о внедрении процедуры SQL, важно понять, какие аналоги находятся в контексте подпрограмм, как они реализованы и как их можно использовать.
Создание процедур
Внедрение SQL-процедур может играть важную роль в архитектуре базы данных, разработке приложений и производительности системы. Разработка требует четкого понимания требований, возможностей и использования функций, а также знания любых ограничений. Процедуры SQL создаются по инструкции CREATE PROCEDURE. Когда создается алгоритм, запросы в теле процедуры отделяются от процедурной логики. Чтобы максимизировать производительность, SQL-запросы статически компилируются в разделы в пакете
Переменные
Локальная переменная Transact-SQL - это объект, который может содержать одно значение данных определенного типа. Обычно используются переменные в партиях и сценариях:
- в качестве счетчика нужно либо подсчитать количество циклов, либо установить, сколько раз цикл выполняется;
- чтобы сохранить значение данных, которое должно быть проверено оператором управления потоком;
- чтобы сохранить значение данных, которое будет возвращено кодом возвращаемой функции.

Имена ряда функций Transact-SQL начинаются со знаков (@@). Хотя в более ранних версиях Microsoft SQL Server функции @@ называются глобальными переменными. @@ - это системные функции, и их использование подчиняется правилам синтаксиса для функций.
Объявление переменной
Оператор DECLARE определяет переменную Transact-SQL согласно следующему алгоритму:
- определение имени, которое должно иметь один символ @ в качестве первого символа;
- назначение заданного или определенного пользователем типа данных и длины;
- для числовых переменных также назначаются точность и масштаб.
- для переменных типа XML может быть назначена дополнительная сборка схемы.
- Установка значения в NULL. Например, оператор DECLARE в SQL-запросе создает локальную переменную с именем @mycounter с типом данных int.

Чтобы объявить несколько локальных переменных, используйте запятую после определения первой локальной переменной, а затем укажите следующее имя локальной сети и тип данных. Например, следующий оператор создает три локальные переменные с именем @LastName, @FirstName и @StateProvince и инициализирует каждый из NULL. Объем переменной - это диапазон операторов Transact-SQL, которые могут ссылаться на переменную. Объем переменной длится от той точки, которая объявляется до конца партии или хранимой процедуры, в которой она объявлена.

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

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

Стремительное развитие информационного общества повлекло за собой разработку различных технологий, предназначенных для решения определенных задач. Одной из приоритетных являлась необходимость проектирования новых способов хранения и обработки .

Coalesce sql: описание, особенности использования, примеры. В статье рассматриваются особенности применения выражения Coalesce при составлении sql - запросов, важные нюансы, а также примеры.

В статье описывается оператор Select в языке SQL. Будут представлены инструкции, как извлечь информацию из таблиц, как уточнить выбор, а также как автоматически исключить избыточные данные.
SQL — это полнофункциональный язык, который позволяет создавать БД, таблицы, вводить и корректировать данные, оформлять представления, индексы и отчеты . Если у вас есть несколько минут, просмотрите информацию про Tutorial SQL, которая даст начало перехода в SQL и разработку базы данных.

Работа с базами данных постоянно связана с получением результатов запросов. И в некоторых случаях эту информацию необходимо вывести на экран определённым образом или объединить с другими данными. Для решения этой проблемы существует функция SQL – CONCAT.

Статья о том, как создать таблицу SQL. Как работать с таблицей, как ее изменять и удалять. Описание основных команд и их синтаксиса.

Среди прочих параметров оператора SELECT в языке SQL параметр HAVING является крайне полезным. Это касается тех случаев, когда результирующую выборку нужно не просто сгруппировать, но и сделать это, соблюдая определенные условия.

Работа с базами данных непосредственно связана с изменением таблиц и содержащихся в них данных. Но перед началом проведения действий таблицы необходимо создать. Для автоматизации этого процесса существует специальная функция SQL - "CREATE TABLE".
