Программирование >>  Программирование баз данных 

1 ... 107 108 109 [ 110 ] 111 112 113 ... 346


К сожалению, при выполнении этого сценария возникают другие проблемы: Msg 911, Level 16, State 1, Line 3

Could not locate entry in sysdatabases for database Test. No entry found with that name. Make sure that the name is entered correctly.

Синтаксический анализатор при проверке кода сценария обнаруживает, что в операторе USE упоминается база данных, которая к этому моменту еще не существует. Такая ситуация как раз и демонстрирует, для чего нужны пакеты. Дело в том, что обработка оператора CREATE DATABASE должна быть завершена к тому моменту, когда будет предпринята попытка использовать новую базу данных:

CREATE DATABASE Test GO

USE Test

CREATE TABLE TestTable (

coll int, col2 int

Такая организация работы намного л)ше. Безусловно, это не обнаруживается в непосредственно полученных результатах: Command(s) completed successfully.

Но после вызова на выполнение того же запроса к схеме INFORMATION SCHEMA подтверждается, что результаты оказались успешными:

TABLE CATALOG Test

(1 row(s) affected)

Рассмотрим еще один пример, который даже более явно показывает необходимость управлять порядком следования заданий.

Если с помощью оператора ALTER TABLE вносятся существенные изменения в типы столбцов или добавляются новые столбцы, результатами этих изменений нельзя воспользоваться до тех пор, пока не завершится выполнение пакета, в котором вносятся такие изменения.

Предпримем попытку ввести дополнительный столбец в таблицу TestTable базы данных Test, а затем попытаемся обратиться к этому столбцу в ходе выполнения одного и того же пакета следующим образом:

USE Test

ALTER TABLE TestTable ADD col3 int

INSERT INTO TestTable (coll, col2, col3) VALUES (1,1,1)

В результате будет получено следующее сообщение об ошибке, обусловленное тем, что СУБД SQL Server не может найти в своих справочных таблицах информацию о новом столбце с указанным именем:

Msg 207, Level 16, State 1, Line б Invalid column name colS.



Но достаточно ввести один простой оператор GO вслед за строкой ADD со13 int, и выполнение сценария завершится успешно: (1 row(s) affected)

Утилита SQLCMD

Утилита SQLCMD позволяет вызывать на вьшолнение сценарии из приглашения к вводу команд командного интерпретатора Windows. Такой способ вызова может оказаться очень удобным для вьшолнения сценариев преобразования данных или сопровождения базы данных, а также может служить быстрым и легким способом перехвата вывода сценариев в виде текстовых файлов.

Утилита SQLCMD пришла на замену применявшейся ранее программе OSQL, которая все еще входит в состав программного обеспечения SQL Server, но лишь для обратной совместимости. А утилита ISQL с интерфейсом командной строки, относящаяся к еще более ранним выпускам, больше не поддерживается.

Синтаксис оператора вызова утилиты SQLCMD на вьшолнение из командной строки включает большое количество различных параметров и выгладит следующим образом:

sqlcmd [

\{ \{ -и <login id> [ -Р <password> ] \} -Е \} ]

[-S <server name> [ \\<instance name> ] ] [ -Н <workstation name> ] [ -d <db name> ]

[ -1 <time out> ] [ -t <time out> ] [ -h <headers> ]

[ -s <col separator> ] [ -w <col width> ] [ -a <packet size> ]

[ -e ] [ -I ]

[ -c <cmd end> ] [ -L [ с ] ] [ -q <query> ] [ -Q <query> ]

[ -m <error level> ] [ -V ] [ -W ] [ -u ] [ -r [ 0 1 ] ]

[ -i <input file> ] [ -o <output file> ]

[ -f <codepage> i:<codepage> [ <, o: <codepage> ]

[ -k [ 1 I 2 ] ]

[ -y <display width> ] [-Y <display width> ]

[ -p [ 1 ] ] [ -R ] [ -b ] [ -V ] [ -A ] [ -X [ 1 ] ] [ -X ]

[ -? ]

Изучая эти параметры, необходимо учитывать одну из наиболее важных их особенностей, состоящую в том, что большинство этих параметров (но, как ни странно, не все) чувствительны к регистру. Например, и параметр -Q , и параметр -q указывает, что должен быть выполнен запрос, но первый говорит о том, что нужно выйти из программы SQLCMD по окончании вьшолнения запроса, а второй - что этого не нужно делать.

Итак, попытаемся вызвать на вьшолнение короткий запрос непосредственно из комавдной строки, как показано ниже. Еще раз напомним, что этот запрос должен быть вызван на вьшолнение из командной строки интерпретатора команд Windows (не используйте программу Management Console).

SQLCMD -Usa -Pmypass -Q SELECT * FROM AdventureWorks.HumanResources.Employee

Параметр -P служит для указания пароля. Если настройка конфигурации сервера выполнена с учетом использования непустого пароля (а так и должно быть!), то пароль доступа к базе данных должен быть указан непосредственно вслед за параметром -Р, без пробела между ними.



После вызова этой команды на выполнение из командной строки должно быть получено приблизительно 290 строк. Теперь рассмотрим короткий пример создания текстового файла, чтобы показать, как ос}тцествляется запись результатов запроса в файл. В приглашении к вводу команд введите С:\>сору con testsql.sql

После ввода этой команды курсор должен перейти на новую, пустую строку (без какого-либо приглашения); введите в этой строке следующую команду: SELECT * FROM AdventureWorks.HumanResources.Employee

Затем последовательно нажмите клавиши <F6> и <Return> (на этом создание нового текстового файла заканчивается). После этого должно появиться такое сообщение: 1 file(s) copied.

Теперь попытаемся вызвать на выполнение тот же запрос, что и раньше, но с использованием файла сценария с заданным для него именем. При этом команда в приглашении к вводу команд немного изменяется: C:\>sqlcmd -Usa -Pmypass -i testsql.sql

Выполнение этой команды должно привести точно к таким же результатам, как и после выполнения запроса с параметром -Q. Но основное отличие, безусловно, состоит в том, что команда была вызвана на выполнение из файла. Удобство применения файлов состоит в том, что файлы могут содержать сотни (или даже тысячи) различных команд.

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

Динамический код SQL - формирование кода в оперативном режиме с помощью

команды exec

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

Кстати, отметим, что в настюящей главе утилита SQLCMD болыие не используется; следующие примеры должны выполняться с помощью программы Management Console.

С учетом определенных нюансов СУБД SQL Server позволяет оперативно формировать операторы SQL, используя средства манипулирования строками. Необходимость в этом обычно возникает в связи с тем, что некоторые сведения, требуемые для выполнения операторов, остаются неизвестными вплоть до этапа прогона. Для этого применяется синтаксис

EXEC ({<string variable><literal command string>})



1 ... 107 108 109 [ 110 ] 111 112 113 ... 346

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика