|
Программирование >> Программирование баз данных
USE AdventureWorks DECLARE ©Test money SET ©Test = (SELECT MAX (UnitPrice) FROM SalesOrderDetail) SELECT ©Test Безусловно, последняя синтаксическая конструкция является вполне допустимой, но в соответствии с общепринятым соглашением такой способ реализации кода никогда не применяется. И в этом случае автор не может сказать со всей уверенностью, почему так никто не делает, но подозревает, что причиной является желание обеспечить удобство чтения. Дело в том, что обычно принято рассматривать операторы SELECT как предназначенные для выборки данных из таблиц, а операторы SET - как средства простого присваивания значений переменным. Присваивание значений переменным с использованием оператора select Оператор SELECT обычно используется для присваивания значений переменным, если источником информации, которая должна быть сохранена в переменной, является запрос. Например, вместо запросов, подобных последнему из приведенных выше запросов, гораздо чаш;е применяются запросы с оператором SELECT: USE AdventureWorks DECLARE ©Test money SELECT ©Test = MAX (UnitPrice) FROM SalesOrderDetail SELECT ©Test Обратите внимание на то, что данный код немного понятнее (в частности, он более лаконичен, хотя и выполняет те же действия). Итак, кратко сформулируем обш;епринятое соглашение по использованию того и другого оператора. Оператор SET используется, если должна быть выполнена простая операция присваивания значения переменной, т.е. если присваиваемое значение уже задано явно в форме определенного значения или в виде какой-то другой переменной. Оператор SELECT применяется, если присваивание значения переменной должно быть основано на запросе. Автор готов принять упреки в том, что сам неоднократно нарушал это соглашение во многих примерах, приведенных в данной книге. Возможность использовать оператор SET для присваивания значений переменным впервые появгигась в версии 7.0, и я вынужден признать, что еще не смог полностью принять на вооружение этот способ присваивания, даже несмотря на то, что после появления указанной версии прошло больше семи лет. Тем не менее создается впечатление, что компания Microsoft и сообщество пользователей SQL Seruer стремятся распространить действие данного соглашения, поэтому настоятельно рекомендуют начинающему разработчику стартовать с правильной позиции и неуклонно придерживаться этого соглашения. Общие сведения о системных переменных В программном обеспечении СУБД SQL Server предусмотрено свыше тридцати системных переменных, не имеющих параметров. В табл. 10.1 приведено описание наиболее часто применяемых системных переменных. Таблица 10.1. Системные переменные, наиболее часто применяемые в СУБД SQL Server Системная переменная Назначение Примечание ©©error ©©fetch status ©©identity ©©rowcount Содержит номер ошибки, возникшей при выполнении последнего оператора T-SQL в текущем соединении. Если ошибка не обнаружена, содержит о Эта системная переменная используется с оператором fetch Содержит последнее идентификационное значение, вставленное в базу данных в результате выполнения последнего оператора insert или select into Одна из наиболее широко используемых системных переменных. Возвращает информацию о количестве строк, затронутых последним оператором Значение этой системной переменной переустанавливается после выполнения каждого очередного оператора. Если требуется сохранить содержащееся в ней значение, то это значение следует переносить в локальную переменную сразу же после выполнения оператора, для которого должен быть сохранен код ошибки Принимает значение о, если операция выборки строки оказалась допустимой, значение -1, если произошел выход за пределы результирующего набора курсора, и -2, если требуемая строка отсутствует (допустим, в связи с тем, что она удалена). Типичный вариант неправильной организации работы может быть обусловлен тем, что предполагается, будто любое ненулевое значение свидетельствует о выходе за пределы результирующего набора курсора, тогда как фактически значение -2 может указывать на отсутствие отдельной строки. Данная тема подробно рассматривается в главе 15 Если в последнем операторе insert или select into не произошлз выработка идентификационного значения, то системная переменная ©©identity содержит null. Это утверждение остается справедливым, даже если отсутствие идентификационного значения было вызвано аварийным завершением при выполнении оператора. А если с помощью одного оператора осуществляется несколько операций вставки, то этой системной переменной присваивается только последнее идентификационное значение Обычно используется при проверке на наличие ошибок по завершении выполнения программного кода. Например, если обнаруживается, что после вызова на выполнение оператора delete с конструкцией vraERE количество затронутых строк равно нулю, можно сделать вывод, что произошло нечто непредвиденное. После этого сообщение об ошибке может быть активизировано вручную Окончанш табл. 10.1 Системная переменная Назначение Примечание @@servername @@trancount Системная переменная ©©servername ПреДОС- тавляет информацию об имени локального сервера, с которого был запущен сценарий Системная переменная ©©trancount предоставляет информацию о количестве активизированных транзакций для текущего соединения (которое по существу характеризует уровень вложенности транзакций) Значение этой системной переменной можно изменить путем вызова на выполнение хранимой процедуры sp addserver и последующего перезапуска СУБД SQL Server, но такая необходимость возникает редко Если не используются точки сохранения, то в результате выполнения оператора rollback tran значение ©©trancount уменьшается до нуля. В результате выполнения оператора begin tran значение ©©trancount увеличивается на 1, а в результате выполнения оператора commit tran значение ©©trancount уменьшается на 1 Не стоит беспокоиться, если описание некоторых системных переменных, приведенное в табл. 10.1, остается пока непонятным. В этой и следующих главах даны все необходимые пояснения, поэтому в дальнейшем вы сможете использовать эту таблицу в основном для получения справочной информации. А на данный момент достаточно отметить, что системные переменные предоставляют огромный объем информации о текущем состоянии системы и выполняемых в ней действиях. Использование системной переменной ©©identity Системная переменная @@IDENTITY относится к числу наиболее важных из всех системных переменных. Напомним, что идентификационные значения, для определения которых предназначена эта переменная, подробно рассматривались в главе 4. Пользователь не должен задавать значение для столбца идентификации, поскольку необходимое числовое значение вставляется в СУБД SQL Server автоматически. В примере, приведенном выше, было показано, что получение значения @@IDENTITY осуществляется непосредственно после вставки строки в родительскую таблицу (в этом случае Orders). Дело в том, что при выполнении операции вставки мы не задаем значение ключа для таблицы; это значение формируется автоматически при выполнении операции вставки. А после вставки строки в таблицу Orders необходимо вставить строки в таблицу Details, но для этого требуется получить информацию о том, какое значение имел первичный ключ в родительской строке таблицы Orders (при такой организации взаимодействия таблиц можно не сомневаться в том, что на дочерней таблице задано ограничение внешнего ключа, которое ссылается на родительскую таблицу). Это значение ключа вырабатывает СУБД SQL Server, а не предоставляет пользователь, поэтому должен быть предусмотрен способ выборки данного значения для использования во время вставки в зависимые таблицы в ходе дальнейшего вьшолнения сценария. Такое автоматически формируемое значение ключа можно получить с помощью системной переменной @@IDENTITY, поскольку она возвращает идентификационное значение, сформированное в результате вьшолнения предьщущего оператора.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |