Программирование в Microsoft SQL Server 2000
С чего начать изучение
Microsoft SQL Server 2000 – это система управления реляционными базами данных (RDBMS) в топологии клиент/сервер, разработанная для обработки высокопроизводительных сетевых транзакций (OLTP), хранения данных и использования в приложениях электронной коммерции. Курс "Программирование в Microsoft SQL Server 2000 Шаг за шагом" поможет вам быстро освоить принципы создания и манипулирования базами данных с использованием интерактивных средств, входящих в состав SQL Server 2000 версий Personal, Standard и Enterprise.
Внимание! Этот курс предназначен для использования с SQL Server 2000, однако сама система не поставляется вместе с курсом. Прежде, чем приступить к выполнению уроков, вы должны приобрести и установить SQL Server 2000.
Этот курс предназначен как для читателей, вообще не знакомых с реляционными базами данных, так и для тех, которые имеют опыт работы с другими системами управления базами данных, такими как Microsoft Access, и хотели бы перейти к SQL Server 2000. Воспользуйтесь приведенной ниже таблицей, чтобы выбрать для себя план занятий.
| Не знакомы с системами реляционных баз данных | ||
| Ранее работали с другим продуктом управления базами данных | ||
| Переходите с более ранней версии Microsoft SQL Server | ||
| Используете эту курс как справочное пособие после того, как проработали все уроки |
Системные базы данных
Дерево консоли Console Tree в Enterprise Manager всегда содержит четыре базы данных, которые использует собственно SQL Server. Эти базы данных называются системными базами данных. Их роли в SQL Server описаны в Таблице 1-3.
Внимание! Поскольку целостность системы базы данных имеет важное значение для успешной работы SQL Server, вы должны всегда использовать инструменты администрирования, предоставляемые Enterprise Manager или программным интерфейсом (SQL-DMO) для изменения содержимого баз данных master или msdb.
Руководствуйтесь принципом: смотрите, но не трогайте!
| Master | База данных master записывает всю информацию, необходимую для управления системы SQL Server, включая учетную запись пользователя. База данных определена в пределах процессов системы и сервера. Таблицы, хранящиеся в базе данных master, называются системным каталогом. |
| Model | База данных model используется как шаблон при создании пользователем новой базы данных. По умолчанию, база данных model содержит таблицы, составляющие каталог базы данных, таблицы которые используются SQL Server для определения других объектов в пределах базы данных пользователя. |
| Msdb | База данных msdb используется SQL Server Agent для составления расписания сопровождения задач, таких как оповещения и задания, и регистрации событий. Оповещения являются определяемыми пользователем событиями SQL Server. Задания являются рядом действий, выполняемых SQL Server Agent. |
| Tempdb | Tempdb используется для временного сохранения данных. Ее содержимое автоматически очищается при выключении SQL Server. В действительности, все временные объекты, созданные пользователем, уничтожаются при выходе этого пользователя из системы. |
Совет. Любые объекты, добавленные вами в базу данных model, будут автоматически добавляться в любые создаваемые вами новые базы данных. Это может быть удобно, если вы, например, захотите, чтобы некоторые пользователи или конфигурационные опции базы данных появлялись во всех новых базах данных.
Помните, однако, что любые объекты, добавленные вами в базу данных model, будут автоматически добавляться только в новые базы данных, но не в уже существующие.
Управление SQL Server
Перед тем, как вы сможете использовать SQL Server Enterprise Manager для создания новой базы данных или доступа к данным из существующей базы, вы сначала должны идентифицировать экземпляр сервера в Enterprise Manager, убедиться, что сервер запущен, и соединиться с базой данных, с которой вы будете работать.
Режимы безопасности SQL Server
SQL Server поддерживает два различных режима аутентификации при входе в систему, которые гарантирует, что только авторизованные пользователи будут иметь доступ к соответствующим данным – Windows Authentication и SQL Server Authentication. Microsoft рекомендует модель Windows Authentication, которая "прозрачно" допускает пользователей Microsoft Windows 2000 и Microsoft Windows NT в систему, используя их пароли и имена пользователей в операционной системе. Если вы используете модель SQL Server Authentication, сервер сам управляет аутентификацией пользователей, и пользователи должны вводить имя и пароль при соединении с базой данных.
В этом курсе предполагается, что ваш сервер будет использовать рекомендованную конфигурацию: Windows Authentication. Если ваш сервер использует аутентификацию SQL Server Authentication, то всякий раз при регистрации сервера или соединении с базой данных вам надо будет вводить имя и пароль для доступа. В этом случае введите имя и пароль, предоставленные вашим администратором, и затем нажмите OK.
Мы подробно рассмотрим вопросы безопасности SQL Server 2000 в уроке 3.
Запуск и остановка сервера
Перед тем, как вы сможете соединиться с экземпляром SQL Server, должна быть запущена служба. Вы сможете узнать запущена служба или нет, взглянув на значок сервера в дереве консоли в Enterprise Manager. Каждый из значков его смысл приведены в Таблице 1-1.
![]() | Сервер запущен |
![]() | Сервер приостановлен |
![]() | Сервер остановлен |
Запустите сервер
Приостановите сервер
Остановите сервер
Внимание! Перед тем, как продолжить работу над уроком, убедитесь, что используемый вами сервер запущен.
Зарегистрируйте сервер
Примечание. Если имя сервера отображено в дереве консоли Console Tree, то это означает, что он уже зарегистрирован с помощью Enterprise Manager, и вам не надо выполнять следующие действия. Пропустите этот раздел и переходите к следующему "Запуск и остановка сервера".

увеличить изображение

Совет. Вы также можете выбрать New SQL Server Registration (Новая регистрация SQL Server) из контекстного меню, отображаемого после щелчка правой кнопкой мыши на сервере в дереве консоли Console Tree.



Если вы выбрали аутентификацию SQL Server Authentication, то вам нужно будет ввести ваш идентификатор учетной записи и пароль. Введите эту информацию и нажмите Next (Далее).
Мастер отобразит экран, спрашивающий вас о том, какую вы выберите группу, в которую новый сервер должен быть добавлен.



Мастер Register SQL Server Wizard будет закрыт, а в дереве консоли Console Tree появиться новый сервер.
Совет. Вам нужно зарегистрировать экземпляр SQL Server только один раз. Enterprise Manager запоминает зарегистрированные серверы при следующем запуске программы.
Использование мастера Database Maintenance Plan Wizard
Вы узнали, как делать резервные копии базы данных и как восстанавливать ее. Но резервные копии нужно создавать регулярно и возможно, что вы забудете это сделать. SQL Server предоставляет механизм для автоматического создания резервных копий по составленному расписанию. Для этого есть несколько способов, самый простой – это с помощью мастера планирования сопровождения базы данных Database Maintenance Plan Wizard.
Мастер Database Maintenance Plan Wizard позволяет создавать расписание для задач по сопровождению, которые должны регулярно выполняться. Наиболее важной из таких задач является обновление статистики базы данных.
SQL Server содержит информацию о статистическом распределении данных в виде таблиц. Эту информацию SQL Server использует для определения наиболее эффективных методов восстановления данных. Тем не менее, через некоторое время эти данные устаревают по мере того, как добавляются новые или стираются старые. SQL Server автоматически обновляет статистическую информацию, но вы можете настроить его с помощью мастера Database Maintenance Plan Wizard на обновление информации в определенное время. Также вы можете использовать мастер Database Maintenance Plan Wizard для составления расписания выполнения SQL Server регулярных проверок целостности. Это нижнеуровневая проверка физической целостности таблиц пользователя и системных таблиц. Наконец вы можете использовать мастер Database Maintenance Plan Wizard для настройки режима переноса журнала. Этот метод автоматически обслуживает резервную копию сервера с помощью постоянного копирования журналов транзакций сервера.
Один план сопровождения базы данных может выполнять эти задачи в различных комбинациях. Вы также можете использовать SQL Server для создания отчета с результатами выполненных им задач. Этот отчет может быть сохранен в специальной директории как текстовый файл или как документ HTML, или он может быть отправлен по почте оператору. В приведенном ниже упражнении мы просто установим режим регулярного резервного копирования.
Создайте план сопровождения для создания резервных копий каждый месяц

увеличить изображение
на панели инструментов Enterprise Manager. SQL Server отобразит диалоговое окно Select Wizard.









Совет. Если вы использовали мастер Database Maintenance Plan Wizard для составления расписания других работ и не выбрали опцию создания резервной копии, то эта страница не появится.
.Мастер отобразит диалоговое окно File Backup Directory (Директория для файла резервной копии).

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



Примечание. Обычно для реализации плана сопровождения следует нажать Finish (Готово), но сейчас при работе с учебной базой данных нам этого не потребуется.
Совет. План сопровождения будет присутствовать в дереве консоли Console Tree в папке Management. Вы можете просмотреть его и изменить, нажав на нем два раза в панели деталей Details Pane.
Создание резервной копии базы данных
SQL Server 2000 предоставляет несколько различных способов создания резервной копии базы данных. Простейшим из этих способов является создание полной резервной копии (full backup) – точная копия базы данных на какой-либо момент времени.
Совет. SQL Server допускает создание резервной копии базы данных во время ее использования, так что вам не потребуется останавливать систему для этого. Тем не менее, некоторые типы операций не могут быть выполнены во время создания резервной копии. Это операции по изменению структуры базы данных – такие, как создание и удаление файлов или создание индексов, и выполнение нерегистрируемых операций.
Второй тип создания резервной копии, предоставляемый SQL Server, называется дифференциальным резервированием (differential backup). При дифференциальном резервировании записывает только та информация, которая была изменена после полного последнего резервирования. Преимуществом дифференциального резервирования является то, что для выполнения этого процесса требуется намного меньше места, и при этом достигается большая скорость выполнения операции.
Совет. Дифференциальное резервирование имеет смысл применять, только если был изменен небольшой процент данных. Например, вы можете делать дифференциальное резервирование каждый день, в то время как полное – один раз в неделю.
Третий тип создания резервной копии, предоставляемый SQL Server, называется резервированием журнала транзакций (transaction log backup). В журнал транзакций записываются все транзакции, выполненные после последнего резервного копирования журнала транзакций.
Совет. Резервирование журнала транзакций дает возможность восстанавливать состояние базы данных на определенный момент времени. Это может быть полезно, например, если ошибка оператора привела к вводу некорректной информации в базу данных. Вы можете использовать резервную копию журнала транзакций для восстановления состояния базы данных, которое она имела до ввода ошибочной информации.
SQL Server использует резервирование журнала транзакций для восстановления базы данных автоматически, если происходит сбой сервера, и его также можно использовать в сочетании с полным резервированием и дифференциальным резервированием для восстановления системы. Преимуществом резервирования журнала транзакций является то, что в большинстве случаев получившийся резервный файл будет меньше, чем аналогичный при полном резервировании и дифференциальном резервировании.
Совет. В некоторых случаях, резервная копия журнала транзакций может быть больше, чем резервная копия всей базы данных. Это возможно, если небольшая группа записей изменялась регулярно. В этом случае вы можете сделать полное резервирование или создавать резервную копию журнала транзакций чаще.
Создайте резервную копию базы данных с помощью мастера Create Database Backup Wizard
Внимание! Если вы еще не установили учебную базу данных Aromatherapy, то обратитесь к Введению, прежде чем продолжить изучение урока.
В дереве консоли Console Tree выберите базу данных Aromatherapy.
SQL Server отобразит список объектов базы данных в панели деталей Details Pane.

увеличить изображение
в панели инструментов Enterprise Manager. SQL Server отобразит диалоговое окно Select Wizard (Выбор мастера).




Совет. SQL Server организовывает носители резервных копий в виде набора носителей. Набор носителей может быть либо одним дисковым файлом, либо множеством из 20 или более кассетных накопителей.


Совет. Вы также можете сделать резервную копию базы данных, выбрав в контекстном меню базы данных пункт Backup Database (Резервирование базы данных). Эта опция отображает одиночное диалоговое окно быстрее, чем при использовании мастера Create Database Backup Wizard, а все опции при этом будут такими же.
Пользователи базы данных
Когда вы создаете новую учетную запись, с помощью Create Login Wizard и назначаете ей доступ в базу данных, учетная запись будет автоматически добавлена в список пользователей этой базы данных. Однако, может случиться, что вы создали новую базу данных и захотели добавить в нее существующую учетную запись в виде пользователя.
Создайте пользователя базы данных

увеличить изображение
в панели инструментов Enterprise Manager.
Совет. Вы можете также открыть диалоговое окно Database User Properties (Свойства пользователя базы данных), нажав два раза на значке Users в дереве консоли Console Tree и выбрав из контекстного меню New Database User (Новый пользователь базы данных).

Совет. Роли, которые назначаются пользователю базы данных, определяют, какие привилегии безопасности этот пользователь будет иметь для базы данных. За дополнительной информацией по этому вопросу, обратитесь к разделу "Роли базы данных".
Удалите пользователя базы данных

увеличить изображение

Роли базы данных
Роль базы данных – является виртуальным пользователем, которого вы создали для управления доступом в базу данных. Роли может быть назначено любое число пользователей базы данных, а определенному пользователю может соответствовать множество ролей. Когда вы устанавливаете привилегии для роли базы данных, а затем назначаете пользователя этой роли, то при этом пользователь получает все привилегии указанной роли. Это намного проще, чем обслуживать привилегии отдельного пользователя. В таблице 3-2 представлены роли, которые доступны в SQL Server 2000. Вы также можете создавать свои роли, которые будут уникальными для вашей базы данных.
Совет. Роли базы данных, которые вы создадите в базе данных master, будут добавляться в любую новую базу данных, которую вы создадите для этого сервера.
| Access Administrator (Администратор доступа) | db_accessadmin | Может удалять или добавлять ID-идетификаторы пользователя. |
| Backup Operator (Оператор резервного копирования) | db_backupoperator | Может выдавать операторы DBCC, CHECKPOINT, BACKUP. |
| Data Reader (Чтение данных) | db_datareader | Может выбирать все данные из любой таблицы пользователя в базе данных. |
| Data Writer (Запись данных) | db_datawriter | Может модифицировать данные из любой таблицы пользователя в базе данных. |
| Data Definition Administrator (Администратор описания данных) | db_ddladmin | Может выполнять операторы языка описания данных Data Definition Language (DLL), но не может выдавать операторы GRANT, REVOKE, DENY. |
| Deny Data Reader (Запрет чтения данных) | db_denydatareader | Может запрещать или отменять полномочия SELECT для любых объектов базы данных. |
| Deny Data Writer(Запрет записи данных) | db_denydatawriter | Может запрещать или отменять полномочия INSERT, UPDATE и DELETE для любых объектов базы данных. |
| Database Owner (Владелец базы данных) | db_owner | Имеет все полномочия в базе данных. |
| Security Administrator (Администратор безопасности) | db_securityadmin | Может управлять всеми полномочиями, объектами, ролями и элементами ролей пользователей. |
| Public (Общая) | Роль по умолчанию, к которой принадлежат все пользователи базы данных. |
Создайте роль базы данных

увеличить изображение
в панели инструментов Enterprise Manager. SQL Server отобразит диалоговое окно Database Role Properties (Свойства роли базы данных).


Примечание. Вы должны закрыть и снова открыть диалоговое окно Database Role Properties (Свойства роли базы данных), чтобы иметь возможность воспользоваться кнопкой Permissions (Разрешения).

Совет. Диалоговое окно Database Role Properties (Свойства роли базы данных) поддерживает два типа ролей: стандартные роли (standard roles) и роли приложения (application roles). Роли, рассматриваемые в этом уроке, являются стандартными ролями. Роль приложения является специальной функцией, поддерживающей требования сложных приложений. За дополнительной информацией о ролях приложений обратитесь к разделу "Установка режима безопасности для приложений и ролей приложений" в SQL Server Books Online (онлайновая книга по SQL Server 2000).



Удалите пользователя из роли базы данных

увеличить изображение


Удалите роль базы данных

увеличить изображение

Роли сервера
Роли сервера, к которым назначаются учетные записи, определяют, какие привилегии безопасности будет иметь учетная запись. В таблице 3-1 описываются привилегии для каждой роли.
| Bulk Insert Administrators (Администраторы сплошной вставки данных) | bulkadmin | Может выполнять операции вставки типа "bulk insert". |
| Database Creators (Создатели баз данных) | dbcreator | Может создавать, изменять или прекращать работу баз данных. |
| Disk Administrators (Администраторы диска) | diskadmin | Может управлять файлами диска. |
| Process Administrators (Администраторы процесса) | processadmin | Может управлять процессами, запущенными в SQL Server. |
| Security Administrators (Администраторы безопасности) | securityadmin | Может управлять учетными записями и разрешениями CREATE DATABASE, а также читать журнал ошибок. |
| Server Administrators (Администраторы сервера) | serveradmin | Может управлять конфигурированием всего сервера и выключать его. |
| Setup Administrators (Администраторы настройки) | setupadmin | Может управлять связанными серверами, процедурами, автоматически выполняющимися при запуске, и хранимыми процедурами. |
| System Administrators (Системные администраторы) | sysadmin | Может выполнять любые действия в SQL Server. |


Примечание. Учетные записи, принадлежащие определенным ролям сервера (в частности роли System Administrators) будут иметь привилегии для доступа ко всем базам данных, независимо от того, были ли они назначены этой учетной записи или нет.





Совет. Опция Deny Access To Server (Запретить доступ к серверу) на этой странице может быть использована только для запрещения доступа для индивидуального пользователя или группы.





Примечание. Учетные записи, принадлежащие определенным ролям сервера (в частности роли System Administrators) будут иметь привилегии для доступа ко всем базам данных, независимо от того, были ли они назначены этой учетной записи или нет.

Создание учетной записи пользователя
Учетные записи могут быть созданы вручную с помощью нажатия на значке Logins в папке Security сервера и выбором в контекстном меню New Login (Создать учетную запись). Однако проще будет сделать это с использованием мастера создания учетной записи Create Login Wizard.
Создайте учетную запись SQL Server

увеличить изображение
в панели инструментов Enterprise Manager. SQL Server отобразит диалоговое окно Select Wizard (Выбор мастера).



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

увеличить изображение





Удалите учетную запись

увеличить изображение

Создание новой базы данных
Хотя можно создать новую базу данных с помощью команды New Database (Новая база данных) из контекстного меню папки Databases (Базы данных), проще это сделать, воспользовавшись мастером создания базы данных Create Database Wizard.
Создайте новую базу данных

увеличить изображение
в панели инструментов Enterprise Manager. SQL server отобразит диалоговое окно Select Wizard (Выбор мастера).


, чтобы изменить место размещения файла базы данных. Мастер отобразит диалоговое окно, запрашивающее новое местонахождение.
Размещение файла базы данных
При первой установке SQL Server для новых баз данных по умолчанию принимается место размещения MSSQL\data в папке, в которой установлен сервер. Эта настройка по умолчанию предоставляется мастеру создания базы данных Create Database Wizard. Чтобы изменить эту используемую по умолчанию установку, вы можете задать новое место размещения на вкладке Database Settings (Параметры базы данных) в диалоговом окне SQL Server Properties (Свойства SQL Server). Для этого следует щелкнуть правой кнопкой мыши на сервере в дереве консоли Console Tree, выбрать Properties (Свойства), а затем открыть вкладку Database Settings (Параметры базы данных).








Установка свойств базы данных
Когда вы создаете базу данных с помощью мастера Create Database Wizard, вы указываете определенные характеристики, или свойства, базы данных, такие как имя базы данных и место размещения. После создания базы данных вы можете поменять эти свойства, изменив соответствующие параметры в диалоговом окне Properties (Свойства).
Например, увеличение размера физического файла – это довольно серьезная операция, выполнение которой может привести к увеличению времени отклика сервера. Если вы обнаружите, что SQL Server приходится слишком часто увеличивать размер файла. Вам следует учитывать возможность изменения процента увеличения размера файла в диалоговом окне Properties (Свойства), чтобы сервер смог увеличивать размер файла более, чем на 10% (установка по умолчанию).
Как изменить процент увеличения размера файла
в панели инструментов. SQL Server отобразит диалоговое окно Properties (Свойства) для базы данных.


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



Описание столбца
Новая функциональная возможность Enterprise Manager – добавление описания к столбцу, относится к расширенным свойствам в SQL Server 2000. Ряд расширенных свойств, таких как описание столбца, были созданы Microsoft как составная часть стандартной установки сервера, и вы можете создавать дополнительные расширенные свойства для хранения специфичной для приложения или для сайта информации об объектах базы данных.
Каждое расширенное свойство обладает задаваемым пользователем именем и значением. Значение расширенного свойства имеет тип sql_variant и может содержать до 7500 байт данных. Вы можете определить несколько расширенных свойств для любого объекта с использованием хранимых процедур. Подробнее о хранимых процедурах вы узнаете в уроке 28.
Точность и масштаб
Точность (precision) числового значения представляет собой максимальное количество десятичных разрядов, которые представляют значение, как слева, так и справа от десятичной точки. Масштаб (scale) значения представляет собой количество знаков справа от десятичной точки. Например, значение 3647,311 имеет точность 7 (общее количество знаков) и масштаб 3 (количество знаков справа от десятичной точки).
Важно понимать, что точность и масштаб числового значения не влияют на длину столбца. Длина столбца определяется типом данных. Точность и масштаб определяют, как SQL Server будет интерпретировать данные, хранящиеся в столбце.


Нулевое значение (Null)
Значение Null представляет собой особый вид значений в реляционной технологии, которое используется для указания, что значение либо отсутствует, либо не существует. Использование значений типа Null в ряде случаев является сомнительным и спорным.

Идентификационные значения
Когда вы устанавливаете свойство идентификации Identity для столбца, вы тем самым предписываете SQL Server вставить в столбец значение, которое уникально идентифицирует каждую строку. Выбранный тип данных задает природу данных, содержащихся в столбце. Идентификационные столбцы могут иметь типы данных int, smallint, tinyint или decimal.
Когда SQL Server вставляет строку в таблицу, имеющую столбец идентификации, он автоматически генерирует значения для столбца на основе последнего использованного значения (начиная с начального) и приращения идентификатора, заданного при создании таблицы.
Например, если для столбца идентификации задан тип smallint, начальное значение равно 50, а приращение равно 5, для первой вставленной строки будет присвоено значение 50, для второй строки – значение 55, для третьей строки – значение 60 и т.д.
Свойство Identity может быть установлено только для одного столбца в таблице.
Добавьте в таблицу столбец GUID



GUID
Глобальный уникальный идентификатор (Globally Unique Identifier – GUID) представляет собой 16-байтное уникальное значение – ни один другой в мире компьютер не будет генерировать это значение. Тип данных uniqueidentifier используется для хранения GUID-идентификаторов.
SQL Server не генерирует GUID-идентификаторы автоматически, как он это делает для идентификационных значений, поскольку таблица может содержать несколько GUID-идентификаторов, но только одно идентификационное значение. Тем не менее, функция NEWID, которую SQL Server предлагает как значение по умолчанию, если для свойства Is RowGUID установлено значение Yes (Да), будет возвращать новый GUID-идентификатор при вставке строки.
Добавьте в таблицу столбец даты



Добавьте в таблицу символьный столбец

Символьные типы данных
SQL Server поддерживает два различных вида символьных столбцов: с фиксированной длиной и с переменной длиной, каждый из которых может содержать данные либо в формате Unicode, либо не в формате Unicode, а также иметь три различные длины. Unicode представляет собой метод кодирования символов, поддерживающий двухбайтное выражение символов.
Если для столбца объявлена переменная длина (например, тип varchar или text для данных не-Unicode, и nvarchar или ntext для данных Unicode), то SQL Server будет хранить только фактические символы данных, которые были введены. Если, с другой стороны, для столбца объявлена фиксированная длина (тип char для данных не-Unicode или nchar для данных Unicode). SQL Server будет дополнять введенные значения пробелами.
Например, если для столбца объявлен тип char с длиной, равной 10, а фактическим значением является "hello", SQL Server будет хранить значение как "hello", с пятью пробелами, следующими за пятью фактическими символами.

Значения по умолчанию
Значение по умолчанию представляет собой значение, которое будет помещаться в столбец, если пользователь явно не задал значение.
Мы уже сталкивались с двумя специальными видами значений по умолчанию: идентификационное значение, предоставляемое SQL Server, когда вы устанавливаете свойство Identity, а также функция NEWID, предоставляемая SQL Server, когда вы устанавливаете свойство Is RowGuid. В действительности вы можете задавать значения по умолчанию для любого столбца. Значения по умолчанию могут быть константами, такими как 'Unknown' или 123, функциями, такими как NEWID или GETDATE, либо математическими выражениями, такими как 3 + 5.
Сохраните и закройте таблицу
на панели инструментов конструктора таблиц Table Designer. SQL Server сохранит определение таблицы.Изменение столбцов
Вы можете повторно открыть конструктор таблиц Table Designer для таблицы, щелкнув правой кнопкой мыши на имени таблицы в рабочей панели Details Pane и выбрав Design Table (Конструирование таблицы) из контекстного меню. После того, как конструктор таблиц будет открыт, вы можете изменить свойства имеющихся столбцов, удалять их или добавлять новые.
Переименуйте столбец

увеличить изображение


Удалите столбец


Изменение таблиц
Помимо изменения определений столбцов таблицы Enterprise Manager облегчает переименование таблиц и удаление таблиц из базы данных.
Переименуйте таблицу

увеличить изображение



Удалите таблицу

Совет. Вы можете щелкнуть на кнопке Show Dependencies (Показать зависимости), чтобы увидеть все объекты, на которые повлияет удаление таблицы.
Примечание. Когда вы удаляете таблицу, таблица и все ее данные окончательно убираются из базы данных. Единственный способ восстановить ее – это воспользоваться резервной копией.
Создание новой таблицы
Таблицы создаются и обслуживаются с помощью конструктора таблиц Table Designer Enterprise Manager. Первым шагом является создание и присвоение имени таблицы путем открытия конструктора таблиц Table Designer для новой таблицы.
Создайте новую таблицу

увеличить изображение
в панели инструментов. SQL Server откроет конструктор таблиц Table Designer.
в панели инструментов. SQL Server откроет диалоговое окно Properties (Свойства) для таблицы.

Изменение индексов
Точно так же, как вы изменяете свойства столбца, открыв конструктор таблиц Table Designer и отобразив диалоговое окно Properties (Свойства) для таблицы, вы можете изменять и свойства индекса.
Переименуйте индекс

SQL Server откроет диалоговое окно Properties (Свойства) с отображением страницы свойств Indexes/Keys (Индексы/Ключи).


Создание индексов
В Enterprise Manager индексы могут быть созданы с помощью мастера Create Index Wizard или с использованием конструктора таблиц Table Designer либо путем установки свойства Primary Key, либо путем определения индекса в диалоговом окне Properties (Свойства).
Создайте индекс с использованием мастера Create Index Wizard

увеличить изображение
в панели инструментов Enterprise Manager. SQL Server отобразит диалоговое окно Select Wizard (Выбор мастера).











увеличить изображение


в панели инструментов конструктора таблиц. SQL Server установит выделенный столбец в качестве первичного ключа.
чтобы сохранить изменения и закрыть окно.Создайте простой индекс

SQL Server откроет диалоговое окно Properties (Свойства) для таблицы, в которой будет отображена страница свойств Indexes/Keys (Индексы/Ключи).
Совет. Вы также можете открыть диалоговое окно Properties (Свойства) для таблицы, щелкнув на кнопке Properties (Свойства),
а затем открыв вкладку Indexes/Keys (Индексы/Ключи).




Уникальные индексы
Применение уникального индекса обеспечивает, что никакие две строки в таблице не могут содержать дублирующихся данных для столбца или столбцов, заданных в индексе. Индексы первичного ключа всегда являются уникальными, но при желании вы можете добавлять дополнительные уникальные индексы.
Следует проявлять осторожность при создании уникальных индексов для столбцов, которые допускают использование нулевых значений (NULL). SQL Server разрешит использование только одной строки со значением NULL; все последующие строки будут отвергнуты как строки-дубликаты.
Создайте составной индекс

SQL Server откроет диалоговое окно Properties (Свойства) с отображением страницы свойств Indexes/Keys (Индексы/Ключи).


Удаление индексов
Иногда необходимо удалить индекс из таблицы, поскольку он вам либо уже не нужен, либо преимущества, которые обеспечивает применение индекса для ускорения извлечения данных, сводятся на нет дополнительными затратами времени, необходимыми для обслуживания индекса при обновлении основных данных. Подобно всем другим задачам по обслуживанию индексов, удаление индекса осуществляется через вкладку Indexes/Keys (Индексы/Ключи) диалогового окна Properties (Свойства) конструктора таблиц Table Designer.
Удалите индекс

SQL Server откроет диалоговое окно Properties (Свойства) для таблицы с отображением страницы свойств Indexes/Keys (Индексы/Ключи).

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

в панели инструментов конструктора таблиц. SQL Server откроет диалоговое окно Properties (Свойства) конструктора таблиц с отображением страницы свойств Relationships (Отношения).


Обслуживание отношений
Как вы можете предположить, отношения обслуживаются с использованием того же диалогового окна Properties (Свойства), с помощью которого они были созданы.
Переименуйте отношение

SQL Server откроет диалоговое окно Properties (Свойства) конструктора таблиц с отображением страницы свойств Relationships (Отношения).



Создание отношений
В SQL Server отношения создаются с помощью вкладки Relationships (Отношения) диалогового окна Properties (Свойства) конструктора таблиц Table Designer. Отношения один-к-одному и один-ко-многим создаются аналогичным образом. SQL Server определяет тип отношения на основе столбцов, содержащихся в зависимой таблице; если для столбцов внешнего ключа имеется уникальный индекс, отношение будет иметь тип один-к-одному; в противном случае оно будет иметь тип один-ко-многим.
Создайте отношение

в панели инструментов Table Designer. SQL Server откроет диалоговое окно Properties (Свойства) конструктора таблиц с отображением страницы свойств Relationships (Отношения).




Совет. Если вы хотите использовать для отношения каскадные изменения или удаления, установите соответствующие флажки на странице свойств.
в панели инструментов конструктора таблиц. SQL Server отобразит диалоговое окно, предлагающее подтвердить, что изменения, внесенные вами в две таблицы, следует сохранить в вашей базе данных.
Возвратные отношения
Большинство отношений в базе данных устанавливают между двумя различными таблицами. Однако бывает, когда таблица связывается сама с собой либо через отношение один-к-одному, либо через отношение один-ко-многим. Подобные отношения называются возвратными отношениями.
Возвратные отношения чаще всего применяются для реализации иерархий. Типичный пример – иерархия сотрудников в организации. Сотрудник может быть подчинен менеджеру, а менеджер, в свою очередь, может как сотрудник иметь вышестоящего менеджера. Это отношение оформляется путем включения первичного ключа таблицы сотрудников в качестве столбца таблицы и установки возвратного отношения один-ко-многим.

На уровне таблицы отношение оформляется путем включения уникального идентификатора, обычно первичного ключа, из таблицы на стороне одного (главную таблицу, или таблицу первичного ключа) в таблицу на стороне многих (зависимую таблицу, или таблицу внешнего ключа). Этот идентификатор называется внешним ключом.
Примечание. Уникальный идентификатор, который используется в качестве внешнего ключа, обычно является первичным ключом главной таблицы, однако он также может быть любым столбцом или группой столбцов, которые были объявлены уникальными.
SQL Server может контролировать отношения, которые вы установили в базе данных, осуществляя обслуживание целостности отношений. По умолчанию SQL Server будет отвергать любые изменения в первичном ключе строки из главной таблицы, которая имеет связанные строки в зависимой таблице.
Новинкой в Microsoft SQL Server 2000 является возможность каскадных изменений в главной таблице. Если вы укажете SQL Server осуществлять каскадные удаления для отношения, удаление строки в главной таблице заставит SQL Server удалить все связанные строки в зависимой таблице. Аналогично, если вы укажете SQL Server каскадировать обновления, изменение первичного ключа главной таблицы будет приводить к обновлению связанных столбцов в зависимой таблице.
Внимание! Некоторые схемы баз данных могут быть достаточно сложными. Использование каскадных удалений и изменений может облегчить сопровождение сложных структур данных, но SQL Server требует, чтобы каскадирование не было круговым. Например, удаление строки в таблице А может привести к удалению строки в таблице В, что, в свою очередь, вызовет удаление строки в таблице С. Однако не допускается устанавливать такой режим каскадирования, при котором удаление строки в таблице С приведет к удалению строки в таблице А.
Изменение проверочных ограничений
Конструктор таблиц Table Designer предоставляет механизм для корректировки текста проверочного ограничения через то же диалоговое окно Properties (Свойства), которое вы использовали при его создании.
Измените текст ограничения

SQL Server откроет диалоговое окно Properties (Свойства) конструктора таблиц с отображением страницы свойств Check Constraints (Проверочные ограничения).

Обслуживание проверочных ограничений
Как и другие свойства таблицы, проверочные ограничения обслуживаются через диалоговое окно Properties (Свойства) конструктора таблиц.
Переименуйте проверочное ограничение

SQL Server откроет диалоговое окно Properties (Свойства) конструктора таблиц с отображением страницы свойств Check Constraints (Проверочные ограничения).

Создание проверочных ограничений
Подобно индексам и отношениям, вы можете создавать проверочные ограничения с помощью диалогового окна Properties (Свойства) конструктора таблиц Table Designer.
Создайте проверочное ограничение

Microsoft SQL Server откроет диалоговое окно Properties (Свойства) конструктора таблиц, отобразив страницу свойств Check Constraints (Проверочные ограничения).


Совет. Если вы создаете новое проверочное ограничение и не хотите, чтобы оно применялось для уже существующих данных, вы можете указать SQL Server игнорировать существующие данные, сбросив флажок Check Existing Data On Creation (Проверять при создании существующие данные) для ограничения.
SQL Server проверит, отвечают ли все строки в таблице проверочному ограничению, а затем сохранит ограничение.Снимите действие умолчания
Снимите действие умолчания



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

увеличить изображение
. SQL Server отобразит диалоговое окно User-Defined Data Type Properties (Свойства пользовательских типов данных).



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

увеличить изображение
SQL Server откроет диалоговое окно Rule Properties (Свойства правила).


Совет. Помните, что LEN является функцией Transact-SQL, которая возвращает количество символов в текстовой строке, и что символ @ в начале оператора Transact-SQL указывает на переменную, которая будет передавать значение в операторе. Поэтому в этом случае правило возвратит TRUE только тогда, когда длина столбца больше, чем 3.
Создание умолчаний
Поскольку умолчания являются независимыми объектами в пределах базы данных, вы должны создать умолчание, прежде чем сможете связать его со столбцом таблицы.
Создайте умолчание

увеличить изображение
SQL Server отобразит диалоговое окно Default Properties (Свойства умолчаний).


Свяжите умолчание со столбцом
Свяжите умолчание со столбцом



SQL Server сохранит таблицу.Изменение схемы базы данных
Одним из наиболее полезных свойств в окне Database Diagram (Диаграмма базы данных) является возможность модифицировать схему базы данных непосредственно в диаграмме. Графическое представление является отличным средством для визуализации таблиц и отношений в вашей базе данных, а возможность непосредственно модифицировать схему позволяет легко вносить изменения.
Добавьте столбец в таблицу в окне диаграммы Database Diagram


Совет. Обратите внимание, что имя таблицы для таблицы Oils имеет в конце звездочку (*). SQL Server помечает подобным образом любую таблицу в окне Database Diagram (Диаграмма базы данных), которая была изменена, указывая тем самым, что изменения еще не сохранены.
Поскольку SQL Server не изменяет схему базы данных до тех пор, пока вы не сохраните диаграмму, вы можете воспользоваться окном Database Diagram (Диаграмма базы данных), чтобы опробовать изменения, прежде чем принять их. Если вы передумаете, вам будет достаточно просто закрыть окно без сохранения изменений, и ваша база данных останется такой же, какой и была.
чтобы SQL Server изменил размеры отображаемой таблицы.
Создание диаграммы базы данных из существующей схемы
Хотя возможно создать всю схему базы данных из окна Database Diagram (Диаграмма базы данных), чаще всего диаграммы создают из существующих таблиц. С помощью мастера создания диаграмм Create Database Diagram Wizard этот процесс можно упростить – достаточно выбрать таблицы, которые вы хотите включить в диаграмму, и мастер Create Database Diagram Wizard сделает все остальное.
После того, как вы создали диаграмму базы данных с помощью мастера Create Database Diagram Wizard, вы можете добавлять и удалять таблицы и изменять количество отображаемых элементов для каждой таблицы.
Создайте диаграмму базы данных

увеличить изображение
SQL Server отобразит первую страницу мастера создания диаграмм Create Database Diagram Wizard.





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

Измените степень детализации диаграммы базы данных

увеличить изображение
в панели инструментов окна Database Diagram (Диаграмма базы данных). SQL Server добавит тип данных, длину и возможность использования нулевых значений (NULL) к отображению таблицы Oils.
увеличить изображение
Совет. Вы можете изменить способ отображения для нескольких таблиц в диаграмме, выделив их (с помощью клавиши Ctrl) до нажатия кнопки Show (Вид) на панели инструментов.
в панели инструментов Database Diagram (Диаграмма базы данных). SQL Server реорганизует диаграмму базы данных, чтобы учесть дополнительное пространство, требующееся для таблицы Oils.
увеличить изображение
SQL Server сохранит новое размещение элементов диаграммы.Добавьте имеющуюся таблицу в диаграмму базы данных
в диаграмме базы данных. SQL Server отобразит диалоговое окно Add Table (Добавление таблицы).

увеличить изображение
в панели инструментов database Diagram. SQL Server сохранит диаграмму с новой таблицей.Удалите таблицу из диаграммы базы данных

увеличить изображение
SQL Server сохранит диаграмму.Создание объектов базы данных
Кроме изменения имеющихся объектов базы данных, окно Database Diagram (Диаграмма базы данных) позволяет добавлять новые таблицы и создавать отношения.
Создайте таблицу в окне диаграммы Database Diagram

Совет. Вы также можете создать новую таблицу, щелкнув на кнопке New Table (Новая таблица)
в панели инструментов Database Diagram (Диаграмма базы данных).
увеличить изображение
| OilID | Int | 4 | No |
| Picture | Image | 16 | No |

в панели инструментов окна Database Diagram (Диаграмма базы данных). SQL Server установит OilID в качестве первичного ключа таблицы.

SQL Server отобразит диалоговое окно, предлагающее вам подтвердить изменения в схеме базы данных.
Модификация строк в таблице
Конструктор запросов можно использовать также для изменения значений в имеющихся строках таблицы, либо для добавления новых строк.
Отредактируйте строку в конструкторе запросов Query Designer
к селектору строки, который указывает, что запись отредактирована, но изменения еще не сохранены.
увеличить изображение

увеличить изображение
Совет. Прежде чем переместиться к другой строке, вы можете нажать клавишу Esc, чтобы отменить ваши изменения.
Добавьте новую строку в конструкторе запросов Query Designer
].
и добавит новую строку в конце таблицы.
увеличить изображение

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

увеличить изображение

увеличить изображение
Ограничьте количество отображаемых строк



увеличить изображение
Использование фразы TOP n
Когда вы выбираете команду Return Top (Показать первые) из контекстного меню таблицы, SQL Server использует фразу TOP n, чтобы создать отображение в конструкторе запросов Query Designer. Помимо задания определенного количества строк, вы также можете отобразить часть строк в процентах от общего их количества, воспользовавшись фразой TOP n PERCENT, которая, как можно ожидать, возвращает указанный процент строк.
Отобразите первые 5 строк

увеличить изображение
в панели инструментов конструктора запросов, чтобы повторно исполнить запрос. SQL Server отобразит только первые пять строк.
увеличить изображение
Отобразите первые 5 процентов строк

увеличить изображение
в панели инструментов конструктора запросов, чтобы исполнить запрос. SQL Server отобразит только первые пять процентов строк.
увеличить изображение
Создайте вычисляемый столбец с использованием панели SQL Pane
Создайте вычисляемый столбец с использованием панели SQL Pane
и отобразите панель SQL Pane
, щелкнув на кнопках в панели инструментов конструктора запросов.
увеличить изображение

увеличить изображение
Совет. Не забудьте поставить запятую перед GETDATE!
в панели инструментов конструктора запросов, чтобы повторно исполнить запрос. SQL Server отобразит текущие данные в каждой из строк.
увеличить изображение
Создание псевдонимов столбцов
По умолчанию столбец в запросе носит то же имя, которое он имел в исходной таблице или строке. Однако полезно иметь возможность изменять имя, либо по причине слишком большой его длины ("MyLongColumnNameWithNoSpaces"), либо просто потому, что оно слишком непривычно для его отображения пользователю ("pk_varchar_50_col32713"). Оператор SELECT позволяет переименовывать столбцы в запросе путем создания псевдонимов. Псевдоним изменяет имя столбца в запросе, но не в таблице.
Создайте псевдоним столбца с использованием панели сетки Grid Pane
и отобразите панель Grid Pane
, щелкнув на кнопках в панели инструментов конструктора запросов.
увеличить изображение

увеличить изображение
Примечание. Квадратные скобки не будут отображаться в результате выполнения запроса. Они просто указывают SQL Server интерпретировать текст "Oil Name" как одно имя. Квадратные скобки обязательны только в том случае, если псевдоним содержит пробел, но они могут использоваться для любого имени столбца.
в панели инструментов конструктора запросов, чтобы повторно исполнить запрос. SQL Server отобразит имя в заголовке столбца с пробелом между словами.
увеличить изображение
Создайте псевдоним столбца с использованием панели SQL Pane
и отобразите панель SQL Pane
, щелкнув на кнопках в панели инструментов конструктора запросов Query Designer.
увеличить изображение

увеличить изображение
в панели инструментов конструктора запросов, чтобы исполнить запрос. Конструктор запросов отобразит имя в заголовке столбца с пробелом между двумя словами.
увеличить изображение
Создание вычисляемых столбцов
В дополнение к столбцам, которые просто отображают информацию из исходных таблиц и представлений, ваш запрос может также содержать столбцы, которые вычисляются на основе исходных данных, функций SQL Server или любой их комбинации. Вычисляемый столбец создается путем задания выражения в качестве столбца. Подробнее с выражениями Transact-SQL мы познакомимся в уроке 21, поэтому в этом упражнении мы лишь используем пару простых выражений на основе оператора + конкатенации строк, который складывает две строки, а также функции GETDATE, возвращающей текущие системные дату и время.
Создайте вычисляемый столбец с использованием панели сетки Grid Pane
и отобразите панель сетки Grid Pane,
щелкнув на кнопках в панели инструментов конструктора запросов.
увеличить изображение

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

увеличить изображение

увеличить изображение
, чтобы повторно исполнить запрос. Конструктор запросов отобразит новый столбец в панели результатов Results Pane.
увеличить изображение
Выборка подмножества столбцов
Хотя синтаксис SELECT * чрезвычайно прост в использовании, вам часто требуется, чтобы ваш запрос возвращал только избранные столбцы. Для этого следует указать столбцы в перечне список_столбцов оператора SELECT.
Выполните отбор столбцов с использованием панели SQL Pane

увеличить изображение
в панели инструментов конструктора запросов, чтобы исполнить запрос. Конструктор запросов отобразит только столбец OilName.
увеличить изображение
Выполните отбор столбцов с помощью панели диаграмм Diagram Pane
и отобразите панель диаграмм Diagram Pane
, щелкнув на кнопках в панели инструментов конструктора запросов.
увеличить изображение

увеличить изображение
, чтобы исполнить запрос. Конструктор запросов отобразит в панели результатов Results Pane как столбец OilName, так и столбец LatinName.
увеличить изображение
Выборка всех столбцов
Простейшим случаем использования оператора SELECT является выборка всех столбцов из одной таблицы. Как большинство версий языка SQL, Transact-SQL позволяет вам использовать знак звездочки (*), если вы хотите задать все столбцы, поэтому в этом простом случае оператор будет иметь следующую форму:
SELECT * FROM имя_таблицы
Выберите все столбцы

увеличить изображение
в панели инструментов конструктора запросов. Конструктор запросов отобразит панель SQL Pane.
увеличить изображение

увеличить изображение
в панели инструментов конструктора запросов, чтобы выполнить запрос. Конструктор запросов отобразит все записи из таблицы Oils.
увеличить изображение
Совет. Вы можете отобразить большее количество строк в панели результатов Results Pane, перетащив разделительную линию между двумя панелями.
Базовая фраза WHERE
Основу фразы WHERE составляет условие выбора, которое определяет, какие строки будут возвращены. Базовая структура фразы WHERE имеет форму WHERE <столбец> <оператор> < значение>. SQL Server предоставляет полный объем операторов сравнения, показанных в таблице 13-1.
| = | Равно |
| > | Больше чем |
| < | Меньше чем |
| >= | Больше или равно |
| <= | Меньше или равно |
| <> | Не равно |
При этом <значение>, указанное в условии WHERE, может быть константой, такой как "Red" или 10000, либо выражением, возвращающим значение, таким как GETDATE. Аналогично, значение <столбец> может быть получено с помощью функций Transact-SQL, такой как LEFT, которые возвращают указанное число символов, отсчитываемое от начала строки. Мы подробно рассмотрим функции в уроке 24, "Компоненты языка Transact-SQL".
Задайте условие WHERE с использованием панели сетки Grid Pane
и отобразите панель сетки Grid Pane
, щелкнув на кнопках в панели инструментов конструктора запросов.
увеличить изображение
в панели инструментов конструктора запросов, чтобы исполнить запрос. Конструктор запросов Query Designer отобразит только одну строку.
увеличить изображение
Использование специальных операторов
В дополнение к стандартному формату фразы WHERE <столбец> <оператор> <значение> SQL Server также поддерживает три специальных оператора: LIKE, который позволяет вам указывать значения с использованием символов замещения, представленных в таблице 13-2; BETWEEN, который позволяет вам задавать диапазон значений; и IN, который позволяет вам задавать множество, в котором содержатся значения.
| - | Любой одиночный символ | LIKE 'a_' Соответствует "at" и "as", но не "and" |
| % | Любая строка из нуля или более символов | LIKE '%t%' Соответствует "at", "bat" и "together", но не "lucky" |
| [] | Любой определенный символ внутри области или множества | LIKE '[a-c]at' Соответствует "cat" и "bat", но не "fat" LIKE '[ab]at' Соответствует "bat", но не "cat" |
| [^] | Любой определенный символ, не содержащийся в области или множестве | LIKE '[^c]at' Соответствует "bat" и "fat", но не "cat" |
Задайте условие WHERE с использованием оператора LIKE

увеличить изображение
в панели инструментов конструктора запросов, чтобы исполнить запрос. Конструктор запросов Query Designer отобразит все строки, начинающиеся с "Rose".
увеличить изображение
Задайте условие WHERE с использованием оператора BETWEEN

увеличить изображение
в панели инструментов конструктора запросов, чтобы исполнить запрос. Конструктор запросов Query Designer отобразит все строки, начинающиеся с A, B или C.
увеличить изображение
Примечание. Transact-SQL также поддерживает оператор NOT BETWEEN, который работает точно так же, но исключает диапазон значений. Например, LEFT(OilName,1) NOT BETWEEN 'C' AND 'E' будет возвращать все строки, кроме тех, для которых значение OilName начинается с C, D или E.
Отсортируйте строки с использованием панели SQL Pane
Отсортируйте строки с использованием панели SQL Pane
и отобразите панель SQL Pane
, щелкнув на кнопках в панели инструментов конструктора запросов.Отсортируйте строки с использованием панели SQL Pane
и отобразите панель SQL Pane
, щелкнув на кнопках в панели инструментов конструктора запросов.
увеличить изображение

увеличить изображение
в панели инструментов конструктора запросов, чтобы исполнить запрос. Конструктор запросов Query Designer отобразит результаты, отсортированные сначала по полю OdorID, а затем по полю OilID.
увеличить изображение
Сортировка по нескольким столбцам
Вы можете указывать в фразе ORDER BY несколько столбцов. Если указано несколько столбцов, порядок их следования определяет результат – SQL Server будет сортировать строки по первому столбцу, затем по второму столбцу и т.д.
Совет. Упражнения в этом разделе используют таблицу OilOdors, которая действует как узловая таблица, устанавливающая отношение много-ко-многим между таблицами Oils и Odors. Обычно вам следует использовать внешние ключи, содержащиеся в этой таблице, с помощью связывания. Как это делается, мы рассмотрим в следующем уроке, "Связывание таблиц".
Отсортируйте строки с использованием панели сетки Grid Pane
в панели инструментов конструктора запросов.
увеличить изображение

увеличить изображение
в панели инструментов конструктора запросов, чтобы исполнить запрос. Конструктор запросов Query Designer отобразит только два указанных вами столбца.
увеличить изображение

увеличить изображение
в панели инструментов конструктора запросов, чтобы исполнить запрос. Конструктор запросов Query Designer отобразит строки, отсортированные сначала по полю OilID, а затем по полю OdorID в соответствии со значениями номеров OilID.
увеличить изображение
Сортировка строк
Простейшая форма фразы ORDER BY предоставляет имя одного столбца, который будет использоваться для сортировки строк, возвращенных запросом.
Отсортируйте строки с использованием панели сетки Grid Pane.
, щелкнув на кнопке Grid Pane (Панель сетки) в панели инструментов конструктора запросов.
увеличить изображение

увеличить изображение
в панели инструментов конструктора запросов, чтобы исполнить запрос. Конструктор запросов отобразит только заданные столбцы.
увеличить изображение

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

увеличить изображение
в панели инструментов конструктора запросов, чтобы исполнить запрос. Конструктор запросов Query Designer отобразит названия ароматических масел, начинающихся с "R".
увеличить изображение
Использование фразы FROM
Базовая структура фразы FROM содержит имя одной таблицы или представления. Однако чтобы воспользоваться всей мощью реляционной модели, нужно иметь возможность извлекать столбцы из нескольких таблиц и представлений в одном запросе. Фраза FROM предоставляет механизм для осуществления этой операции с использованием следующего синтаксиса:
FROM <таблица_или_предствление> <оператор_связывания> <таблица_или_предствление> ON <условие_связывания>
Оператор связывания описывает тип выполняемого связывания. Microsoft SQL Server поддерживает внутреннее и внешнее связывание во всех их вариациях (см. урок 15).
Условие связывания представляет собой выражение, аналогичное условию отбора, используемого в фразе WHERE. Оно задает, как будут соответствовать строки в двух таблицах. Большинство операций связывания выполняются на основе выражений эквивалентности, таких как Column A = Column B. Однако SQL Server поддерживает любые логические операторы, а условие связывания может быть сколь угодно сложным, состоящим из нескольких выражений, соединенных с помощью логических операторов AND или OR. таким же образом, как во фразе WHERE с несколькими условиями отбора.
Выражение связывания может быть повторено для добавления дополнительных таблиц и представлений в запрос. Синтаксис для связывания нескольких таблиц следующий:
FROM <таблица_или_вид> <оператор_связывания> <таблица_или_вид> ON <условие_связывания> <оператор_связывания> <таблица_или_вид> ON <условие_связывания> . . .
Имеется теоретическое ограничение в 256 таблиц на запрос, однако весьма маловероятно, что вам когда-либо понадобится более пяти или шести таблиц, а обычно используется два или три. На деле, если вы обнаружите, что вам требуется связать более десяти таблиц в одном запросе, внимательно изучите схему вашей базы данных, чтобы убедиться, что она корректно нормализована.
Объединения
Последним типом связывания является объединения. Объединения помещают результаты выполнения двух различных операторов SELECT в один набор строк. При внутреннем и внешнем связывании столбцы из двух таблиц размещаются построчно. Объединение размещает строки из двух таблиц в одном столбце, как если бы вы взяли два набора строк и получили единое их множество, в котором один набор располагается под другим. Фактический порядок строк в полученном результате определяется фразой ORDER BY.
Синтаксис объединения отличается от синтаксиса связывания. Он имеет следующий вид:
SELECT <список_столбцов> FROM <имя_таблицы> UNION [ALL] SELECT <список_столбцов> FROM <имя_таблицы> [ORDER BY <список_столбцов>]
Вы можете добавить в запрос столько операторов UNION SELECT, сколько захотите (с учетом ограничения в 256 таблиц), но все операторы SELECT должны возвращать одно и то же количество столбцов одинаковых или совместимых типов и в одном и том же порядке. Первый оператор SELECT будет определять имена столбцов, а фраза ORDER BY последнего оператора SELECT будет определять порядок сортировки.
По умолчанию SQL Server не допускает дублирования строк в результате выполнения запроса с объединением. Если вы, однако, укажете UNION ALL, дублирующиеся строки будут сохранены.
Создайте объединение


увеличить изображение
SELECT 'PropertyTable' AS TableName, PropertyID AS ID, Property AS Quality FROM Properties UNION SELECT 'OdorTable', OdorID, Odor FROM Odors ORDER BY Quality

увеличить изображение
в панели инструментов конструктора запросов, чтобы исполнить запрос. Конструктор запросов Query Designer объединит результаты выполнения двух операторов SELECT.
увеличить изображение
Создание связей
Связи могут быть созданы в конструкторе запросов Query Designer либо с использованием панели сетки Grid Pane, либо с использованием панели SQL Pane. Панелью сетки Grid Pane лучше пользоваться, если вы связываете таблицы, которые являются формально зависимыми в схеме базы данных, поскольку конструктор запросов будет создавать связь между ними автоматически. Альтернативой является применение панели SQL Pane, которая обеспечивает большую гибкость.
Имена объектов
Если вы работаете с единственной таблицей или представлением, у вас скорее всего не будет неопределенности относительно исходного столбца, поскольку все имена столбцов в таблице должны быть уникальными. Если же вы работаете с несколькими таблицами в запросе, вам следует проявлять осторожность при указании имен столбцов.
Полная спецификация для любого объекта базы данных определяется четырьмя идентификаторами: именем сервера, именем базы данных, именем владельца и именем объекта. Идентификаторы отделяются друг от друга точками. Таким образом, полное имя для таблицы Oils в моей системе будет следующим:
BUNNY.Aromatherapy.dbo.Oils
Некоторые объекты, такие как таблицы и представления, содержат другие объекты. Чтобы сослаться на один из таких объектов (в нашем случае, на столбцы), вы должны просто добавить его имя после имени объекта. Полное имя для столбца OilID таблицы Oils будет следующим:
BUNNY.Aromatherapy.dbo.Oils.OilID
К счастью, чтобы избежать двусмысленности, вам достаточно задать лишь часть иерархии. В запросе, основанном на единственной таблице, например, имени столбца само по себе будет достаточно для идентификации. Если же запрос связывает более одной таблицы, и таблицы содержат столбцы с одинаковыми именами, вы должны включить имя таблицы в имя объекта: Oils.OilID OilProperties.OilID делают различия вполне очевидными.
Внутреннее связывание
Наиболее распространенной формой связывания является внутреннее связывание. Внутреннее связывание возвращает только те строки, для которых условие связывания имеет значение TRUE.
Свяжите две таблицы с использованием панели диаграмм Diagram Pane
щелкнув на кнопке Diagram Pane (Панель диаграмм) в панели инструментов конструктора запросов.
увеличить изображение
в панели инструментов конструктора запросов. Конструктор запросов Query Designer отобразит диалоговое окно Add Table (Добавление таблицы).

увеличить изображение
в панели инструментов конструктора запросов. Конструктор запросов Query Designer отобразит панель SQL Pane.
увеличить изображение

увеличить изображение
в панели инструментов конструктора запросов. (Нажмите ОК, если конструктор запросов Query Designer отобразит сообщение об ошибке в синтаксисе оператора SELECT.) Конструктор запросов Query Designer скроет панель SQL Pane.Внимание! Когда вы открываете конструктор запросов Query Designer, базовым оператором SQL всегда является SELECT *. Выбор определенных столбцов в панели диаграмм Diagram Pane приводит к добавлению их в список столбцов. Эта возможность предусмотрена Microsoft.

увеличить изображение
Свяжите две таблицы с использованием панели SQL Pane
и отобразите панель SQL Pane,
щелкнув на кнопках в панели инструментов конструктора запросов.
увеличить изображение
SELECT Oils.OilID, Oils.OilName, PlantParts.PlantPart FROM Oils INNER JOIN PlantParts ON Oils.PlantPartID = PlantParts.PlantPartID

увеличить изображение
в панели инструментов конструктора запросов, чтобы исполнить запрос. Конструктор запросов Query Designer отобразит значения PlantPart таблицы Oils для каждой строки.
увеличить изображение
Свяжите несколько таблиц с использованием панели диаграмм Diagram Pane
и отобразите панель диаграмм Diagram Pane.

увеличить изображение


увеличить изображение

увеличить изображение
в панели инструментов конструктора запросов Query Designer, чтобы исполнить запрос. Конструктор запросов Query Designer отобразит и столбец PlantPart, и столбец PlantType для каждого вида масла.
увеличить изображение
Свяжите несколько таблиц с использованием панели SQL Pane
и отобразите панель SQL Pane.
SELECT Oils.OilID, Oils.OilName, Odors.Odor FROM Oils INNER JOIN OilOdors ON Oils.OilID = OilOdors.OilID INNER JOIN Odors ON OilOdors.OdorID = Odors.OdorID

увеличить изображение
в панели инструментов конструктора запросов, чтобы исполнить запрос.
увеличить изображение
Использование фразы HAVING
Фраза HAVING ограничивает строки, возвращаемые фразой GROUP BY, таким же образом, как фраза WHERE ограничивает строки, возвращаемые фразой SELECT. В один оператор SELECT может быть включена и фраза WHERE, и фраза HAVING – при этом фраза WHERE применяется до операции группировки, а фраза HAVING – после нее.
Синтаксис фразы HAVING идентичен синтаксису фразы WHERE, за исключением того, что фраза HAVING может включать одну из функций агрегирования, включенных в список столбцов фразы SELECT. Заметим, однако, что вы должны повторять функцию агрегирования. Например, фраза HAVING, используемая в следующем операторе, является корректной:
SELECT PlantParts.PlantPart, Count(Oils.OilName) as NumberOfOils FROM Oils INNER JOIN PlantParts ON Oils.PlantPartID = PlantParts.PlantPartID GROUP BY PlantParts.PlantPart HAVING Count(Oils.OilName) > 3
Однако вы не можете использовать псевдоним для функции Count в фразе HAVING. Следовательно, приведенная ниже фраза HAVING не будет правильной:
HAVING NumberOfOils > 3
Создайте запрос с использованием ключевого слова HAVING в панели сетки Grid Pane
и отобразите панель сетки Grid Pane.

увеличить изображение

увеличить изображение
в панели инструментов конструктора запросов, чтобы повторно исполнить запрос.
увеличить изображение
Использование ключевого слова GROUP BY
Фраза GROUP BY может быть задана с использованием любой из панелей конструктора запросов, но лучше всего это делать с помощью панели сетки Grid Pane и панели SQL Pane.
Создайте запрос GROUP BY с использованием панели сетки Grid Pane
и отобразите панель сетки Grid Pane.

увеличить изображение

увеличить изображение
в панели инструментов конструктора запросов. Конструктор запросов Query Designer добавит столбец Group By в сетку и установит оба значения равными Group By.
увеличить изображение

увеличить изображение
, чтобы повторно исполнить запрос. Конструктор запросов Query Designer отобразит количество элементов OilName для каждого типа PlantType.
увеличить изображение
Использование оператора SELECT DISTINCT
Ключевое слово DISTINCT может быть задано в операторе SQL конструктора запросов Query Designer, либо путем установки свойств запроса.
Создайте запрос SELECT DISTINCT с использованием панели диаграмм Diagram Pane
в панели инструментов конструктора запросов.
увеличить изображение
Конструктор запросов Query Designer отобразит диалоговое окно Add Table (Добавление таблицы).

увеличить изображение
в панели инструментов конструктора запросов. Конструктор запросов Query Designer отобразит панель SQL Pane.
увеличить изображение

увеличить изображение
Внимание! Когда вы открываете конструктор запросов Query Designer, базовым оператором SQL всегда является SELECT *. Выбор определенных столбцов в панели диаграмм Diagram Pane приводит к добавлению их в список столбцов. Эта возможность предусмотрена Microsoft.


, чтобы повторно исполнить запрос.
увеличить изображение
Конструктор запросов Query Designer отобразит каждое значение лишь единожды.
Создайте запрос SELECT DISTINCT с использованием панели SQL Pane
и отобразите панель SQL Pane
.SELECT DISTINCT PlantTypes.PlantType FROM Oils INNER JOIN PlantTypes ON Oils.PlantTypeID = PlantTypes.PlantTypeID

увеличить изображение
, чтобы повторно исполнить запрос. Конструктор запросов Query Designer отобразит отличающиеся значения PlantType, имеющиеся в таблице Oils.
увеличить изображение
Оператор SELECT DISTINCT
Хотя одной из целей применения реляционной модели базы данных является устранение повторяющихся данных, большинство баз данных неизбежно будут содержать одинаковые значения в нескольких строках. Например, таблица, содержащая информацию об адресах клиентов, будет, вероятно, включать одни и те же значения страны и штата для многих строк. Это не создает повторы строк и вполне допустимо, поскольку каждое значение штата является атрибутом отдельного клиента. Аналогично, таблица на стороне многих в отношении один-ко-многим может иметь любое заданное значение внешнего ключа, повторяющееся многократно. Это не только не является неправильным, но и необходимо для реляционной целостности базы данных.
Однако это повторение может дать двусмысленные результаты после выполнения запроса. Для упомянутой таблицы клиентов Customer, содержащей, допустим, 10000 строк, из которых 90 процентов относятся к клиентам из Калифорнии, следующий запрос возвратит значение CA (штат Калифорния) 9000 раз – результат, который едва ли можно назвать полезным.
SELECT State FROM Customer
Использование ключевого слова DISTINCT в подобных ситуациях является спасением. Будучи помещенным непосредственно после SELECT, ключевое слово DISTINCT инструктирует SQL Server избегать дублирующихся строк в результирующем множестве. При этом следующий запрос возвратит каждое значение State для штата только один раз, что вам и нужно.
SELECT DISTINCT State FROM Customer
Совет. Ключевое слово DISTINCT имеет антипод ALL, который инструктирует SQL Server возвращать все строки, как уникальные, так или нет. Поскольку этот режим действует для оператора SELECT, слово ALL обычно не используется, но вы можете его включить, если при этом синтаксис запроса становится более понятным и очевидным.
Использование представлений
Создав представление, вы можете использовать его точно так же, как таблицу. Вы можете открыть его в Enterprise Manager с использованием конструктора представлений View Designer, либо включить его в другие запросы.
Если вы открываете конструктор представлений View Designer для существующего представления, Enterprise Manager трактует его как виртуальную таблицу. Базовым оператором SQL является либо SELECT * FROM <имя представления>, либо SELECT TOP n FROM <имя представления>, но не оператор запроса, создавший представление.
Откройте конструктор View Designer для представления

увеличить изображение

увеличить изображение
в панели инструментов конструктора представлений. Конструктор представлений View Designer отобразит панель SQL Pane, содержащую оператор SELECT для представления.
увеличить изображение



увеличить изображение
Конструктор запросов Query Designer отобразит оператор SELECT для запроса.
увеличить изображение

увеличить изображение
, чтобы скрыть панель SQL Pane.
увеличить изображение
в панели инструментов конструктора запросов, чтобы исполнить запрос. Конструктор запросов Query Designer отобразит столбцы OilName Property.
увеличить изображение
Изменение представлений
Представление может быть изменено двумя способами: вы можете изменить его имя, либо вы можете изменить базовый оператор SQL для представления.
Переименуйте представление

увеличить изображение

увеличить изображение


Модифицируйте представление

увеличить изображение
, и скройте панель результатов Results Pane, щелкнув на кнопке Results Pane (Панель результатов).

увеличить изображение

увеличить изображение
в панели инструментов конструктора представлений. Конструктор представлений View Designer сохранит новое определение представления. Понятие о представлениях
Хотя конструктор запросов Query Designer облегчает обращение к таблицам в вашей базе данных, постоянная корректировка или создание оператора запроса каждый раз заново может оказаться слишком утомительным и трудоемким. SQL Server предоставляет средства для хранения оператора SELECT в виде представления. В большинстве случаев данные, отображаемые представлением, не являются данными, хранящимися в базе данных, – в представлении хранится только оператор SELECT.
Вы можете считать представление виртуальной таблицей. Она может использоваться точно так же, как обычная таблица. Возможность использования результатов выполнения одного оператора SELECT в качестве входной информации для другого оператора SELECT является одним из фундаментальных требований реляционной модели. Это требование основано на принципе замкнутости.
Индексированные представления
Новое в SQL Server 2000 – это его способность создавать индекс для представления. Если вы индексируете вид, результирующее множество представления хранится в базе данных и модифицируется при любой модификации базовых таблиц и представлений. При определенных обстоятельствах это может существенно улучшить производительность, поскольку нет необходимости пересчитывать результирующее множество при каждой ссылке на него.
Индексированные представления работают лучше, если базовые данные меняются не слишком часто; в противном случае затраты на сопровождение индексированного представления будут выше, чем если бы вы пересчитывали представление по мере необходимости. Индексированные представления лучше всего использовать для следующих двух типов запросов:
Создание представлений
Enterprise Manager предусматривает два метода для создания нового представления: мастер создания представления Create View Wizard, который проводит вас по всем этапам процедуры создания представления; и команда New View (Создать представление), которая открывает конструктор представлений View Designer. Конструктор представлений аналогичен конструктору запросов, за исключением того, что он дает возможность сохранять созданный вами оператор SELECT. Мастер создания представлений Create View Wizard является полезным инструментом, но иногда проще создать представление с помощью конструктора представлений View Designer.
Создайте представление с использованием мастера Create View Wizard
в панели инструментов Enterprise Manager. Enterprise Manager отобразит диалоговое окно Select Wizard (Выбор мастера).





Создайте представление с использованием конструктора View Designer

увеличить изображение
в панели инструментов Enterprise Manager. Enterprise Manager откроет конструктор представлений View Designer с отображением всех четырех панелей.
увеличить изображение
в панели инструментов конструктора представлений. Конструктор представлений View Designer отобразит диалоговое окно Add Table (Добавление таблицы).

увеличить изображение

увеличить изображение
Конструктор запросов Query Designer отобразит диалоговое окно Save As (Сохранить как).

Понятие об операторе INSERT
Синтаксис оператора INSERT похож на синтаксис оператора SELECT. Его базовая форма имеет следующий вид:
INSERT [INTO] таблица_или_представление [(список_столбцов)] VALUES (список_значений)
Каждый оператор INSERT может модифицировать только одну таблицу или представление. При использовании оператора INSERT для модификации представления следует учитывать следующие ограничения:
Список столбцов в операторе INSERT не является обязательным. Если он не указан, оператор INSERT должен включать значения для всех столбцов в таблице или представлении, а порядок их должен соответствовать порядку столбцов в таблице или представлении. Вы можете использовать ключевое слово DEFAULT, чтобы задать для строки значения, установленные по умолчанию.
Если список столбцов присутствует, формат его подобен формату, используемому для списка столбцов в операторе SELECT: имена столбцов отделяются запятыми. Поскольку оператор INSERT может добавлять строку только в одну таблицу, вам нет необходимости использовать идентификатор имени таблицы в имени столбца.
Вставка нескольких строк
Оператор INSERT имеет вторую форму, которая использует оператор SELECT вместо списка VALUES с целью задания значений для строки (или строк), которая будет добавлена. Эта форма оператора INSERT имеет следующий вид:
INSERT INTO таблица_или_представление [(список_столбцов)] SELECT [(список_столбцов) FROM таблица_или_представление [WHERE (условие)]
Фраза WHERE в операторе является необязательной. Если она отсутствует, в таблицу или представление, заданные в фразе INSERT, будут добавлены все строки из таблицы или представления, заданных в фразе FROM.
Вставьте несколько строк с использованием панели сетки Grid Pane

увеличить изображение

увеличить изображение
и панель Results Pane.

увеличить изображение
в панели инструментов конструктора запросов и выберите Insert From (Вставить из) в списке. Конструктор запросов Query Designer отобразит диалоговое окно, предлагающее вам выбрать таблицу-адресат.

увеличить изображение

увеличить изображение

увеличить изображение
в панели инструментов конструктора запросов, чтобы исполнить запрос. Конструктор запросов Query Designer отобразит сообщение, подтверждающее, что запрос был исполнен.
в панели инструментов конструктора запросов, чтобы повторно исполнить запрос SELECT *.
увеличить изображение

в панели инструментов конструктора запросов, чтобы повторно исполнить запрос SELECT *.
увеличить изображение
Вставьте несколько строк с использованием панели SQL Pane
и панель сетки Grid Pane
и отобразите панель SQL Pane.

увеличить изображение

увеличить изображение
Примечание. Единственное изменение здесь затрагивает только оператор WHERE.
в панели инструментов конструктора запросов, чтобы исполнить запрос. Enterprise Manager отобразит сообщение, подтверждающее, что запрос был исполнен.
в панели инструментов конструктора запросов, чтобы повторно исполнить запрос SELECT *. Осуществите прокрутку до конца таблицы, чтобы убедиться, что новые строки были добавлены.
увеличить изображение
Вставка строк с использованием панели сетки Grid Pane
Панель сетки Grid Pane предоставляет самый простой способ создания оператора INSERT, поскольку при этом не требуется запоминать синтаксис оператора.
Вставьте строку с использованием панели сетки Grid Pane

увеличить изображение
Совет. Применение команды Query (Запрос) в меню Open Table (Открытие таблицы) или Open View (Открытие представления) является самым простым способом открыть конструктор запросов Query Designer с отображением всех панелей. Хотя устанавливаемым по умолчанию оператором SQL является SELECT * FROM <таблица_или_представление>, запрос не исполняется, поэтому никакие строки не возвращаются и не показываются.
и панель результатов Results Pane.

увеличить изображение
в панели инструментов конструктора запросов и выберите Insert Into (Вставить в) из списка. Конструктор запросов Query Designer изменит вид панели сетки Grid Pane, чтобы она отображала только ячейки Column и New Value.
увеличить изображение

увеличить изображение
в панели инструментов конструктора запросов, чтобы исполнить запрос. Конструктор запросов Query Designer отобразит сообщение, подтверждающее, что в таблицу добавлена одна строка.

увеличить изображение

увеличить изображение
Внимание! Значение OilID в вашей базе данных может не совпадать с представленным здесь. Помните, что столбец OilID был определен в качестве идентификационного столбца. Идентификационные столбцы в SQL Server гарантированно являются уникальными, но они не обязательно располагаются в последовательном порядке.
Вставка строк с использованием панели SQL Pane
Хотя панель сетки Grid Pane предоставляет простой метод создания оператора INSERT, но использование панели SQL Pane, позволяющее вводить оператор непосредственно, предоставляет большие функциональные возможности.
Вставьте строку с использованием панели SQL Pane
и панель диаграмм Diagram Pane
и отобразите панель SQL Pane.

увеличить изображение
INSERT INTO Oils (OilName) VALUES ('InsertFromSQL')

увеличить изображение
в панели инструментов конструктора запросов, чтобы исполнить запрос. Конструктор запросов Query Designer отобразит сообщение, подтверждающее, что строка добавлена.

в панели инструментов конструктора запросов, чтобы повторно исполнить запрос SELECT *, и осуществите прокрутку до конца таблицы, чтобы убедиться, что новая строка была добавлена.

увеличить изображение

увеличить изображение
Вставьте строку с использованием значений DEFAULT и NULL
INSERT INTO Oils (OilName, LatinName, Sample) VALUES ('InsertDefault', NULL, DEFAULT)

увеличить изображение
в панели инструментов конструктора запросов, чтобы исполнить запрос. Конструктор запросов Query Designer отобразит сообщение, подтверждающее, что строка была добавлена.
в панели инструментов конструктора запросов, чтобы повторно исполнить запрос SELECT *, прокрутите окно до конца таблицы, чтобы убедиться, что новая строка была добавлена.
увеличить изображение
Модификация строк с использованием фразы FROM
Можно использовать фразу SELECT в операторе INSERT, чтобы вставить значения из другой таблицы (см. урок 17). Оператор UPDATE использует фразу FROM для извлечения значений из другой таблицы:
UPDATE таблица_или_представление SET объекты_изменения FROM таблица_или_представление оператор_связывания условие_связывания [WHERE (условие_ограничения)]
Фраза FROM здесь имеет тот же формат, что и фраза FROM в операторе SELECT. Так же, как и для оператора SELECT, вы можете задать более одной таблицы или представления путем добавления операторов связывания. Необязательное условие WHERE может использоваться для ограничения множества модифицируемых строк.
Модифицируйте строки с использованием оператора FROM
UPDATE MyOils SET MyOils.PlantPartID = Oils.PlantPartID FROM MyOils INNER JOIN Oils ON MyOils.OilName = Oils.OilName

увеличить изображение
Внимание! Вы не можете использовать столбцы OilID для связывания двух таблиц, поскольку команды INSERT, которые вы использовали для добавления строк в уроке 17, создали новые значения OilID для каждой строки в таблице MyOils.
в панели инструментов конструктора запросов, чтобы исполнить запрос. Конструктор запросов Query Designer отобразит сообщение о количестве строк, подвергшихся изменениям.
в панели инструментов конструктора запросов, чтобы исполнить запрос SELECT *.
увеличить изображение
Модификация строк с использованием панели сетки Grid Pane
Панель сетки Grid Pane конструктора запросов предоставляет возможности для создания запроса UPDATE.
Модифицируйте все строки с использованием панели сетки Grid Pane

увеличить изображение
и на кнопке Diagram (Диаграмма).

увеличить изображение

увеличить изображение
в панели инструментов конструктора запросов и выберите Update (Модифицировать). Конструктор запросов добавит в сетку столбец нового значения New Value.
увеличить изображение

увеличить изображение
в панели инструментов конструктора запросов, чтобы исполнить запрос. Конструктор запросов Query Designer отобразит сообщение, подтверждающее, что строки были модифицированы.

увеличить изображение

увеличить изображение

увеличить изображение
в панели инструментов конструктора запросов, чтобы исполнить запрос. Конструктор запросов Query Designer отобразит сообщение, подтверждающее, что строка была модифицирована.
в панели инструментов конструктора запросов, чтобы исполнить запрос SELECT *.
увеличить изображение
Модификация строк с использованием панели SQL Pane
Как и для других форм запросов, непосредственный ввод оператора UPDATE в панели SQL обеспечивает большую гибкость.
Модифицируйте все строки с использованием панели SQL Pane
и скройте панель сетки Grid Pane.

увеличить изображение
UPDATE MyOils SET Sample = "Sample Field"

увеличить изображение
в панели инструментов конструктора запросов, чтобы исполнить запрос. Конструктор запросов Query Designer отобразит сообщение о количестве строк, подвергшихся изменениям в результате выполнения запроса.
в панели инструментов конструктора запросов, чтобы повторно исполнить запрос SELECT *.
увеличить изображение
Понятие об операторе UPDATE
Оператор UPDATE позволяет изменять значения в одной или в нескольких строках таблицы. Базовый синтаксис оператора UPDATE следующий:
UPDATE таблица_или_представление SET объекты_изменения [WHERE (условие)]
Подобно оператору INSERT, один оператор UPDATE может модифицировать только одну таблицу или представление. Для обновления представления с помощью оператора UPDATE существуют те же ограничения, что и для обновления представления с помощью оператора INSERT:
За ключевым словом SET следует перечень подлежащих обновлению столбцов, отделяемых запятыми, а также их новые значения. Форма записи при этом следующая: имя_столбца = новое_значение. Новое значение может быть константой или выражением, которое также может ссылаться на сам столбец. Например, выражение SalesPrice = SalesPrice * .90 будет уменьшать значения в столбце SalesPrice на 10 процентов.
Фраза WHERE является необязательной. Если она имеется, то должна задавать строки, подлежащие обновлению. Если фраза WHERE в операторе UPDATE отсутствует, будут модифицироваться все строки в таблице.
Удаление строк с использованием панели сетки Grid Pane и панели диаграмм Diagram Pane
Панель сетки и панель диаграмм конструктора запросов Query Designer предоставляют графические средства для создания операторов DELETE; однако, они не поддерживают применение фразы FROM, которая дает возможность использовать в операторе DELETE дополнительные таблицы и представления.
Удалите избранные строки из таблицы

увеличить изображение

и панель результатов Results Pane.

в панели инструментов конструктора запросов, а затем выберите Delete (Удалить).
увеличить изображение
Удаление строк с использованием панели SQL Pane
Как и в других случаях, непосредственный ввод оператора DELETE в панели SQL Pane конструктора запросов Query Designer обеспечивает большую гибкость, однако при этом вам необходимо помнить синтаксис оператора.
Удалите строки с использованием фразы WHERE
и скройте панель диаграмм Diagram Pane
и панель сетки Grid Pane.

увеличить изображение
DELETE FROM MyOils WHERE (OilName = 'Basil')

в панели инструментов конструктора запросов, чтобы исполнить запрос. Enterprise Manager отобразит сообщение, подтверждающее, что строка была удалена.
в панели инструментов конструктора запросов, чтобы повторно исполнить базовый запрос SELECT*. Убедитесь, что строка для Basil была удалена.
увеличить изображение

увеличить изображение
и панель сетки Grid Pane.

увеличить изображение
в панели инструментов конструктора запросов и выберите Delete (Удалить). Конструктор запросов изменит оператор DELETE в панели SQL Pane.
увеличить изображение

увеличить изображение
DELETE PlantParts WHERE (PlantPartID = 10)

увеличить изображение
в панели инструментов конструктора запросов, чтобы исполнить запрос. Enterprise Manager отобразит сообщение, подтверждающее, что строка была удалена.
в панели инструментов конструктора запросов, чтобы повторно исполнить базовый запрос SELECT *. Убедитесь, что строки, для которых значение PlantPartID равно 10, были удалены.
увеличить изображение
Удаление всех строк с помощью оператора TRUNCATE TABLE
Оператор TRUNCATE TABLE может быть выполнен только из панели SQL Pane конструктора запросов Query Designer.
Удалите все строки с использованием оператора TRUNCATE TABLE

и панель сетки Grid Pane.

увеличить изображение
TRUNCATE TABLE MyOils

увеличить изображение

увеличить изображение
в панели инструментов конструктора запросов, чтобы исполнить запрос. Enterprise Manager отобразит сообщение, подтверждающее, что запрос был успешно исполнен.
в панели инструментов конструктора запросов, чтобы повторно исполнить базовый запрос SELECT *. Убедитесь, что все строки были удалены.
увеличить изображение
Использование мастера Copy Database Wizard
Мастер копирования Copy Database Wizard может быть вызван через диалоговое окно Select Wizard (Выбор мастера), а также через меню All Tasks (Все задачи) контекстного меню для папки Server или для папки Databases.
Скопируйте базу данных
Внимание! Чтобы выполнить это упражнение, вы должны иметь доступ к серверу.
SQL Server отобразит диалоговое окно Select Wizard (Выбор мастера).






Совет. Если для какого-либо файла в ячейке статуса Status имеется крестик, вы можете воспользоваться кнопкой Modify (Изменить), чтобы разрешить проблему.
Использование мастера импорта DTS Import Wizard
Мастер DTS Import Wizard дает возможность импортировать данные из различных типов источников данных, в том числе:
Импортируйте таблицу с использованием мастера DTS Import Wizard

увеличить изображение
в панели инструментов Enterprise Manager. SQL Server отобразит диалоговое окно Select Wizard (Выбор мастера).



, чтобы указать имя и местонахождение файла источника данных. Мастер отобразит диалоговое окно Select File (Выбор файла).



Примечание. При выборе на предыдущей странице другой опции, Use A Query To Specify The Data To Transfer (Использовать запрос для указания передаваемых данных), появится диалоговое окно, предлагающее ввести оператор SQL.

в столбце Transform. Мастер отобразит диалоговое окно Column Mappings And Transformation (Соответствия столбцов и преобразования).


Совет. Эта страница мастера также предоставляет вам возможность сохранить ваши параметры для импорта в виде DTS-пакета. Это может оказаться особенно полезным, если вам потребуется снова выполнить операцию импортирования.




увеличить изображение
Совет. Если таблица не отображается, выберите Refresh (Обновить) из меню Action (Действие), чтобы обновить список.
Использование мастера экспорта DTS Export Wizard
Как вы можете догадаться, мастер экспорта DTS Export Wizard выполняет ту же функцию, что и мастер импорта DTS Import Wizard, но в обратном направлении.
Экспортируйте таблицу с использованием мастера экспорта DTS Export Wizard






справа от поля имени файла File Name. Мастер отобразит диалоговое окно Select File (Выбор файла).
Подключение базы данных
После того, как база данных была отключена от сервера, вы можете переместить или скопировать ее файл данных и журнал транзакций, как вы это делаете для любых других файлов операционной системы. Далее вы можете подключить базу данных к этому же или к другому серверу.
Повторно подключите базу данных Aromatherapy

SQL Server отобразит диалоговое окно Browse For Existing File (Просмотр файлов).


Добавление объектов в панель редактирования Editor Pane
Наиболее простой и удобной возможностью при работе в Object Browser является использование приема "перетащить-и-оставить". Всякий раз, когда вам необходимо задать объект в Object Browser, вам достаточно просто перетащите его в панель редактирования Editor Pane окна Query (Запрос), и его имя будет вставлено в окно редактирования.
Совет. Если вы перетащили одну из функций, отображенную в папке Common Objects, Object Browser вставит только имя функции, без параметров. Для вставки полного синтаксиса функции используйте команду Scripting, которую мы рассмотрим в следующем разделе.
Добавьте объект базы данных
Query Analyzer очистит панель редактирования Editor Pane.SELECT * FROM

увеличить изображение

для выполнения запроса. Query Analyzer отобразит результаты в панели сетки Grids Pane.
Добавьте в папку все объекты


увеличить изображение

увеличить изображение
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит результаты в панели сетки Grids Pane.
Использование сценариев SQL
Сценарий (script) представляет собой набор операторов Transact-SQL, хранимых в файле. Сценарии часто используются для постоянного хранения команд для записей, используемых для создания и заполнения объектов базы данных. Поскольку сценарии хранятся в тестовом файле, а не в базе данных, то они могут быть использованы для воссоздания базы данных на других серверах. (SQL Server использовал сценарии для создания шаблонных баз данных Pubs и Northwind).
Хотя сценарии очень часто используются для создания объектов базы данных, они могут применяться не только для этого. В сценарий может быть включен любой допустимый операторы Transact-SQL.
В сценарии операторы SQL группируются в пакеты. Сценарий может содержать один или несколько пакетов, а каждый пакет может содержать один или более операторов SQL. В сценарии, содержащем более одного пакета, пакеты разделяются командой GO. Если сценарий не содержит команды GO, все операторы будут выполняться как один пакет.
Создайте сценарий
SELECT, OilName, LEFT(LatinName, 10) FROM Oils GO SELECT PlantPartID, PlantPart FROM PlantParts
Примечание. В запрос, использовавшийся в предыдущем упражнении, были добавлены только три последние строки.

в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Save Query (Сохранение запроса).
Примечание. Если вы не выберите вкладку Editor (Редактор) перед нажатием кнопки Save (Сохранть), анализатор запросов Query Analyzer сохранит результаты выполнения запроса, а не сам запрос.

Откройте сценарий
Query Analyzer откроет новое пустое окно Query (Зарос).
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).


для запуска сценария. Query Analyzer отобразит результаты во вкладке Grids (Сетка).
Открытие объектов
Если вы в Object Browser нажмете правой кнопкой мыши на таблице или представлении и выберите Open (Открыть), анализатор запросов Query Analyzer отобразит строки в таблице (или результаты выполнения оператора SELECT для представления) в окне Open Table (Открытие таблицы).
Откройте таблицу

увеличить изображение

Откройте представление

увеличить изображение

Скриптование объектов
Скриптование (создание сценария действия) является более сложной версией приема "перетащить-и-оставить" Object Browser. Скриптование создает полный оператор Transact-SQL и может выполняться из контекстного меню большинства объектов. Не все типы сценариев применимы ко всем типам объектов, а к таким типам, как параметры функции или столбцы, операция скриптования не может быть применена вообще.
Имеющиеся сценарии и объекты, к которым они могут быть применены, представлены в Таблице 21.2. Большинство из этих сценариев мы рассмотрим в следующем уроке о, посвященном созданию и обслуживанию объектов базы данных.
| Create (Cоздать) | Таблица, индекс, ограничение, триггер, представление, хранимая процедура |
| Alter (Изменить) | Триггер, вид |
| Drop (Изъять) | Таблица, индекс, ограничение, триггер, представление, хранимая процедура |
| Select (Выбрать) | Таблица, представление |
| Insert (Вставить) | Таблица, представление |
| Update (Обновить) | Таблица, представление |
| Delete (Удалить) | Таблица, представление |
| Execute (Выполнить) | Хранимая процедура, функция |
Сценарии могут быть записаны в новое окне Query (Запрос), в файл сценария или в буфер обмена (откуда они могут быть вставлены в существующее окно запроса Query). Некоторые сценарии, такие как сценарии выполнения функции, используют замещаемые параметры. Query Analyzer предоставляет диалоговое окно для удобства замещения этих параметров соответствующими значениями.
Напишите сценарий для оператора SELECT

увеличить изображение
Совет. Object Browser создает оператор SELECT в отдельной строке. Для удобства вы можете отредактировать его, что показано на рисунке.
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит результаты в панели сетки Grids Pane.
Напишите сценарий для функции


увеличить изображение



в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит результаты в панели сетки Grids Pane.
Ввод операторов Transact-SQL
Простейшим способом использования окна Query (Запрос) является ввод операторов SQL, как мы это делали в панели SQL конструктора запросов Query Designer. В отличии от окна конструктора запросов Query Designer, окно Query (Запрос) анализатора запросов Query Analyzer предоставляет некоторый дополнительный сервис, выделяя различными цветами введенные вами операторов Transact-SQL. В Таблица 21.1 приведены цвета, используемые в окне Query (Запрос).
| Синий | Ключевое слово |
| Темно зеленый | Комментарий |
| Темно красный | Хранимая процедура |
| Серый | Оператор |
| Зеленый | Системная таблица |
| Пурпурный | Системная функция |
| Красный | Символьная строка |
Выполните запрос SELECT
SELECT OilName, LEFT(LatinName, 10) FROM Oils

Анализатор запросов Query Analyzer добавит в окно Query (Запрос) панель, содержащую две вкладки: вкладку Grids (Сетка), содержащую результаты запроса и вкладку Messages (Сообщения), содержащую сообщения.

Отобразите результаты запроса в отдельной таблице


Выбор базы данных
Query Analyzer будет использовать текущую выбранную базу данных для разрешения ссылок в запросах и других операторах Transact-SQL. Панель инструментов, показанная на рис. 21-1, содержит поле со списком, в котором отображается текущая выбранная база данных. Вы можете переключится на другую базу данных, выбрав ее имя в панели инструментов или в меню Query (Запрос).

увеличить изображение
Рис. 21.1.
Выберите базу данных с помощью панели инструментов

увеличить изображение
Выберите базу данных из меню Query (Запрос)

Совет. Вы также можете воспользоваться комбинацией клавиш Ctrl + U для открытия диалогового окна Select Database (Выбор базы данных).

Запуск Query Analyzer
Вы можете запустить Query Analyzer из Enterprise Manager или из меню Start (Пуск) в Windows. Если вы запустили Query Analyzer из Enterprise Manager, Query Analyzer будет передавать информацию о соединении из Enterprise Manager: если вы подключены к серверу, то Query Analyzer будет соединяться с этим сервером, и если у вас по умолчанию установлена какая-либо база данных, то Query Analyzer будет выбирать именно эту базу данных.
Совет. Для запуска Query Analyzer воспользуйтесь командой isqlw из командной строки.
Если вы запустили Query Analyzer из меню Start (Пуск) или если вы не создали в Enterprise Manager соединения с сервером или базой данных, вы должны будете в Query Analyzer создать соединение вручную.
Запустите Query Analyzer из Enterprise Manager

увеличить изображение

увеличить изображение
Примечание. Если в Query Analyzer не отображается окно просмотра объектов Object Browser, нажмите F8 для его отображения.
Запустите Query Analyzer из меню Start (Пуск)
Query Analyzer отобразит диалоговое окно Connect To SQL Server (Соединение с SQL Server).
Совет. Если ваш сервер не настроен на автоматический запуск при соединении, вы можете установить флажок Start SQL Server If It Stopped (Запускать SQL Server, если он остановлен) для включения этой опции.

увеличить изображение
Использование шаблонов
Язык SQL несколько отличается от большинства других языков программирования, таких как C++ или Microsoft Visual Basic, тем, что в нем есть относительно немного операторов, но синтаксис их может быть довольно сложным. Одна из претензий, часто предъявляемых к языку SQL, состоит в том, что все данные извлекаются с помощью одного оператора: оператора SELECT.
Шаблоны являются превосходным средством для работы с составными операторами SQL. При работе с SQL длительное время, вы начинаете замечать, что часто используете лишь несколько более или менее стандартных комбинаций основных команд: например оператор SELECT для двух таблиц, имеющих внутреннюю связь INNER JOIN, или оператор CREATE TABLE с идентификационным столбцом IDENTITY. Сохранив, эти операторы как шаблон, вы одной командой сможете воспроизвести весь содержащийся в шаблоне текст. Для настройки операторов вы можете воспользоваться удобным диалоговым окном.
Совет. Шаблоны могут применяться не только к одной команде. Они могут состоять из любого числа операторов, подобно файлам SQL-сценариев, и могут содержать множество команд и пакетов.
Несмотря на широту предоставляемых возможностей, шаблоны просты в использовании и создании. Они являются обычными файлами SQL-сценариев с расширением .tql (по умолчанию). Элементы шаблона могут настраиваться. Например, в операторе CREATE TABLE имена столбцов и таблиц могут быть определены как параметры. В шаблоне параметр имеет такую форму: <имя_параметра, тип_данных, значение>. Например, представленный ниже шаблон сценария, содержит два параметра: table_name и sort_name:
SELECT * FROM
Сценарий определяет оба параметра как имеющие тип данных sysname, который является специальным типом, используемым для указания имен объектов. Параметр table_name имеет значение по умолчанию "test_view", а параметр sort_column имеет значение по умолчанию "test_column".
Анализатор запросов Query Analyzer предоставляет диалоговое окно Replace Template Parameters (Замещение параметров шаблона) для удобного ввода текста в шаблон. Чтобы отобразить это диалоговое окно, откройте шаблон в окне Query (Запрос) и выберите Replace Template Parameters (Замещение параметров шаблона) из меню Edit (Правка).
Совет. Для открытия диалогового окна Replace Template Parameters (Замещение параметров шаблона) вы также можете воспользоваться комбинацией клавиш Ctrl + Shift + M.
Сформируйте оператор CREATE TABLE с помощью шаблона

увеличить изображение

увеличить изображение

| Table_name | TemplateTable |
| Column_1 | TemplateID |
| Datatype_for_column_1 | Smallint |
| Seed | 1 |
| Increment | 1 |
| Column_2 | Description |
| Datatype_for_column_2 | Varchar (20) |


увеличить изображение

увеличить изображение
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст таблицу.
увеличить изображение
Изменение объектов
В то время как оператор CREATE создает новый объект, оператор ALTER предоставляет механизм для изменения определения объекта. Не все объекты, созданные с помощью оператора CREATE, имеют соответствующий оператор ALTER. В таблице 22.2 приведен синтаксис для объектов, которые могут быть изменены.
| ALTER DATABASE <имя> <спецификация_файла> | Изменяет файлы, используемые для хранения базы данных |
ALTER FUNCTION <имя> RETURNS <возвращаемое_значение> AS < операторы_tsql> | Изменяет операторы Transact-SQL, содержащие функцию |
ALTER PROCEDURE <имя> AS < операторы_tsql> | Изменяет операторы Transact-SQL, содержащие в себе хранимую процедуру (См. урок 28, "Хранимые процедуры") |
ALTER TABLE <имя> <определение_изменения> | Изменяет определение таблицы (В этом уроке мы подробно рассмотрим <определение_изменения>.) |
ALTER TRIGGER <имя> {FOR | AFTER | INSTEAD OF} <действие_dml> | Изменяет операторы Transact-SQL, содержащие в себе триггер (См. урок 29, "Триггеры") |
ALTER VIEW <имя> AS <оператор_выборки> | Изменяет операторы SELECT, которые создают представление |
Оператор ALTER TABLE является составным по той же причине, почему и оператор CREATE TABLE: определение таблицы состоит из нескольких различных частей. Упрощенная версия синтаксиса для оператора ALTER TABLE приведена ниже:
ALTER TABLE <имя> { [ALTER COLUMN <определение_столбца>] | [ADD <определение_столбца>] | [DROP COLUMN <имя_столбца>] | [ADD [WITH NOCHECK] CONSTRAINT <ограничение_для_таблицы>] }
Ключевые слова CHECK (подразумевается) и NOCHECK перед ограничением таблицы, предписывают SQL Server тестировать или не тестировать имеющиеся в таблице данные с учетом нового ограничения. WITH NOCHECK используется лишь в крайне редких случаях.
Изменение столбцов
Ниже представлено несколько ограничений для фразы ALTER COLUMN. Столбец не может быть изменена, если он:
Измените представления

увеличить изображение
для очистки содержимого панели редактирования Editor Pane.ALTER VIEW SimpleView AS SELECT SimpleDescription, RelatedDescription FROM RelatedTable INNER JOIN SimpleTable ON RelatedTable.SimpleID = SimpleTable.SimpleID



увеличить изображение
Добавьте столбцы в таблицу

увеличить изображение
для очистки содержимого панели редактирования Editor Pane.ALTER TABLE SimpleTable ADD NewColumn varchar(20)

Query Analyzer добавит столбец в таблицу.
увеличить изображение
Измените столбцы в таблице
для очистки содержимого панели редактирования Editor Pane.ALTER TABLE SimpleTable ADD COLUMN NewColumn varchar(10)

Query Analyzer добавит столбец в таблицу. 
увеличить изображение
Удалите столбцы из таблицы
для очистки содержимого панели редактирования Editor Pane.ALTER TABLE SimpleTable DROP COLUMN NewColumn

Query Analyzer удалит столбец из таблицы.
увеличить изображение
Скриптование DDL
Создать два сценария для операторов SELECT можно в панели Object Browser. Object Browser поддерживает сценарии CREATE, ALTER и DROP для большинства объектов базы данных. После генерации сценария вы можете видоизменить его для решения своих задач.
Совет. Операторы CREATE, созданные скриптованием, могут быть сохранены в файле сценария. Это удобно для документирования структуры базы данных.
Сформируйте сценарий CREATE TABLE

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

увеличить изображение
Query Analyzer создаст новую таблицу.
увеличить изображение
Создание объектов
Объекты базы данных создаются программным путем с помощью оператора CREATE. Точный синтаксис оператора CREATE различен для каждого объекта, однако объекты, которые вы можете создавать, а также базовый синтаксис оператора CREATE для каждого объекта, вы можете найти в таблице 22.1.
| CREATE DATABASE <имя> | Создает базу данных |
| CREATE DEFAULT <имя> AS < выражение_константы > | Создает значение по умолчанию |
| CREATE FUNCTION <имя> RETURNS <возвращаемое_значение> AS <операторы_tsql> | Создает пользовательскую функцию (См. урок 30, "Пользовательские функции") |
| CREATE INDEX <имя> ON <таблица_или_представление> (<индексируемые_столбцы>) | Создает индекс в таблице или представление |
| CREATE PROCEDURE <имя> AS < операторы_tsql> | Создает хранимую процедуру (См. урок 28, "Хранимые процедуры") |
| CREATE RULE <имя> AS <условное_выражение> | Создает роль базы данных |
| CREATE SCHEMA AUTHORIZATION <владелец> <определения_объектов> | Создает таблицы, представления и разрешения как один объект |
| CREATE STATISTICS <имя> ON < таблица_или_представление> (<столбцы>) | Создает статистические данные, используемые оптимизатором запросов |
| CREATE TABLE <имя> (<определение_таблицы>) | Создает таблицу |
| CREATE TRIGGER <имя> {FOR | AFTER | INSTEAD OF} < действие_dml> AS <операторы_tsql> | Создает триггер (См. уроку 29, "Триггеры") |
| CREATE VIEW <имя> AS < оператор_выборки> | Создает представление |
Из операторов CREATE, рассмотренных в таблице 22.1, только оператор CREATE TABLE является достаточно сложным. Это вызвано тем, что определение таблицы составляет несколько различных элементов. Вы должны определить столбцы, а каждый столбец должен иметь имя и тип данных. Вы можете задать для столбцов возможность использования нулевых (NULL) значений идентификационной строке или в GUID, значение по умолчанию, любые ограничения, применимые к столбцу, а также несколько других свойств, которые мы не будем здесь рассматривать. Упрощенная версия синтаксиса, для определения столбцов имеет следующий вид:
<имя_столбца> <тип_данных> [NULL | NOT NULL] [ [DEFAULT <значение_по_умолчанию>] | [IDENTITY [(начальное_значение>, <шаг_увеличения>)[NOT FOR REPLLCATION]]]] [ROWGUIDCOL] [<ограничение_для_столбца>[, <ограничение_для_столбца>...]]
Учтите, что указывание значений по умолчанию и спецификации идентичности является взаимоисключающим. Так, вы можете задавать значения по умолчанию для столбца или для идентификационного столбца, но никак не для обоих.
Описание для <ограничение_для_столбца> представлено ниже:
[CONSTRAINT <имя_ограничения] [ [PRIMARY KEY | UNIQUE] [CLUSTERED | NONCLUSTERED] | [[FOREIGN KEY] REFERENCES <ссылочная_таблица> (имя_столбца)] | [CHECK [NOT FOR REPLICATION] (<логическое выражение>)] ]
Вы можете задавать более одного выражения <ограничение_для_столбца> для столбца, но при этом вы должны задать тип каждого ограничения (PRIMARY KEY/UNIQUE, FOREIGN KEY или CHECK).
Все это выглядят несколько пугающе, но если вы начнете с основных определений (например, MyColumn varchar 20) и будете просто добавлять необходимые фразы, то увидите, что все не так уж сложно. Как и в приведенных ниже примерах, вам почти никогда не придется использовать более двух или трех фраз в одном определении столбца:
MyColumn varchar(20) MyColumn varchar(20) NOT NULL MyColumn varchar(20) PRIMARY KEY CLUSTERED MyColumn varchar(20) IDENTITY (1, 1) PRIMARY KEY CLUSTERED MyColumn varchar(20) NOT NULL FOREIGN KEY REFERENCES Oils (OilName)

увеличить изображение

увеличить изображение
Совет. Если окно Query (Запрос) отобразит сообщение о том, что объект с именем "SimpleTable" уже существует, то вам не следует щелкать на Object Browser перед нажатием клавиши F5.
Создайте таблицу с ограничением внешнего ключа.
для очистки содержимого панели редактирования Editor Pane.CREATE TABLE RelatedTable ( RelatedID smallint IDENTITY (1,1) PRIMARY KEY CLUSTERED, SimpleID smallint REFERENCES SimpleTable (SimpleID), RelatedDescription varchar(20) )

Query Analyzer создаст таблицу.
увеличить изображение
Создайте представление
для очистки содержимого панели редактирования Editor Pane.CREATE VIEW SimpleView AS
SELECT RelatedID, SimpleDescription, RelatedDescription FROM RelatedTable INNER JOIN SimpleTable ON RelatedTable.SimpleID = SimpleTable.SimpleID

Query Analyzer создаст представление.
увеличить изображение

увеличить изображение
Создайте индекс
для очистки содержимого панели редактирования Editor Pane.CREATE INDEX SimpleIndex ON SimpleTable (SimpleDescription)

Query Analyzer создаст индекс.
увеличить изображение
Удаление объектов
Оператор DROP удаляет объект базы данных. В отличие от операторов CREATE и ALTER, операторы DROP имеют простой и неизменный синтаксис:
DROP <тип_объекта> <имя>
<тип_объекта> - любой объект из таблицы 22.1, исключая схему.
Удалите индекс

увеличить изображение
для очистки содержимого панели редактирования Editor Pane.DROP INDEX SimpleTable.SimpleIndex

Query Analyzer удалит индекс.
увеличить изображение
Удалите таблицу
для очистки содержимого панели редактирования Editor Pane. DROP TABLE RelatedTable

Query Analyzer удалит таблицу.
увеличить изображение
Использование мастера Index Tuning Wizard
Настройка базы данных не может выполняться в пустоте. Не имеет смысла вопрос, какая схема работает лучше в абсолютном выражении. Нас прежде всего интересует, какое сочетание представлений и индексов приведет к наиболее быстрому выполнению конкретных операций. По этой причине мастеру Index Tuning Wizard требуется предоставить определенные данные о загруженности, в качестве которых может выступать либо SQL-сценарий, либо данные трассировки сервера из SQL Profiler.
Вторая страница мастера требует, чтобы вы указали сервер и базу данных для анализа, а также предоставляет две дополнительных опции выбора: Keep All Existing Indexes (Не изменять существующие индексы) и Tuning Mode (Режим настройки). Опция режимов настройки Tuning Mode задает глубину анализа, выполняемого мастером. Сбросив установленный по умолчанию флажок Keep All Existing Indexes (Не изменять существующие индексы), вы позволите мастеру выдавать рекомендации относительно индексов, которые не играют роли для выбранной рабочей нагрузки. Следует проявлять осторожность этой опцией, поскольку, несмотря на то, что индексы могут и не вовлекаться в анализируемую рабочую нагрузку, они существенно сказываются на производительности некоторых других запросов, не затрагиваемых в тестировании.
После того как мастер закончит анализ, вам представляется несколько возможностей выполнения рекомендаций: выполнить их немедленно, составить расписание их выполнения в будущем, или записать их в SQL-сценарий для последующего выполнения.
Используйте мастер Index Tuning Wizard для настройки базы данных

увеличить изображение


увеличить изображение






Клиентская статистика
Последней утилитой для анализа запросов, предоставляемой окном Query (Запрос) Query Analyzer является панель клиентской статистики Client Statistics Pane, которая отображает выполнение запроса на стороне клиента.
Информация в панели клиентской статистики Client Statistics Pane делится на три раздела: Application Profile Statistics, в котором содержится информация о количестве выполненных операторов Transact-SQL и выполненных строках; Network Statistics, в котором содержится информация о сформированном трафике сети; Time Statistics, который помогает вам определить где происходит замедление: на клиенте или на сервере.
Совет. Раздел статистика сети Network Statistics, обеспечиваемая панелью клиентской статистики Client Statistics Pane, будет присутствовать, даже если вы подключены к локальному серверу.
Отобразите клиентскую статистику
SELECT PlantParts.PlantPart, Count(Oils.OilName) AS NumberOfOils FROM Oils INNER JOIN PlantParts On Oils.PlantPartID = PlantParts.PlantPartID GROUP BY PlantParts.PlantPart

увеличить изображение
в панели инструментов анализатора запросов Query Analyzer, чтобы еще раз выполнить запрос.
Планы выполнения
Панель планов выполнения Execution Plan Pane окна Query (Запрос) графически отображает последовательность выполнения вашего запроса SQL Server. На рис. 23.1 представлен план выполнения для простого оператора SELECT:
SELECT OilName, LatinName FROM Oils ORDER BY LatinName

увеличить изображение
Рис. 23.1. Панель плана выполнения Execution Plan Pane окна Query (Запрос).
Совет. Информация, отображаемая в панели плана выполнения Execution Plan Pane, идентична тексту, отображаемому опцией SHOWPLAN базы данных, которая хорошо известна пользователям предыдущих версий SQL Server и все еще присутствует в SQL Server 2000. Если оператор SET SHOWPLAN_ALL ON выполняется как часть сценария в окне Query (Запрос), то результаты будут отображаться в панели сетки Grids Pane. Панель Execution Plan Pane отображает информацию в формате, который понятен большинству людей.
Панель Execution Plan Pane использует довольно большое количество значков для представления операций, которые может выполнить обработчик запросов. Значки описаны в документации SQL Server Books Online, но нет большой необходимости изучать их. Просто наведите курсор мыши на значок и удерживайте некоторое время на нем, после чего отобразится окно подсказки, описывающее не только действие, представляемое значком, но и некоторый объем полезной информации, такой как цена выполнения ввода/вывода I/O, цена загрузки процессора, число строк в операции и итоговая цена операции. Рис. 23.2 показывает окно подсказки для плана выполнения операции кластерного индексного сканирования Clustered Index Scan, представленного на рис. 23.1.

увеличить изображение
Рис. 23.2. Окно подсказки для операции Clustered Index Scan.
Операции в плане выполнения исполняются слева направо. Окно подсказки для каждой стрелки, соединяющей операции, показывает число строк, выполненных в предыдущей операции и расчетный размер каждой строки, как показано на рис. 23.3.

увеличить изображение
Рис. 23.3. Окно подсказки для соединительных стрелок.
Помимо отображения операций, которые SQL Server будет исполнять при выполнении определенного запроса, план выполнения также предоставляет механизм для оптимизации запроса. Используя контекстное меню панели плана выполнения Execution Plan Pane, вы можете обновлять статистику, используемую оптимизатором запросов при определении стратегии выполнения, и добавлять индексы для оптимизации производительности.

увеличить изображение
Примечание. Во время выполнения запроса панель Execution Plan Pane не отображается.

Query Analyzer выполнит запрос и отобразит результаты в панели сетки Grids Pane.

увеличить изображение

увеличить изображение
Добавьте индекс в панели Execution Plan Pane
. Если в итоге значение для этой операции будет составлять 63%, нам следует по возможности ее оптимизировать.



в панели инструментов анализатора запросов Query Analyzer, чтобы еще раз выполнить запрос.
увеличить изображение
Трассировка сервера
Вторая утилита Query Analyzer предоставляет возможности анализа производительности запроса через трассировку сервера. Панель Trace Pane показывает команды, которые выполняются на сервере во время исполнения запроса. Команды не соответствуют операциям в плане выполнения – ряд команд выполняется дополнительно, а реальные команды Transact-SQL не будут показаны столь же детально.
Совет. SQL Server 2000 также предоставляет другое средство для выполнения трассировки сервера - SQL Profiler. Утилиту SQL Profiler мы не будем рассматривать в этом курсе.
Отобразите трассировку сервера
SELECT PlantParts.PlantPart, Count(Oils.OilName) AS NumberOfOils FROM Oils INNER JOIN PlantParts On Oils.PlantPartID = PlantParts.PlantPartID GROUP BY PlantParts.PlantPart

увеличить изображение


увеличить изображение
Арифметические операции
Transact-SQL предоставляет операции для выполнения основных арифметических действий. Соответствующие операторы показаны в таблице 24.4. Эти операторы в точности выполняют то, что они обозначают. Только один оператор может оказаться для вас незнакомым, это арифметический модуль (modulo), который возвращает целую часть (целое число) остатка от деления. Например, результатом выражения 16 % 3 будет 1, а не 5 1/3.
| + | Сложение. |
| - | Вычитание. |
| * | Умножение. |
| / | Деление. |
| % | Остаток от деления. |
| + | Положительное число. |
| - | Отрицательное число. |
Используйте арифметические операции в операторе SELECT
Query Analyzer откроет пустое окно Query (Запрос).
Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

Query Analyzer отобразит результаты в панели сетки Grids Pane.
Другие операции
Transact-SQL предоставляет еще две полезных операции, которые описаны в таблице 24.8. В уроке 12 мы уже использовали операцию конкатенации строк +. Операция конкатенации прибавляет содержимое одной строки к другой.
Операция присвоения =, присваивает значение, стоящее справа от, оператора значению, стоящему слева от оператора. Учтите, что здесь порядок отличается от того, который вы изучали в школе: не "a+b=c", а "c=a+b". Мы будем использовать операцию присвоения далее в этом уроке при изучении переменных.
| + | Конкатенация строк. |
| = | Присвоение. |
Используйте операцию конкатенацию в операторе SELECT
Query Analyzer откроет пустое окно Query (Запрос).
Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла сценария).

Query Analyzer отобразит результаты в панели сетки Grids Pane.
Функции агрегирования
Функции агрегирования, представленные в таблице 24.11, принимают в качестве параметра коллекцию значений и возвращают одиночное значение.
| AVG | Возвращает среднее значение из коллекции, игнорируя нулевые (NULL) значения. |
| COUNT | Возвращает количество значений в коллекции, включая и нулевые. |
| MAX | Возвращает наибольшее значение из коллекции. |
| MIN | Возвращает наименьшее значение из коллекции. |
| SUM | Возвращает сумму значений из коллекции, игнорируя нулевые значения. |
| STDEV | Возвращает стандартное статистическое отклонение для каждого из значений в коллекции. |
| STDEVP | Возвращает стандартное статистическое отклонение все совокупности значений в коллекции. |
| VAR | Возвращает статистическую вариацию значений в группе. |
| VARP | Возвращает статистическую вариацию всех значений в коллекции. |
Используйте функции агрегирования
Query Analyzer откроет пустое окно Query (Запрос).
Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

Query Analyzer отобразит результаты в панели сетки Grids Pane.
Функции безопасности
Функции безопасности, представленные в таблице 24.13, возвращают информацию о привилегиях безопасности, имеющихся для пользователей и ролей.
| HAS_DBACCESS | database_name | Показывает, имеет ли текущий пользователь доступ к базе данных database_name. |
| IS_MEMBER | group_or_role | Показывает, имеет ли текущий пользователь членство в группе или роли group_or_role. |
| IS_SRVROLEMEMBER | role [, login] | Показывает, имеет ли текущая или указанная учетная запись login членство в роли role. |
| SUSER_SID | [login] | Для текущей или указанной учетной записи login возвращает идентификационный номер безопасности (SID). |
| SUSER_SNAME | [] | Возвращает имя учетной записи по ее идентификационному номеру безопасности SID. |
| USER_ID | [user] | Возвращает идентификационный номер текущего или указанного пользователя user. |
| USER | Возвращает имя текущего пользователя базы данных. |
Используйте функции безопасности
Query Analyzer откроет пустое окно Query (Запрос).
Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

Query Analyzer отобразит результаты в панели сетки Grids Pane.
Функции даты и времени
Функции даты и времени принимают в качестве входных значений дату и время и возвращают либо строковые, числовые значения, либо значения в формате даты и времени. (Помните, что в SQL Server, время считается компонентом типа данных datetime). Параметр единицы, фигурирующий во многих функциях, обычно обозначает единицы измерения времени, например такие, как "год" или "минута". В таблице 24.9 представлены функции даты и времени Transact-SQL.
| DATEADD | единицы, число, дата | Рассчитывает новую дату, добавляя к существующей указанное число единиц (дней, месяцев, часов и т.д.). |
| DATEDIFF | единицы, нач_дата, кон_дата | Возвращает количество единиц времени, между двумя указанными датами. |
| DATENAME | единицы, дата | Возвращает имя указанной единицы времени даты в виде строки. |
| DATEPART | единицы, дата | Возвращает имя указанной единицы времени даты в виде числа. |
| DAY | дата | Возвращает день для указанной даты в виде числа. |
| GETDATE | Возвращает текущее системное время и дату. | |
| MONTH | дата | Возвращает месяц для указанной даты в виде числа. |
| YEAR | дата | Возвращает год для указанной даты в виде числа. |
Используйте функции даты
Query Analyzer откроет пустое окно Query (Запрос).
Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла сценария).

Query Analyzer отобразит результаты в панели сетки Grids Pane.
Функции метаданных
Функции метаданных возвращают информацию о данных, а не сами данные. Имеется очень большое количество функций метаданных. В таблице 24.12 представлен перечень наиболее часто используемых функций метаданных.
| COL_LENGTH | table, column | Возвращает количество байт столбца column. |
| COL_NAME | tableID, columnId | Возвращает имя columnID. |
| COLUMNPROPERTY | ID, column, property | Возвращает информацию о свойстве property столбца column. |
| DATABASEPROPERTY | database, property | Возвращает значение свойства property. |
| DB_ID | database_name | Возвращает идентификационный номер базы данных Database_name. |
| DB_NAME | databaseID | Возвращает имя базы данных по идентификатору databaseID. |
| INDEX_COL | table, indexID, keyed | Возвращает имя индексированного столбца по идентификаторам indexID и keyID. |
| INDEXPROPERTY | tableID, index, property | Возвращает информацию о свойстве property индекса index. |
| OBJECT_ID | object | Возвращает идентификационный номер объекта object базы данных. |
| OBJECT_NAME | objectID | Возвращает имя объекта по его идентификационному номеру objectID. |
| OBJECTPROPERTY | ID, property | Возвращает информацию о свойстве property объекта по его идентификационному номеру ID. |
| SQL_VARIANT_PROPERTY | SQL_variant, property | Возвращает указанное свойство property варианта Sql_variant. |
| TYPEPROPERTY | datatype, property | Возвращает информацию о свойстве property для типа данных datatype. |
Используйте функции метаданных
Query Analyzer откроет пустое окно Query (Запрос).
Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

Query Analyzer отобразит результаты в панели сетки Grids Pane.
Команды Transact-SQL
В основе языка Transact-SQL лежат команды: "стержневые" операторы, описывающие фундаментальные операции, которые может выполнить язык.
Зарезервированные слова
Зарезервированное слово – это одно из средств, используемых языком Transact-SQL. Если вы используете зарезервированное слово как идентификатор, например, в качестве имени столбца, вы должны окружить это имя специальными символами, называемыми ограничителями (delimiters). В Microsoft SQL Server ограничительными символами являются [ и ]. Например, если вы используете SELECT в качестве имени столбца, вы должны при ссылке на этот столбец в запросе указать [SELECT], чтобы SQL Server воспринял это как идентификатор. (По возможности старайтесь избегать использования зарезервированных слов в качестве идентификаторов.)
То, что мы называем командой, в документации SQL Server Books Online обозначается как "зарезервированные ключевые слова" (reserved keywords). Этот термин не очень удачен, поскольку нет большого различия между "зарезервированные ключевые слова" и любым другим зарезервированным словом. По этой причине мы будем использовать термин команда (command), который означает определенный набор зарезервированных ключевых слов, которые представляют действия, выполняемые SQL Server.
Принимая во внимание сложность приложений, которые могут быть созданы с помощью Transact-SQL, вам будет весьма удивительно узнать, что язык состоит всего из нескольких команд, со многими из которых мы уже познакомились.
Изучать команды Transact-SQL будет намного проще, если разделить их на группы по типу выполняемых действий, например таких, как манипулирование данными в таблице или представлении, или управление операционным окружением SQL Server.
Мы уже использовали команды Transact-SQL. Например, вводили их в панели редактирования Editor Pane окна Query (Запрос) анализатора запросов Query Analyzer, а также в панели SQL Pane конструктора запросов Query Designer в Enterprise Manager. Кроме того, мы использовали их косвенно применяя утилиты, которые выполняют команды Transact-SQL "за сценой". Конструктор таблиц Table Designer в Enterprise Manager, например, формирует операторы CREATE и ALTER, основываясь на заданных вами параметрах.
Общение с SQL Server
Большинство приложений баз данных используют традиционный язык программирования, такой как Microsoft Visual Basic, для создания интерактивного интерфейса с SQL Server. Используя средства интерфейса, предоставляемые языком, эти приложения представляют данные пользователям в удобной и "дружественной" форме. "За сценой" же они, тем не менее, используют команды Transact-SQL. Как Enterprise Manager, так и анализатор запросов Query Analyzer в SQL Server как раз и являются приложениями для работы с базами данных, которые выполняют эту задачу.
Когда вы используете обычные языки программирования, язык сам определяет, как исполнить команды. Некоторые окружения, например такие, как Microsoft Access, предоставляют интерактивные программные инструменты, схожие с Enterprise Manager и Query Analyzer. Другие, такие как Visual Basic или Microsoft Visual C++, используют объектную модель типа ADO для взаимодействия с сервером.
Логические операции
Как и операции сравнения, логические операции возвращают булевые значения "истина" (TRUE) или "ложь" (FALSE), но их использование ограничивается сравнением булевых значений. В таблице 24.6 представлены три логических оператора, поддерживаемых SQL Server.
| AND | TRUE, если оба значения есть TRUE. |
| NOT | Инвертирует значения булевого оператора. |
| OR | TRUE, если хотя бы один из операторов есть TRUE. |
Используйте логические операции в операторе SELECT
Query Analyzer откроет пустое окно Query (Запрос).
Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла сценария).

Query Analyzer отобразит результаты в панели сетки Grids Pane.
Математические функции
Математические функции, представленные в таблице 24.10, выполняют числовые вычисления.
| ABS | numeric_expression | Возвращает абсолютное значение выражения numeric_expression. |
| ACOS | float_expression | Возвращает арккосинус выражения float_expression. |
| ASIN | float_expression | Возвращает арксинус выражения float_expression. |
| ATAN | float_expression | Возвращает арктангенс выражения float_expression. |
| ATN2 | float_expression, float_expression | Возвращает угол в радианах, тангенс которого находится между двумя значениями float_expression. |
| CEILING | numeric_expression | Возвращает ближайшее число, большее или равное выражению numeric_expression. |
| COS | float_expression | Возвращает тригонометрический косинус выражения float_expression. |
| COT | float_expression | Возвращает тригонометрический котангенс выражения float_expression. |
| DEGREES | numeric_expression | Данный угол numeric_expression в радианах возвращает в градусах. |
| EXP | float_expression | Возвращает экспоненциальное значение выражения float_expression. |
| FLOOR | numeric_expression | Возвращает ближайшее число, меньшее или равное выражению numeric_expression. |
| LOG | float_expression | Возвращает натуральный логарифм выражения float_expression. |
| LOG10 | float_expression | Возвращает десятичный логарифм выражения float_expression. |
| PI | Возвращает значение константы pi. | |
| POWER | numeric_expression, y | Возвращает значение выражения numeric_expression, возведенное в степень y. |
| RADIANS | numeric_expression | Данный угол numeric_expression в градусах возвращает угол в радианах. |
| RAND | [seed] | Возвращает случайное значение в интервале от 0 до 1. |
| ROUND | numeric_expression, lenght | Возвращает округленное с указанной точностью значение выражения numeric_expression. |
| SIGN | float_expression | Возвращает +1, если numeric_expression положительно, 0 если numeric_expression ноль, и -1 если numeric_expression отрицательно. |
| SIN | float_expression | Возвращает тригонометрический синус даваемого в радианах угла float_expression. |
| SQUARE | float_expression | Возвращает квадрат float_expression. |
| SQRT | float_expression | Возвращает квадратный корень из float_expression. |
| TAN | float_expression | Возвращает тангенс выражения float_expression. |
Используйте математические функции
Query Analyzer откроет пустое окно Query (Запрос).
Query Analyzer отобразит диалоговое окно Open Query File (Открыть файл запроса).

Query Analyzer отобразит результаты в панели сетки Grids Pane.
Операции сравнения
В уроке 13 мы уже рассматривали использование операций сравнения при конструировании фразы WHERE. Соответствующие операторы отображены в таблице 24.5. Операторы сравнения возвращает булевые значения "истина" (TRUE) или "ложь" (FALSE).
| = | Равно |
| > | Больше |
| < | Меньше |
| >= | Больше или равно |
| <= | Меньше или равно |
| <> | Не равно |
Используйте операции сравнения в фразе CLAUSE
Query Analyzer откроет пустое окно Query (Запрос).
Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла сценария).

Query Analyzer отобразит результаты в панели сетки Grids Pane.
Побитные операции
Выполнение побитных операций очень схоже с выполнением логических операций, но в то время как логические операции возвращают результаты, основанные на булевых значениях, побитные операции работают на битовом уровне с числовыми значениями. Побитные операции представлены в таблице 24.7.
Побитные операторы $ и | работают так же, как и их логические собратья, за исключением того, что они сравнивают каждый бит двух значений, а не два значения целиком.
Оператор ^ не имеет соответствующего логического эквивалента. В булевой алгебре, булевое OR (ИЛИ) возвращает TRUE (истина), если хотя бы одно или оба значения есть TRUE (истина). Однако булевое исключающее OR (ИЛИ) возвращает TRUE(истина), если одно, но не оба сравниваемых значения есть TRUE (истина). То же самое делает и оператор ^, который возвращает TRUE(истина), только если одно, но не оба сравниваемых бита есть TRUE (истина).
| & | Побитное AND (И). |
| | | Побитное OR (ИЛИ). |
| ^ | Побитное исключающее OR (ИЛИ). |
| ~ | Побитное NOT. |
Битовое представление
Побитные операции выполняются над целочисленными значениями, использующими каждый бит в числе для указания отдельного свойства или атрибута – эта техника названа битовом представлением (bit packing). По определению, если одно целочисленное число используется для хранения множества свойств, значение не является скалярным и таблица не будет соответствовать нормальной форме.
При данных обстоятельствах вы должны избегать использования битового представления в соответствующей базе данных. Однако битовое представление будет незаменимо при использовании наследуемых данных, и побитные операции будут в данной ситуации весьма удобны.
Используйте побитные операции в операторе SELECT
Query Analyzer откроет пустое окно Query (Запрос).
Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

Query Analyzer отобразит результаты в панели сетки Grids Pane.
Системные функции
Системные функции возвращают информацию об окружении SQL Server. Так же, как и функций метаданных, системных функций очень много и все они доступны через панель Object Browser. В таблице 24.15 представлены основные системные функции.
| APP_NAME | Возвращает имя приложения. | |
| DATALENGHT | выражение | Возвращает количество байт, используемых для хранения выражения. |
| ISDATE | выражение | Определяет, корректно ли данное выражение. |
| ISNULL | выражение | Определяет, является ли данное выражение нулем. |
| ISNUMERIC | выражение | Определяет, является ли данное выражение числом. |
| NEWID | Создает новый уникальный идентификационный номер uniqueidentifier. | |
| NULLIF | выражение, выражение | Возвращает NULL, если первое и второе выражение одинаковы. |
| PARSENAME | object_name, name_part | Возвращает часть имени name_part объекта object_name. |
| SYSTEM_USER | Возвращает текущее имя пользователя системы. | |
| USER_NAME | [id] | Возвращает имя текущего пользователя или пользователя по указанному id. |
Используйте системные функции
Query Analyzer откроет пустое окно Query (Запрос).
Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

Query Analyzer отобразит результаты в панели сетки Grids Pane.
Строковые функции
Строковые функции выполняют операции со строковыми значениями и возвращают либо строковые, либо числовые значения. В таблице 24.14 представлен список основных строковых функций.
| ASCII | char_expression | Возвращает ASCII-код самого левого символа в строке char_expression. |
| CHAR | integer_expression | Возвращает ASCII-символ, код которого равен integer_expression. |
| CHARINDEX | char_expression, char_expression [, start_position] | Возвращает позицию первого выражения char_expression во втором выражении char_expression. |
| LEFT | char_expression, integer_expression | Возвращает крайние слева символы integer_expression в выражении char_expression. |
| LEN | char_expression | Возвращает количество символов в выражении char_expression. |
| LOWER | char_expression | Возвращает выражение char_expression, в котором все символы приведены к нижнему регистру. |
| LTRIM | char_expression | Возвращает выражение char_expression с удаленными начальными пробелами. |
| NCHAR | integer_expression | Возвращает символ UNICODE, код которого задает integer_expression. |
| REPLACE | char_expression, char_expression, char_expression | Находит все вхождения второй строки char_expression в первую char_expression и заменяет их на третью char_expression. |
| RIGHT | char_expression, integer_expression | Возвращает крайние справа символы integer_expression в строке char_expression. |
| RTRIM | char_expression | Возвращает строку char_expression с удаленными конечными пробелами. |
| SOUNDEX | char_expression | Возвращает четырехзначный код SOUNDEX для char_expression. |
| SPACE | integer_expression | Возвращает число integer_expression пробелов. |
| SUBSTRING | char_expression start, lenght | Возвращает подстроку char_expression указанной длины lenght, начиная с символа start. |
| UNICODE | unicode_expression | Возвращает значение UNICODE для первого символа в unicode_expression. |
| UPPER | char_expression | Возвращает выражение char_expression, в котором все символы приведены к верхнему регистру. |
Используйте строковые функции
Query Analyzer откроет пустое окно Query (Запрос).
Query Analyzer отобразит диалоговое окно Open Query File (Открыие файла запроса).

Query Analyzer отобразит результаты в панели сетки Grids Pane.
увеличить изображение
Глобальные переменные
Глобальные переменные обозначаются двойным символом @ (@@VERSION) и предоставляются программой SQL Server. Они не могут создаваться пользователем. Большинство глобальных переменных предоставляет информацию о текущем статусе SQL Server. Они все представлены в панели Object Browser в папке Common Functions.
Переменные конфигурирования
Наиболее часто используемые переменные конфигурирования приведены в таблице 25.1. Они предоставляют информацию о текущих установках различных свойств и параметров SQL Server.
| @@CONNECTIONS | Число соединений или попыток соединения с момента последнего запуска сервера. |
| @@DATEFIRST | Возвращает число, обозначающее день недели (Monday=1, Sunday=7). |
| @@DBTS | Последнее значение колонки с отметкой времени, вставленной в базу данных. |
| @@LANGID | Идентификатор локального языка, использующегося в данный момент. |
| @@LANGUAGE | Название текущего языка. |
| @@OPTIONS | Возвращает значение текущей опции SET. |
| @@SERVERNAME | Имя локального сервера. |
| @@VERSION | Дата, версия и тип процессора текущей инсталляции. |
Статистические переменные
Статистические переменные предоставляют информацию о процессах, выполненных SQL Server с момента последнего запуска. Основные переменные показаны в таблице 25.2.
| @@CPU_BUSY | Время, потраченное процессором на работу с момента последнего запуска сервера. |
| @@IDLE | Время, бездействия SQL Server с момента последнего запуска сервера. |
| @@IO_BUSY | Время, которое потратил SQL Server на выполнение операций ввода и вывода с момента последнего запуска сервера. |
| @@TOTAL_ERRORS | Число ошибок чтения/записи диска с момента последнего запуска сервера. |
| @@TOTAL_READ | Число выполненных сервером операций чтения с диска с момента последнего запуска сервера. |
| @@TOTAL_WRITE | Число выполненных сервером операций записи на диск с момента последнего запуска сервера. |
Системные переменные
Системные переменные показаны в таблице 25.3. Они предоставляют информацию о последних операциях с таблицами, выполненных сервером.
| @@IDENTITY | Последнее значение идентификационной колонки, вставленной в базу данных. |
| @@ROWCOUNT | Количество строк, подвергшихся воздействию последнего оператора. |
Использование переменных
Переменные могут использоваться во всех выражениях языка Transact-SQL. Однако, они не используются вместо имени объекта или ключевого слова. Таким образом, представленные ниже операторы будут корректными:
DECLARE @theOil char(20) SET @theOil = 'Basil'
-- Эта команда будет выполнена SELECT OilName, Description FROM Oils WHERE OilName = @theOil Однако оба следующих оператора SELECT не будут выполнены: DECLARE @theCommand char(10), @theField char(10) SET @theCommand = 'SELECT' SET @theField = 'OilName'
-- Эта команда не будет выполнена @theCommand * FROM Oils
-- Как и эта SELECT @theField from Oils
Объявите локальную переменную
Query Analyzer откроет новое окно Query (Запрос).
Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

Query Analyzer выполнит сценарий и отобразит результат.
Используйте оператор SELECT для присвоения значений

Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

Query Analyzer выполнит сценарий и отобразит результат.


Query Analyzer выполнит сценарий и отобразит результат.
Используйте глобальные переменные для отображения информации о сервере

Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

Query Analyzer выполнит сценарий и отобразит результат.
Использование временных таблиц
Временные таблицы создаются с помощью таких же команд, как и обычные таблицы: CREATE или SELECT INTO. Предоставляемая таблица является доступной для соединения (т. е., она не считается локальной таблицей, созданной другим соединением), и она может использоваться точно так же, как и обычная таблица.
Создайте локальную временную таблицу

Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

Query Analyzer создаст временную таблицу.
увеличить изображение

увеличить изображение

увеличить изображение
Используйте локальную временную таблицу из текущего сеанса

Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

Query Analyzer выполнит оператор SELECT.
Используйте глобальную временную таблицу из текущего сеанса

Query Analyzer отобразит диалоговое окно Open Query File (Открытие файл сценария).

Query Analyzer выполнит оператор SELECT.
Используйте локальную временную таблицу из другого сеанса
Query Analyzer откроет новое окно Query (Запрос).
Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

Поскольку локальная временная таблица не доступна в новом сеансе запроса, анализатор запросов Query Analyzer отобразит сообщение об ошибке.
Используйте глобальную временную таблицу из другого сеанса
Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

Поскольку глобальная временная таблица доступна в новом сеансе запроса, анализатор запросов Query Analyzer отобразит результат.
Понятие о переменных
Переменные обозначаются префиксом @; например @MyVariable. Как и временные таблицы, переменные имеют две области действия: локальную и глобальную. Глобальные переменные обозначаются двойным символом @: @@VERSION.
Имеется несколько различий между переменными и временными таблицами. Все глобальные переменные определяются SQL Server; вы не можете определить их самостоятельно. Кроме того, область действия локальных переменных еще уже, чем у локальных таблиц: они доступны только в пределах пакета или процедуры, в которой они объявлены.
Локальные переменные
Локальные переменные создаются с помощью оператора DECLARE, который имеет следующий синтаксис:
DECLARE @локальная_переменная тип_данных
Идентификатор локальная_переменная должен соответствовать обычным правилам, действующим для идентификаторов базы данных; тип_данных может быть любым системным типом данных, исключая text, ntext или image. С помощью одного оператора DECLARE может быть создано несколько локальных переменных. Для этого переменные нужно указывать через запятую:
DECLARE @var1 int, @var2 int
Большинство типов данных являются скалярными (scalar); то есть они содержат одно значение, такое как число или строка. Возможность объявления перемененных с табличным типом данных, является новшеством в SQL Server 2000. Синтаксис для создания переменной табличного типа показан ниже:
DECLARE @локкальная_переменная Table ({определение_таблицы})
В этом примере, определение_таблицы идентично обычному определению CREATE TABLE, за исключением того, что разрешается использование лишь следующих ограничений: PRIMARY KEY, UNIQUE KEY, NULL и CHECK.
Совет. Другим полезным типом данных для переменных является sql_variant. Переменные типа варианты могут содержать любой тип данных. Это позволяет вам назначать различные типы данных одной локальной переменной в ходе выполнения процедуры.
После создания, локальная переменная первоначально имеет значение NULL. Вы можете присвоить переменной значение следующими способами:
SET @myCharVariable = 'Hello, World'
SELECT @myCharVariable = 'Hello, World'
SELECT @myCharVariable = MAX (OilName) FROM Oils
INSERT INTO @myTableVariable SELECT * FROM Oils
Обратите внимание, что в третьем случае (SELECT с другим SELECT) оператор присвоения (=) замещает второе ключевое слово в SELECT; оно второй раз не повторяется. Последний пример демонстрирует синтаксис INSERT INTO...SELECT команды INSERT INTO. Вы также можете использовать синтаксис INSERT INTO...VALUES:
INSERT INTO @myTableVariable VALUES ('The Value')
CASE
В большинстве языков программирования оператор CASE является расширенной формой оператора IF, которая позволяет вам определять множество булевых выражений в одном операторе. В SQL Server CASE является функцией, а не командой. Она используется не сама по себе, как IF. а как часть оператора SELECT или UPDATE.
Операторы, включающие в себя структуру CASE, могут использовать одну из двух синтаксических форм, в зависимости от того, будет ли изменяться оцениваемое выражение. Простейшая форма в предположении, что всегда будет оцениваться булево выражение, имеет следующий вид:
значение = выражение
Значение может быть сколь угодно сложным. Вы можете использовать константу, имя столбца, или составное выражение, если необходимо. В качестве оператора сравнения всегда используется равенство. Синтаксис простой структуры CASE представлен ниже:
CASE значение WHEN выражение_один THEN результирующее_выражение_один WHEN выражение_два THEN результирующее_выражение_два . . . WHEN выражение_n THEN результирующее_выражение_n [ELSE альтернативное_результирующее_выражение] END
В этой форме функции CASE, выражение результирующее_выражение возвращается, только в том случае, если выражение, следующее за ключевым словом WHEN, логически равно указанному значению. Вы можете использовать в выражение любое количество фраз WHEN. Фраза ELSE необязательна – она выполняется, только если все фразы WHEN оцениваются как FALSE.
Сравнение одного значения с некоторым количеством других значений является типичной задачей, но иногда вам требуется большая степень гибкости. В это случае вы можете воспользоваться так называемым поисковым синтаксисом функции CASE Transact-SQL, который имеет следующий вид:
CASE WHEN булево_выражение_один THEN результирующее_выражение_один WHEN булево_выражение_два THEN результирующее_выражение_два . . . WHEN булево_выражение_n THEN результирующее_выражение_n [ELSE альтернативное_результирующее_выражение] END
В этой форме CASE вы можете указать целое булево выражение в каждой фразе WHEN вместо неявного сравнения выражения в простой форме. Учтите, что при определении истинности можно оценивать несколько булевых_выражений. Transact-SQL возвратит только первое результирующее_выражение, а затем перейдет к оператору, следующему за END.
Используйте простую структуру CASE
Query Analyzer очистит окно.
Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла сценария).

Query Analyzer отобразит результат выполнения запроса.


Query Analyzer отобразит результат выполнения запроса.
Используйте поисковую форму структуры CASE
Query Analyzer очистит окно.
Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

Query Analyzer отобразит результат выполнения запроса. Обратите внимание, что хотя третья запись, содержащая в качестве значения поля OilName 'Bergamot', отвечает условию для второй фразы WHEN (LEFT(LatinName,1) = 'C'), она возвращает в качестве значения поля TestResults 'Name B', поскольку она отвечает и первому булевому выражению.
IF...ELSE
Оператор IF, является простейшим из набора команд управления ходом выполнения. Если булево выражение, следующее за командой IF, имеет значение TRUE, то будет выполнен оператор или блок операторов, следующий за этим. Если булево выражение имеет значение FALSE, то оператор или блок операторов, следующий за этим, будет пропущен.
Необязательная команда ELSE позволяет вам задавать оператор или блок операторов, который будет выполняться, только если булево выражение имеет значение FALSE. Например, команды Transact-SQL, представляемые ниже, возвращают 'Истина', если @test имеет значение "истина", и 'Ложь', если нет.
IF @test SELECT 'Истина' ELSE SELECT 'Ложь'
Совет. Операторы IF...ELSE могут быть вложены один в другой, образуя логическую структуру, схожую с конструкцией IF...ELSEIF...ELSE, принятой в других языках программирования. Однако следует остерегаться использовать этот прием в простых случаях. Тот же эффект можно достичь путем использования оператора CASE, который мы рассмотрим далее. При этом оценить ход выполнения будет легче.
Используйте структуру IF...ELSE для управления выполнением

Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).


Совет. Этот сценарий использует команду PRINT для отображения сообщений на вкладке Messages (Сообщения) окна запроса Query. Команда PRINT полезна, когда вы впервые разрабатываете сценарий, в реальных же приложениях вы редко будете ее использовать.
Query Analyzer выполнит запрос и отобразит панель сетки Grids Pane.

Команда GOTO
Структуры IF...ELSE и CASE управляют порядком выполнения операторов, основываясь на результатах вычисления булевого выражения. Команда GOTO является безусловной. Она передает выполнение непосредственно к оператору, следующему после метки, которая на него указывает.
В SQL Server метки являются неисполняемыми операторами, имеющими следующий синтаксис:
имя_метки:
Имя метки должно удовлетворять правилам, принятым для идентификаторов. Сама команда GOTO имеет очень простой синтаксис:
GOTO имя_метки
Код "спагетти"
GOTO является весьма непопулярной в кругу программистов командой. По большому счету это связано с историческими причинами: ранние языки предоставляли очень мало механизмов управления ходом выполнения – обычно только структуру IF и команду GOTO. Как следствие, создаваемый код оказывался очень сложным для восприятия и анализа. Подобный код получил название "спагетти".
Применение команды GOTO, тем не менее, бывает вполне оправданным, особенно при обработке ошибок. Если вы будете аккуратно использовать эту команду, она даже сможет сделать код проще для понимания. Следует всего лишь следить, что вы использовали команду GOTO для выполнения задач, которые могут быть более просто выражены через другие команды или функции передачи управления.
Используйте команду GOTO для безусловного перехода
Query Analyzer очистит окно.
Query Analyzer отобразит диалоговое окно Open Query File (Открыть файл запроса).

Query Analyzer отобразит результат запроса.
Простой цикл WHILE
Простейшая форма цикла WHILE содержит булево выражение и оператор или блок операторов. Операторы будут повторяться, пока булево выражение не примет FALSE. Если при первой оценке булево выражение имеет значение FALSE, то оператор или блок операторов не будет выполняться вообще.
Используйте простой цикл WHILE
Query Analyzer очистит окно.
Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

Query Analyzer отобразит результат запроса.
Сложные циклы WHILE
Синтаксис оператора WHILE также позволяет вам осуществлять и более сложную логику выполнения, в отличие от простой логики в предыдущем примере. Фраза BREAK вызывает выход из цикла; выполнение продолжается с оператора, следующего за фразой END блока оператора структуры WHILE. Фраза CONTINUE возвращает выполнение на начало цикла, при этом операторы, следующие за CONTINUE в пределах блока операторов, будут пропущены. Оба оператора, BREAK и CONTINUE, обычно выполняются как условные в пределах оператора IF.
Если вам потребуется, вы можете использовать команды BREAK и CONTINUE в одном и том же операторе WHILE. Вы также можете использовать каждую команду несколько раз внутри блока операторов, хотя при этом будет исполняться только одна задача.
Используйте структуру WHILE...BREAK
Query Analyzer очистит окно.
Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла сценария).

Query Analyzer отобразит результат выполнения запроса.
Манипулирование строками с помощью курсора
Курсоры сами по себе не вызвали бы никакого интереса, если бы вы не могли осуществлять с их помощью определенные действия. Transact-SQL поддерживает три различные команды для работы с курсорами: FETCH, UPDATE и DELETE.
Команда FETCH извлекает указанную строку из множества строк курсора. В своем простейшем варианте команда FETCH имеет следующий синтаксис:
FETCH курсор_или_переменная
В этом формате записи возвращается строка в позиции курсора (текущая строка).
Используйте простую команду FETCH
Query Analyzer откроет новое окно Query (Запрос).
Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

Query Analyzer выполнит запрос.
Совет. Возможно, вы обратили внимание, что этот сценарий выполняется дольше, чем соответствующий оператор SELECT. Дело в том, что создание и открытие курсора требует дополнительного времени. Никогда не используйте курсор, если для выполнения задачи достаточно оператора SELECT.
Команда FETCH может не только возвращать строку непосредственно, но и позволяет сохранять значения из возвращенного столбца в переменных. Чтобы сохранить результаты выполнения команды FETCH в переменной, используйте следующий синтаксис:
FETCH курсор_или_переменная INTO список_переменных
Список_переменных есть перечень разделяемых запятыми идентификаторов переменных. Перед выполнением команды FETCH вы должны объявить переменные. Список_переменных должен содержать переменную для каждого столбца, фигурирующего в операторе SELECT, который определяет курсор. Тип данных переменной должен либо совпадать, либо быть совместимым с типом данных столбца.
Модификация и удаление строк через курсоры
Если ваш курсор является модифицируемым. Изменение исходных значений во множестве курсора выполняется достаточно просто. Предусмотрена специальная форма фразы WHERE, которая поддерживает модификацию через курсор:
UPDATE таблица_или_представление SET список_для_модификации WHERE CURRENT OF курсор_или_переменная
Это называется позиционным обновлением. Transact-SQL также поддерживает позиционное удаление, которое имеет следующую форму записи:
DELETE таблица_или_представление WHERE CURRENT OF курсор_или_переменная
Выполните позиционное обновление
в панели инструмента анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит запрос. Обратите внимание, что отображаются две панели сетки. Первая создается оператором FETCH и содержит начальное содержимое столбцов. Вторая является результатом выполнения оператора SELECT и содержит значение поля Description после модификации.
Мониторинг курсоров Transact-SQL
Transact-SQL предоставляет две глобальные переменные и функцию, которые помогают вам контролировать работу и состояние вашего курсора. Переменная @@CURSOR_ROWS возвращает количество строк во множестве последнего курсора, открытого в соединении. Значения, возвращаемые @@CURSOR_ROWS, представлены в таблице 27.1.
| -m | Курсор заполнен записями не полностью; множество курсора на данный момент содержит m строк. |
| -1 | Курсор является динамическим, и количество строк может варьироваться. |
| 0 | Курсор либо не открыт, а последний открытый курсор был закрыт и освобожден, либо курсор содержит нуль строк. |
| n | Количество строк в курсоре равно n. |
Переменная @@FETCH_STATUS возвращает информацию о выполнении последней команды FETCH. В таблице 27.2 представлены значения, возвращаемые переменной @@FETCH_STATUS.
| 0 | Оператор FETCH был выполнен успешно. |
| -1 | Оператор FETCH был выполнен неудачно. |
| -2 | Извлекаемая строка отсутствует. |
Наконец, Transact-SQL предоставляет функцию CURSOR_STATUS. Эта функция имеет следующий синтаксис:
CURSOR_STATUS(тип, курсор_или_переменная)
Тип может иметь значения 'local', 'global' или 'variable', а курсор_или_переменная – это идентификатор курсора или курсорной переменной, информацию о котором требуется получить. Результаты, возвращаемые функцией CURSOR_STATUS, представлены в таблице 27.3.
| 1 | Если функция вызывалась для динамического курсора, множество курсора состоит из нуля, одной или нескольких строк. Если функция вызывалась для другого типа курсора, курсор состоит по меньшей мере из одной строки. |
| 0 | Множество курсора пусто. |
| -1 | Курсор закрыт. |
| -2 | Возвращается только для курсорной переменной. Либо курсор, назначенный указанной переменной, закрыт, либо переменной не назначен какой-либо курсор. |
| -3 | Указанный курсор или курсорная переменная не существует. |
Используйте функции мониторинга курсором
в панели инструмента анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит запрос. Будет отображено четыре панели сетки. Первая создается оператором SELECT @@CURSOR_ROWS, а вторая – оператором FETCH. Третья панель сетки является результатом выполнения оператора SELECT @@FETCH_STATUS, а четвертая – результатом выполнения оператора SELECT CURSOR_STATUS('local', 'simpleCursor').
Создание курсоров
Первым шагом в использовании курсора является его создание. Курсоры Transact-SQL создаются с помощью оператора DECLARE CURSOR.
Внимание! SQL Server поддерживает два различных метода создания курсоров: с использованием синтаксиса SQL-92 и с использованием синтаксиса Transact-SQL. Синтаксис SQL-92 соответствует стандарту ANSI, но имеет меньшие функциональные возможности, чем синтаксис Transact-SQL, который и рассматривается здесь.
Оператор DECLARE CURSOR имеет следующий синтаксис:
DECLARE имя_курсора CURSOR [видимость] [прокрутка] [тип] [блокировка] [TYPE_WARNING] FOR оператор_выборки [FOR UPDATE [OF имена_столбцов]]
Обратите внимание, что все параметры, определяющие характеристики курсора, – видимость, тип и т.д. – являются необязательными. Значениями по умолчанию для этих параметров являются сложными и могут указывать, либо не указывать способы взаимодействия с исходными записями или представлениями, а также опции работы с базой данных. Чтобы сделать восприятие оператора долее удобным, лучше явно задавать все необходимые вам параметры. При этом вы будете точно знать, что получите.
Видимость курсора определяется с помощью ключевых слов LOCAL или GLOBAL, которые имеют тот же эффект, что и ключевые слова @local_table или @@global_table при объявлении временных таблиц.
Совет. SQL Server будет закрывать и освобождать локальный курсор при выходе за пределы его области действия (видимости), но лучше всегда делать это явно.
Параметр прокрутка допускает использование ключевых слов FORWARD_ONLY и SCROLL, которые задают, соответственно, возможность перемещения только от начала к концу, или в любом направлении.
Параметр тип определяет тип создаваемого курсора. Здесь допустимы ключевые слова STATIC, KEYSET, DYNAMIC и FAST_FORWARD. Параметр типа FAST_FORWARD и параметр прокрутки FORWARD_ONLY являются взаимно исключающими.
Параметр блокировка определяет, могут ли строки модифицироваться курсором, и если да, то могут ли их модифицировать другие пользователи. Если используется ключевое слово READ_ONLY, курсор не может вносить никаких изменений в исходные данные. Тем не менее, другие пользователи могут модифицировать данные, либо это можете делать вы сами с помощью оператора UPDATE. Если в качестве параметра блокировка задано SCROLL_LOCKS, обновления могут быть выполнены только курсором. Все другие операторы UPDATE, как внутри этого же пакета, так и предоставляемые другими пользователями, выполняться не будут.
Последняя опция блокировки, OPTIMISTIC, позволяет осуществлять обновления строк как внутри курсора, так и вне его. Это наиболее гибкая опция, но при этом всегда существует вероятность, что модификация, выполненная курсором, окончится неудачей, если строка была изменена после ее чтения курсором.
Параметр TYPE_WARNING предписывает SQL Server отправлять предупреждающее сообщение клиенту, если тип курсора преобразуется от заданного к другому типу. Это возможно, если вы объявляете курсор, который не поддерживает заданный оператор SELECT.
Параметр оператор_выборки, указываемый в фразе FOR, является обязательным. Он задает строки, которые будут включены во множество курсора.
Фраза FOR UPDATE является необязательной. По умолчанию курсоры являются модифицируемыми, если не задан параметр READ_ONLY, однако и в этом случае лучше все-таки использовать эту фразу, чтобы быть уверенным в полученном результате. Вы можете использовать раздел OF имена_столбцов, чтобы указать определенные строки, для которых вы допускаете модификацию. Если вы опускаете раздел OF имена_столбцов, модификация может быть выполнена для всех столбцов, указанных в операторе SELECT.
DECLARE myCursor CURSOR LOCAL FAST_FORWARD FOR SELECT OilName FROM Oils DECLARE @myCursorVariable CURSOR SET @myCursorVariable = myCursor
Этот синтаксис полезен, если вы хотите создать переменные, которые могут быть назначены различным курсорам. Это может потребоваться, если вы создаете обобщенную процедуру для работы с различными результирующими множествами.
Вы можете объявить курсорную переменную, а затем использовать ее для непосредственного создания курсора.
DECLARE @myCursorVariable CURSOR SET @myCursorVariable = CURSOR LOCAL FAST_FORWARD FOR SELECT OilName FROM Oils
При использовании такого синтаксиса курсор не имеет идентификатора, и ссылка на него может быть осуществлена только через переменную. Подобный синтаксис больше подходит для хранимых процедур, которые мы рассмотрим в уроке 28.
Открытие курсора
Объявление курсора создает объект курсора, но не создает набор записей, которыми курсор будет манипулировать (множество курсора). Множество курсора не создается, пока вы не откроете курсор. После достаточно сложного синтаксиса оператора DECLARE CURSOR, синтаксис оператора кажется вполне прозрачным:
OPEN [GLOBAL] курсор_или_переменная
Ключевое слово GLOBAL помогает избежать конфликтов: если курсор, объявленный с ключевым словом LOCAL, и курсор, объявленный с ключевым словом GLOBAL, имеют одинаковый идентификатор, ссылки на курсор будут по умолчанию отнесены к локальному курсору, если вы не использовали ключевое слово GLOBAL. Как и в других подобных случаях, лучше явно указывать ключевое слово, если вы открываете глобальный курсор.
Закрытие курсора
Закончив использование курсора, вы должны его закрыть. Оператор CLOSE освобождает ресурсы, используемые для обслуживания множества курсора, а также освобождает все блокировки, наложенные на строки, если вы использовали параметр SCROLLOCKS в операторе DECLARE. Синтаксис команды CLOSE почти идентичен синтаксису оператора OPEN – меняется только ключевое слово:
CLOSE [GLOBAL] курсор_или_переменная
Освобождение курсора
Последним оператором в последовательности действий, связанных с созданием курсора, является оператор DEALLOCATE. Синтаксис его также прост:
DEALLOCATE [GLOBAL] курсор_или_переменная
Однако здесь есть одна тонкость: оператор DEALLOCATE удаляет идентификатор или курсорную переменную, но он не обязательно удаляет сам курсор. Сам курсор не удаляется до тех пор, пока все ссылающиеся на него идентификаторы будут либо освобождены, либо перестанут действовать (при выходе за пределы области действия). Рассмотрим следующие примеры:
-- Создание курсора DECLARE myCursor CURSOR KEYSET READ_ONLY FOR SELECT * FROM Oils -- Создание курсорной переменной DECLARE @cursorVariable CURSOR -- Создание множества записей курсора OPEN myCursor -- Назначение переменной курсору SET @cursorVariable = myCursor -- Освобождение курсора DEALLOCATE myCursor
После освобождения курсора идентификатор myCursor больше не ассоциируется с множеством курсора, но поскольку на множество курсора еще ссылается переменная @cursorVariable, курсор и множество курсора не освобождаются. Если вы явно не освободите также и курсорную переменную, курсор и множество курсора будут существовать, пока переменная не утратит свое действие.
Использование хранимых процедур
Для вызова пользовательских и системных хранимых процедур используется оператор EXECUTE. Если хранимая процедура не требует параметров, или если она не возвращает результат, синтаксис ее будет очень простым:
EXECUTE имя_процедуры
Совет. Ключевое слово EXECUTE можно не указывать, если вызов хранимой процедуры является первым оператором в пакете. Однако, как и в других подобных случаях, лучше лишний раз подстраховаться. Поэтому заведите привычку всегда использовать ключевое слово EXECUTE или его аббревиатуру EXEC при использовании хранимой процедуры.
Выполните простую хранимую процедуру
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer откроет новое окно Query (Запрос).
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит хранимую процедуру и отобразит результаты.
увеличить изображение
Внимание! Поскольку процедура sp_help отображает все базы данных, имеющиеся на текущем сервере, ваша структура может не совпадать с той, которая представлена на рисунке. В вашей панели сетки Grid Pane могут содержаться другие базы данных.
Если хранимая процедура принимает входные параметры, вы можете предоставить их, указав позицию или имя. Чтобы предоставит параметры по позиции, вам нужно просто указать их после имени хранимой процедуры, отделяя запятыми:
EXECUTE имя_процедуры параметр [ , параметр ...]
Использование Object Browser для работы с хранимыми процедурами
Панель Object Browser содержит папку Stored Procedures для каждой базы данных, включая главную. Каждая хранимая процедура, содержащаяся в списке, имеет папку Parameters. В этой папке в определенном порядке размещаются параметры хранимой процедуры, поэтому вы можете воспользоваться ею для проверки имен параметров и их позиций.
Для создания сценария EXECUTE для хранимой процедуры вы также можете воспользоваться командами скриптования из контекстного меню. Сценарий EXECUTE в Object Browser создает включения объявлений локальных переменных для возвращаемых значений и выходных параметров.
Выполните хранимую процедуру с входными параметрами
в панели инструментов анализатора запросов Query Analyzer.EXECUTE sp_dboption 'Aromatherapy', 'read only'
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит запрос и отобразит результаты.
Параметры также могут быть переданы хранимой процедуре путем явного указания их имен. При этом от вас потребуется больше усилий при вводе, но зато вы сможете задать параметры в любом порядке. Синтаксис для вызова хранимой процедуры с указанием именованных параметров следующий:
EXECUTE хранимая_процедура @имя_парам = значение [, @имя_парам = значение ...]
Выполните хранимую процедуру с именованными параметрами
в панели инструментов анализатора запросов Query Analyzer. EXECUTE sp_dboption @optname = 'read only', @dbname = 'Aromatherapy'
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит запрос и отобразит результаты.
увеличить изображение
Некоторые хранимые процедуры предоставляют для своих параметров значения по умолчанию. Подобно значениям по умолчанию для столбцов таблицы, параметры по умолчанию используются хранимой процедурой, если пользователь явно не задал значение. Использовать умолчание проще для именованных параметров – вам достаточно не указывать значение для параметра.
Если вы передаете параметры по позициям, обращение к умолчанию параметра зависит от его положения в списке. Если параметр находится в конце списка, или если этот параметр единственный, вы можете просто опустить его (не указывать). Если параметр не является последним параметром в списке, вы можете воспользоваться ключевым словом DEFAULT, чтобы указать хранимой процедуре использовать значение по умолчанию.
Выполните хранимую процедуру с использованием ключевого слова DEFAULT
в панели инструментов анализатора запросов Query Analyzer.EXECUTE sp_dboption DEFAULT; 'read only'
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит запрос и отобразит результаты.
Кроме доступа к переданным им данным, хранимые процедуры могут также возвращать данные обратно через выходные параметры. Выходные параметры должны быть локальными переменными. Они могут быть заданы либо путем указания их имен, либо путем указания их позиций, но при этом после выходного параметра должно следовать ключевое слово OUTPUT.
Выполните хранимую процедуру с выходными параметрами
в панели инструментов анализатора запросов Query Analyzer.
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит сценарий и отобразит результаты.
Синтаксис для хранимой процедуры, возвращающей значения, является неким гибридом оператора EXECUTE и оператора SET:
EXECUTE @имя_переменной = хранимая_процедура [, парам [, парам ...] ]
Большинство системных процедур имеют возвращаемые значения, но поскольку они являются параметрами по умолчанию, их можно игнорировать в описании вызова процедуры. Если вы не указали локальную переменную для приема результатов, SQL Server просто отбросит значение.
Выполните хранимую процедуру с возвращаемым значением
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит запрос и отобразит результаты.

Создание хранимых процедур
Как вы можете догадаться, хранимые процедуры создаются с использованием одной из разновидностей оператора CREATE – на этот раз, CREATE PROCEDURE. Синтаксис оператора CREATE PROCEDURE следующий:
CREATE PROCEDURE имя_процедуры [список_параметров] AS операторы_процедуры
Имя_процедуры должно отвечать правилам, принятым для идентификаторов.
Совет. Вы можете создать временную локальную или глобальную хранимую процедуру, указав перед именем процедуры # или ## соответственно.
Операторы_процедуры, следующие после ключевого слова AS в операторе CREATE, определяют действия, которые будут выполняться при вызове хранимой процедуры. Они по своему функциональному назначению полностью аналогичны сценариям. Фактически можно считать все, что находится перед ключевым словом AS, заголовком SQL-сценария.
Хранимые процедуры могут вызвать другие хранимые процедуры, т. е. реализовывать вложенность. Фактическая глубина вложенности хранимых процедур составляет 32.
Создайте простую хранимую процедуру
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст хранимую процедуру.
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит новое окно Query (Запрос).EXECUTE SimpleSP
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит хранимую процедуру и отобразит результаты.
Каждый из параметров в списке_параметров имеет следующую структуру:
@имя_параметра тип_данных [= значение_по_умолчанию] [OUTPUT]
Имя_параметра должно удовлетворять правилам, принятым для идентификаторов. Имена параметров должны начинаться с символа @, подобно локальным переменным. Параметры являются локальными переменными; они видимы только в пределах хранимой процедуры. В одной хранимой процедуре может быть использовано максимально 2100 параметров.
Значение_по_умолчанию представляет собой значение, которое будет использоваться хранимой процедурой в случае, если пользователь не укажет значение для входного параметра в вызове хранимой процедуры. Ключевое слово OUTPUT, которое также не является обязательным, определяет параметры, которые будут возвращены в вызвавший процедуру сценарий.
Создайте хранимую процедуру с входным параметром
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст хранимую процедуру.
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит новое окно Query (Запрос).EXECUTE InputSP 'Basil'
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит хранимую процедуру и отобразит результаты.
Создайте хранимую процедуру со значением по умолчанию
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст хранимую процедуру.
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит новое окно Query (Запрос).EXECUTE DefaultSP
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит хранимую процедуру и отобразит результаты.
Создайте хранимую процедуру с выходным параметром
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст хранимую процедуру.
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит новое окно Query (Запрос).DECLARE @myOutput char(6) EXECUTE OutputSP @myOutput OUTPUT SELECT @myOutput
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит хранимую процедуру и отобразит результаты.
Возврат значений реализуется с помощью оператора RETURN, который имеет следующую форму:
RETURN(int)
В операторе RETURN int – это целочисленное значение. Как мы видели раньше, возврат значений чаще всего используется для определения статуса выполнения хранимой процедуры. При этом 0 указывает на успешное завершение выполнения, а любое другое число указывает на ошибку. Ошибки могут быть проанализированы с помощью глобальной переменной @@ERROR, которая возвращает статус выполнения последней команды Transact-SQL: 0 указывает на успешное выполнение, а ненулевое значение указывает, что имела место ошибка.
Совет. Строка сообщения об ошибках SQL Server хранится в главной базе данных в таблице sysmessage. Вы можете добавить свои собственные сообщения об ошибках в эту таблицу, воспользовавшись системной процедурой sp_addmessage, а затем применить функцию RAISERROR для генерирования характерных для базы данных, или даже для приложения, ошибок.
Создайте хранимую процедуру с возвращаемым значением
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст хранимую процедуру.
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит новое окно Query (Запрос).DECLARE @theError int EXECUTE @theError = ErrorSP SELECT @theError AS 'Return Value'
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит хранимую процедуру и отобразит результаты. Во второй панели сетки отображается 0, что указывает на успешное выполнение команды.
Использование функции UPDATE
SQL Server предоставляет специальную функцию, UPDATE, которая может быть использована в триггере для определения, подвергся ли изменению определенный столбец в строке. Функция UPDATE имеет следующий синтаксис:
UPDATE (имя_столбца)
Функция UPDATE будет возвращать TRUE, если значения данных для указанного столбца были изменены командой INSERT или командой UPDATE.
Совет. Другая функция Transact-SQL, COLUMNS_UPDATED, возвращает битовую маску, биты которой устанавливаются в единицу для тех столбцов, которые были модифицированы. Функция COLUMNS_UPDATED может оказаться более эффективной, чем функция UPDATE, если вам необходимо проверить статус нескольких столбцов.
Используйте функцию UPDATE
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

в панели инструментов анализатора запросов Query Analyzer. Кнопка Execute Query (Выполнить запрос) Query Analyzer создаст триггер.
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит сценарий и отобразит результат.
Использование команды CREATE TRIGGER
Как и любые другие объекты базы данных, триггер определяется с помощью соответствующей формы оператора CREATE. Базовый синтаксис оператора создания триггера следующий:
CREATE TRIGGER имя_триггера ON таблица_или_представление тип_триггера, список_команд AS операторы_SQL
Имя_триггера должно удовлетворять правилам, принятым для идентификаторов. Таблица_или_представление может быть именем представления, только если тип_триггера есть INSTEAD OF, поскольку только этот тип триггера вы можете определять для представлений. Триггеры не могут быть созданы для временных таблиц или системных таблиц, но они могут ссылаться на временные таблицы.
Тип_триггера должен быть выражен одним из ключевых слов AFTER, FOR или INSTEAD OF, в то время как список_команд может быть любой комбинацией команд INSERT, UPDATE или DELETE. Если вы указываете более одной команды, их следует отделять запятыми.
Примечание. Ранние версии SQL Server поддерживали только триггеры AFTER и использовали ключевое слово FOR в качестве типа_триггера. Этот синтаксис по-прежнему поддерживается SQL Server 2000, но это будет означать то же самое, что триггер AFTER.
Операторы_SQL, следующие за ключевым словом AS, определяют действия, выполняемые триггером. Здесь имеется аналогия с хранимыми процедурами, за исключением того, что триггеры не имеют параметров.
Создайте триггер AFTER
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит новое окно Query (Запрос).
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст триггер.
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer откроет новое окно Query (Запрос).
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит сценарий и отобразит результат.


в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит сценарий и отобразит результат.
Создайте триггер INSTEAD OF
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст триггер.
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит сценарий и отобразит результат.
Использование таблиц вставки и удаления
SQL Server создает две таблицы, облегчающие манипулирование данными при применении триггеров. Таблицы вставки и удаления представляют собой временные резидентно хранящиеся в памяти таблицы, которые содержат строки, подвергшиеся воздействию команды, вызвавшей триггер.
Если триггер вызывается из команды DELETE, таблица удаления будет содержать строки, которые были удалены из таблицы. При вызове из команды INSERT таблица вставки будет содержать копию новых (вставляемых) строк. Физически оператор UPDATE представляет собой последовательное выполнение команды удаления DELETE и вставки INSERT, так что таблица удаления будет содержать старые значения, а таблица вставки – новые значения. Вы можете обращаться к содержимому этих таблиц из триггера, но вы не можете изменять их.
Напомним, что триггеры AFTER не вызываются до тех пор, пока не будет осуществлена модификация таблицы, т.е. строки в исходных таблицах уже подвергнутся изменениям. С другой стороны, триггер INSTEAD OF вызывается вместо действия, для которого он определен, поэтому таблица еще не будет изменена. Фактически, таблица вообще не будет изменена, если команда INSTEAD OF не назначит соответствующие команды.
Внимание! Триггер вызывается для команды, а не для строки. Вам следует проявлять осторожность при написании триггеров, затрагивающих несколько строк (в случае их наличия) в таблицах вставки и удаления. Глобальная переменная @@ROWCOUNT будет возвращать количество записей в этих таблицах, если вы обратитесь к ней в начале описания вашего триггера.
Используйте таблицу удаления
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст триггер.
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит сценарий и отобразит результат.
Триггеры INSTEAD OF
Триггеры INSTEAD OF заменяют команду, для которой они объявлены. Подобно триггерам AFTER, вы можете определять триггеры INSTEAD OF для команд INSERT, UPDATE или DELETE. Один триггер может быть применен к нескольким командам.
Однако, в отличие от триггеров AFTER, вы можете создавать триггеры INSTEAD OF как для таблиц, так и для представлений, но для каждого действия над этой таблицей или представлением может быть создан только один триггер INSTEAD OF.
Триггеры INSTEAD OF несовместимы с каскадными изменениями связанных данных. Вы не можете объявить триггер INSTEAD OF DELETE или INSTEAD OF UPDATE для таблицы, внешний ключ которой затрагивается действиями удаления (DELETE) или модификации (UPDATE).
Поскольку триггеры INSTEAD OF могут быть объявлены для представлений, они чрезвычайно полезны для получения функциональных возможностей представления, которые не могут быть доступны иным способом. Например, SQL Server не дает возможности применить для представления оператор INSERT, содержащий фразу GROUP BY, но позволяет вам определить триггер INSTEAD OF INSERT для представления. Вы можете воспользоваться триггером для вставки записей в таблицы, лежащие в основе представления, тем самым давая знать пользователю, что новая строка была вставлена в представление.
Триггеры "BEFORE"
Триггера BEFORE не существует, но триггер INSTEAD OF может порождать команду, для которой он объявлен, и эта команда будет выдаваться, как если бы триггера INSTEAD OF не было.
Например, если вы хотите проверить некое условие до выполнения команды INSERT, вы можете объявить триггер INSTEAD OF INSERT. Триггер INSTEAD OF будет выполнять проверку, а затем выполнять команду INSERT для таблицы. Оператор INSERT будет выполняться обычным образом, не порождая рекурсивных вызовов триггера INSTEAD OF.
Применение пользовательских функций в операторах Transact-SQL
Скалярные пользовательские функции могут использоваться везде, где допустимо использовать тип данных, который они возвращают. Табличные пользовательские функции могут быть использованы только во фразе FROM оператора SELECT.
Примечание. Если фраза SELECT находится внутри оператора DECLARE CURSOR, курсор должен иметь тип STATIC и READ_ONLY.
Используйте скалярную функцию в операторе PRINT
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer откроет новое окно Query (Запрос).PRINT dbo.scalarFunction('German Chamomile')
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит оператор и отобразит результат.
Используйте скалярную функцию в операторе SELECT
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer очистит окно Query (Запрос).SELECT OilID, dbo.scalarFunction(OilName) FROM Oils
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит оператор и отобразит результат.
Используйте табличную функцию в операторе SELECT
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer очистит окно Query (Запрос).SELECT * FROM tableFunction()
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит оператор и отобразит результат.
Применение пользовательских функций в определениях таблиц
Пользовательские функции могут быть использованы в определениях таблиц, предоставляемых владельцем таблицы, но на параметры, используемые в этих функциях, накладываются некоторые ограничения.
При использовании в качестве типа данных для вычисляемого столбца, параметры пользовательской функции должны быть либо другими столбцами в таблице, либо константами. Это справедливо и в том случае, если пользовательская функция используется в качестве проверочного ограничения типа CHECK. Если пользовательская функция используется как значение по умолчанию для столбца, параметры должны быть константами.
Примените пользовательскую функцию в вычисляемом столбце
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст функцию и таблицу.
в окне анализатора запросов Query Analyzer. Query Analyzer откроет новое окно Query (Запрос).
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит запрос и отобразит результат.


в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст таблицу.
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит запрос и отобразит результат.
Применение пользовательских функций
Синтаксис вызова скалярных функций схож с синтаксисом, используемым для встроенных функций Transact-SQL:
имя_владельца.имя_функции([список_параметров])
Имя_владельца для скалярной функции является обязательным. Вы не можете использовать синтаксис с именованными параметрами (например, @имя_параметра = значение), а также не можете не указывать (опускать) параметры, но вы можете применять ключевое слово DEFAULT для указания значения по умолчанию, как вы это делаете для хранимых процедур.
Совет. SQL Server предоставляет несколько встроенных пользовательских функций, не относящихся к обычным встроенным функциям. Они начинаются с fn_, а при их вызове используется специальный синтаксис ::имя_функции([список_параметров]). Символы :: заменяют имя_владельца и указывают на то, что функция является встроенной пользовательской функцией.
Для скалярной функции вы также можете использовать оператор EXECUTE:
EXECUTE @возвращаемое_значение = имя_функции(список_параметров)
Если вы используете оператор EXECUTE для пользовательской функции, вам не нужно указывать имя_владельца. В этом синтаксисе вы можете использовать именованные параметры:
EXECUTE @возвращаемое_значение = имя_функции @параметр = значение [, @параметр = значение [,...]]
Если вы используете именованные параметры, параметры не обязательно должны следовать в том порядке, в котором они указаны в объявлении функции, но вам необходимо указать все параметры; нельзя опускать ссылку на параметр для использования значения по умолчанию.
Для табличных пользовательских функций, как подставляемых, так и многооператорных, должен всегда использоваться тот же синтаксис, что и для встроенных функций:
имя_функции([список_параметров])
Имя_владельца здесь указывать не требуется, но необходимо включить все определенные параметры, как и при вызове любой пользовательской функции.
Создание скалярной функции
Оператор CREATE для скалярных пользовательских функций имеет достаточно простой синтаксис для функций всех типов:
CREATE FUNCTION имя_функции ([список_параметров]) RETURNS тип_данных AS BEGIN [операторы_tsql] RETURN (возвращаемое_значение) END
Имя_функции должно удовлетворять правилам, действующим для идентификаторов. Хотя список_параметров в описании оператора CREATE занимает иное место, чем список параметров для хранимой процедуры, они имеют аналогичный синтаксис:
@имя_параметра тип_данных [= значение_по_умолчанию]
Имя_параметра должно соответствовать правилам, принятым для идентификаторов, и начинаться с символа @. Пользовательские функции могут иметь до 1024 входных параметров. Выходные параметры пользовательские функции не поддерживают – единственным значением, возвращаемым функцией, является результат ее выполнения. Заметим, что список_параметров является необязательным, но наличие скобок обязательно.
Фраза RETURNS определяет тип возвращаемых функцией значений. Скалярные функции могут возвращать любые скалярные системные типы данных, за исключением timestamp, text, ntext или image.
Операторы BEGIN...END, которыми ограничиваются операторы_tsql, составляющие тело функции, являются обязательными, даже если тело функции состоит из одного оператора RETURN.
Создайте скалярную функцию
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer откроет новое окно Query (Запрос).
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст пользовательскую функцию
увеличить изображение
Примечание. Созданные здесь пользовательские функции мы используем в следующем разделе.
Создание табличных функций
Оператор CREATE FUNCTION поддерживает создание двух различных типов табличных функций: подставляемых и многооператорных. Тело подставляемой табличной функции состоит из единственного оператора SELECT, в то время как многооператорная табличная функция может состоять из любого числа операторов Transact-SQL.
Синтаксис для подставляемой табличной функции является усеченной разновидностью оператора CREATE FUNCTION. Блок BEGIN...END отсутствует, и нет никаких других операторов, кроме RETURN:
CREATE FUNCTION имя_функции (список_параметров) RETURNS таблица AS RETURN (оператор_выборки)
Создайте подставляемую табличную функцию
в панели инструментов анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).

в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст пользовательскую функцию
увеличить изображение
Синтаксис оператора CREATE FUNCTION для многооператорной табличной функции сочетает элементы синтаксиса для скалярной и для подставляемой функций:
CREATE FUNCTION имя_функции (список_параметров) RETURNS @локальная_табличная_переменная TABLE (определение_таблицы) AS BEGIN операторы_tsql RETURN END
Подобно скалярным функциям, в многооператорной табличной функции команды Transact-SQL располагаются внутри блока BEGIN...END. Поскольку блок может содержать несколько операторов SELECT, в фразе RETURNS вы должны явно определить таблицу, которая будет возвращаться.
Поскольку оператор RETURN в многооператорной табличной функции всегда возвращает таблицу, заданную во фразе RETURNS, он должен выполняться без аргументов, – например, RETURN, а не RETURN @myTable.
Базы данных: Разработка - Управление - Excel
- Базы данных
- Разработка баз данных
- СУБД и базы данных
- Управление базами данных
- Классика баз данных
- Софт для создания базы данных
- SQL
- Access
- FoxProо
- Расширенная оптимизация подзапросов в Oracle
- Informix
- Линтер
- Postgres
- СУБД DB2
- InterBase
- Excel
- Таблицы Excel
- Справка Excel
- Программирование в Excel
- Деньги в Excel
- Задачи Excel


