|
Программирование >> Программирование баз данных
Утилита SQLCMD была впервые введена в версии SQL Server 2005. В этой версии SQL Server поддерживается также программа osql.exe, которая применялась в предыдущих версиях для работы с интерфейсом командной строки (но такая поддержка предусмотрена лишь для обеспечения обратной совместимости). В документации к более ранним версиям можно также обнаружить ссылки на программу isql. ехе (ее не следует путать с программой isqlw. ехе), которая выполняла в основном такое же назначение. В версии SQL Server 2005 программа isql. ехе больиле не поддерживается. Основы создания сценариев С формальной точки зрения сценарием считается совоьсупность операторов, хранящихся в виде отдельного файла, который может вызываться на выполнение и использоваться повторно. Сценарии SQL хранятся в виде текстовых файлов. В состав программного обеспечения SQL Server Management Studio входит большое количество инструментальных средств, способных оказать помощь при написании сценариев, но вся эта работа может быть выполнена в любом текстовом редакторе (однако следует учитывать, что для проверки сценария на практике все равно необходимо воспользоваться какой-то программой, позволяющей подключиться к базе данных). Сам автор часто использует один весьма надежный текстовый редактор, который обеспечивает возможность обрабатывать реально применяемые выражения и поддерживает другие функции редактирования текста, отсутствующие в программе Management Studio и даже Visual Studio. Сценарии обычно рассматриваются как отдельная единица работы. Это означает, что в обычных обстоятельствах сценарий либо выполняется полностью, либо вообще не выполняется. В сценариях могут использоваться и системные, и локальные переменные. В качестве примера рассмотрим простой сценарий, который может использоваться для вставки строк с данными заказа с помощью оператора INSERT в услови51х типичной конфигурации, в которой одна таблица предназначена для ввода заголовков заказов, а другая - расшифровок заказов: USE SomeDatabase DECLARE ©Ident int INSERT INTO Orders (CustomerlD,OrderDate) VALUES (25, DATEADD(day,-1,GETDATE0)) -- В этом операторе всегда задается значение -- OrderDate, соответствующее вчерашнему дню SELECT ©Ident = ©©IDENTITY INSERT INTO Details (OrderlD, ProductID, UnitPrice, Quantity) VALUES (©Ident, 1, 50, 25) SELECT The OrderlD of the INSERTed row is + CONVERT(varchar(8),©Ident) В этом сценарии применяются шесть различных операторов, которые показывают, какие разнообразные действия могут осуществляться в сценарии. В сценарии используются системные и локальные переменные, операторы USE и INSERT, а также две версии оператора SELECT - с операцией присваивания и обычная. Все эти языковые элементы взаимодействуют в целях осуществления общей задачи- вставки в базу данных заполненных заказов. Оператор use Оператор USE сообщает, какая база данных должна стать текущей. Действие, осуществляемое этим оператором, отражается во всех местах сценария, в которых используются заданные по умолчанию значения для той части полностью уточненного имени объекта, которая применяется для обозначения имени базы данных. В данном конкретном примере не приводилась информация о том, в какой базе данных находятся таблицы, применяемые в операторе INSERT или SELECT, но поскольку в этот сценарий оператор USE включен перед операторами INSERT и SELECT, то в последних используется указанная база данных (в рассматриваемом случае SomeDatabase). А если бы оператор USE не был предусмотрен, то оставалось бы лишь надеяться на то, что пользователь, вызывающий сценарий на вьшолнение, позаботится об указании в качестве текущей именно той базы данных, которая требуется. Не следует рассматривать это пояснение как намек на то, что в сценарии всегда следует включать операторы USE, поскольку необходимость в использовании такого оператора зависит от назначения сценария. В частности, если сценарий предназначен для универсального применения, то фактически может потребоваться исключить оператор USE. Как правило, оператор USE требуется, если в сценарии используются таблицы какой-то конкретной базы данных (иными словами, таблицы, отличные от системных). По мнению автора, оператор USE становится также необходимым, если сценарий предназначен для модификации конкретной базы данных, - как было указано в предьщущих главах, не поддается описанию количество случаев, в которых непреднамеренно создавалось большое количество таблиц в базе данных master, тогда как эти таблицы были предназначены для пользовательской базы данных. Объявление переменных Оператор DECLARE имеет довольно простой синтаксис: DECLARE @<variable name> <variable type>[, @<variable name> <variable type>[, ®<variable name> <variable type>]] С помощью оператора DECLARE можно одновременно объявить одну или несколько переменных. На практике часто приходится сталкиваться с тем, как в сценарии используется отдельный оператор DECLARE для каждой объявляемой переменной, вместо указания одного, разделенного запятыми списка переменных в одном операторе DECLARE. Безусловно, разработчик вправе сам выбирать тот или другой способ объявления переменных, но независимо от выбранного способа значение объявленной переменной всегда остается равным NULL, до тех пор, пока вместо него не будет задано какое-то другое значение. В данном случае объявлена как целочисленная одна локальная переменная ©ident. Автор всегда предпочитает переносить значение, полученное с помощью любой системной переменной, в специально объявленную для этого переменную. Это позволяет мне с уверенностью использовать значение переменной, зная о том, что за любое изменение этого значения отвечаю я сам. Если же применяется непосредственно системная переменная, то зачастую нельзя быть уверенным в том, не произошло ли изменение значения, устанавливаемого с ее помощью, поскольку вызовы большинства системных переменных осуществляются не вами, а самой системой. В результате этого вполне могут возникнуть такие ситуации, что система изменяет значение, возвращаемое системной переменной, в тот момент, когда вы этого совсем не ожидаете, что приводит к появлению самых неприятных последствий, связанных с эксплуатацией приложения, - непредсказуемых результатов. Этого, безусловно, следует избегать. Определение значений переменных В предыдущем разделе было показано, как объявить переменные, а в этом разделе речь пойдет о том, как изменить значение переменной. В настоящее время в языке SQL предусмотрены два основных способа присваивания значения переменной. Для этого можно использовать оператор SELECT или SET. С точки зрения выполняемых функций эти операторы действуют почти одинаково, не считая того, что оператор SELECT позволяет получить исходное присваиваемое значение из таблицы, указанной в операторе SELECT. В действительности трудно объяснить, по каким причинам предусмотрены два оператора присваивания, поэтому оставим эту тещ и перейдем к рассмотрению различий в способах их использования. Присваивание значений переменным с использованием оператора set Оператор SET обычно используется для задания значений переменных в такой форме, какая более часто встречается в процедурных языках. В качестве типичньгх примеров его использования можно указать следующие: SET ©TotalCost = 10 SET ©TotalCost = ©UnitCost * 1.1 Обратите внимание на то, что во всех этих операторах непосредственно осуществляются операции присваивания, в которых используются либо явно заданные значения, либо другие переменные. С помощью оператора SET невозможно присвоить переменной значение, полученное с помощью запроса; запрос должен быть выполнен отдельно и только после этого полученный результат может быть присвоен с помощью оператора SET. В качестве примера рассмотрим следующий оператор: USE AdventureWorks DECLARE ©Test money SET ©Test = MAX(UnitPrice) FROM SalesOrderDetail SELECT ©Test Попытка выполнения такого оператора вызывает ошибку, а следующий оператор выполняется вполне успешно:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |