авторефераты диссертаций БЕСПЛАТНАЯ БИБЛИОТЕКА РОССИИ

КОНФЕРЕНЦИИ, КНИГИ, ПОСОБИЯ, НАУЧНЫЕ ИЗДАНИЯ

<< ГЛАВНАЯ
АГРОИНЖЕНЕРИЯ
АСТРОНОМИЯ
БЕЗОПАСНОСТЬ
БИОЛОГИЯ
ЗЕМЛЯ
ИНФОРМАТИКА
ИСКУССТВОВЕДЕНИЕ
ИСТОРИЯ
КУЛЬТУРОЛОГИЯ
МАШИНОСТРОЕНИЕ
МЕДИЦИНА
МЕТАЛЛУРГИЯ
МЕХАНИКА
ПЕДАГОГИКА
ПОЛИТИКА
ПРИБОРОСТРОЕНИЕ
ПРОДОВОЛЬСТВИЕ
ПСИХОЛОГИЯ
РАДИОТЕХНИКА
СЕЛЬСКОЕ ХОЗЯЙСТВО
СОЦИОЛОГИЯ
СТРОИТЕЛЬСТВО
ТЕХНИЧЕСКИЕ НАУКИ
ТРАНСПОРТ
ФАРМАЦЕВТИКА
ФИЗИКА
ФИЗИОЛОГИЯ
ФИЛОЛОГИЯ
ФИЛОСОФИЯ
ХИМИЯ
ЭКОНОМИКА
ЭЛЕКТРОТЕХНИКА
ЭНЕРГЕТИКА
ЮРИСПРУДЕНЦИЯ
ЯЗЫКОЗНАНИЕ
РАЗНОЕ
КОНТАКТЫ


Pages:     | 1 |   ...   | 28 | 29 || 31 | 32 |   ...   | 33 |

«Е.Мамаев MS SQL SERVER 2000 Книга посвящена одной из самых мощных и популярных современных систем управления базами данных - Microsoft SQL Server 2000. ...»

-- [ Страница 30 ] --

попросту откидывает знак ACOS(floatexpression) Возвращает угол в радианах, косинус которого равен указанному значению (арккосинус) 1106 Часть V. Программирование Таблица 27.3 (продолжение) Описание Функция Возвращает угол в радианах, синус которого равен ASIN(float_expression) указанному значению (арксинус). Аргумент должен лежать в диапазоне от —1 до 1 включительно Возвращает угол в радианах, тангенс которого равен ATAN(float_expression) указанному значению (арктангенс) Возвращает угол в радианах, тангенс которого равен АТЫ2(float_expression, частному от деления первого аргумента на второй, с f l o a t expression) учетом квадранта, задаваемого двумя аргументами Возвращает ближайшее целое число, большее или CEILING(numeric равное значению аргумента, т. е. выполняет округление expression) _ вверх Вычисляет косинус угла, указанного в радианах COS(float expression) Возвращает котангенс угла, указанного в радианах COT(float expression) Выполняет преобразование угла DEGREES(numeric expression) n u m e r i c e x p r e s s i o n ИЗ радиан В градусы Возвращает экспоненту значения EXP (float_expression) Возвращает для указанного значения ближайшее ми FLOOR(numeric expression) нимальное целое число, т. е. выполняет округление вниз Данная функция выполняет проверку на то, является ли ISNUMERIC(expression) указанное символьное выражение числом. Если выра жение имеет числовой тип данных, то функция возвра щает 1. В противном случае будет возвращен Вычисляет натуральный логарифм LOG(float_expression) Вычисляет десятичный логарифм LOG10(float expression) Возвращает значение тс PIO Возводит число numeric_expression в степень у.

POWER(numeric expression, y) Тип возвращаемого значения совпадает с исходным типом Преобразует значение угла numeric_expression, RADIANS(numeric expression) указанное в градусах, в радианы Вычисляет случайное число с плавающей запятой в RAND([seed]) интервале от 0 до 1, и может использовать в качестве аргумента значения типа t i n y i n t, i n t, или s m a l l i n t в качестве отправной точки для генерации случайного числа. Если аргумент не указан, то начальное значение генерируется на основе системного времени Выполняет округление числа с указанной точностью.

ROUND(numeric expression, l e n g t h [, Можно выполнять округление числа как после десятич function]) ной точки (length0), так и до нее (length0) Функции метаданных Функции этой группы предназначены для получения сведений о различных объек тах SQL Server 2000 (метаданных). Список функций группы приведен в табл. 27.4.

Таблица 27.4. Функции работы с метаданными Функция Описание Часть У. Программировани Таблица 27.4 (окончание) Функции подсистемы безопасности Функции этой группы служат для получения информации, связанной с подсис темой безопасности — пользователях и учетных записях, о членстве их в фикси рованных и пользовательских ролях базы данных, фиксированных ролях сервера и другой информации. Список функций группы приведен в табл. 27.5.

Таблица 27.5. Функции подсистемы безопасности Глава 27. Функции SQL Server 2000 Таблица 27.5 (окончание) Строковые функции Функции этой группы предназначены для работы с символьными строками — поиску подстроки в строке, выделению подстроки, удалению лидирующих и конечных пробелов, вычислению длины строки и т. д. Список функций группы приведен в табл. 27.6.

Таблица 27.6. Функции работы со строками Функция Описание Системные функции Функции этой группы предназначены для получения самой разнообразной ин формации, которая, судя по названию группы, должны быть системной. Однако некоторые из функций группы скорее можно назвать функциями общего поль зования, чем системными. Список функций группы приведен в табл. 27.7.

Таблица 27.7. Системные функции Функция Описание Возвращает код последней ошибки, произошедшей в @@ERROR текущем соединении Глава 27. Функции SQL Server 2000 Таблица 27.7 (продолжение) Статистические функции Функции этой группы возвращают различную статистическую информацию о работе сервера — об операциях чтения Диска, количестве переданной по сети информации, затратах времени и т. д. Список статистических функций приве ден в табл. 27.8.

Таблица 27.8. Статистические функции Функция Описание Возвращает количество миллисекунд, которое затратил цен тральный процессор на старт сервера Возвращает количество миллисекунд, прошедшее со времени последнего запуска SQL Server Возвращает количество миллисекунд, которое SQL Server ожидал выполнения операций ввода/вывода во время последнего старта Возвращает количество пакетов, принятое SQL Server от клиентов со времени запуска : /«;

Функции, определяемые пользователем Предьщущая часть главы была посвящена рассмотрению встроенных функций SQL Server 2000. При работе с более ранними версиями SQL Server пользовате ли должны были ограничиваться вызовом только этих функций. При работе же с SQL Server 2000 пользователи могут создавать свои собственные функции. Та кие функции называются определяемыми пользователями функциями (User-defined function). Эти функции являются ничем иным, как обычными объектами, базы* данных, такими же, как и хранимые процедуры, триггеры, представления и т. д:

Каждый из пользователей, имеющий соответствующие права доступа, может?

создать произвольную функцию. Таким образом, определяемая пользователем;

!

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

В SQL Server 2000 имеется несколько типов определяемых пользователем функций:

• Scalar. Функции этого типа являются наиболее привычными. Функция Scalar может содержать множество команд, объединяемых конструкцией BEGIN...END в одно целое, и возвращает скалярное значение любого из типов Данных, поддерживаемого SQL Server 2000, за исключением timestamp, t e x t, ntext, image, table И cursor.

П Inline. Функции этого типа всегда возвращают значения типа данных t a b l e, представляющие собой сложный набор данных. Кроме того, функция Inline может состоять всего из одной команды SELECT. Функпйи Inline существуют во многих языках программирования: Их особенностью является то, что код функции при выполнении программы вставляется непосредственно в испол няемый набор команд, т. е. происходит не вызов функций, а встраивание, 1114 Часть V. Программирование • Multi-Scalar. Как и функции предыдущего типа, функции Multi-Scalar воз вращают значение типа данных t a b l e. Однако в отличие от первых, функции рассматриваемого типа могут состоять более чем из одной команды, что дает возможность использовать в теле функции транзакции, курсоры, вызывать хранимые процедуры и т. д. Как и при работе с функциями Scalar при ис пользовании более одной команды следует применять конструкцию BEGIN...END.

Замечание Функции, возвращающие значения типа данных t a b l e (Inline и Multi-Scalar), могут вызываться непосредственно в разделе FROM при работе с запросами SELECT, INSERT, DELETE И UPDATE.

Написание определяемых пользователем функций весьма напоминает програм мирование хранимых процедур: и те, и другие могут использовать или не ис пользовать входные параметры. При этом входные параметры могут иметь лю бой из поддерживаемых SQL Server 2000 типов данных за исключением image, t e x t, ntext, cursor и t a b l e. Входные параметры определяемой пользователем функции, в отличие от параметров хранимой процедуры, нельзя применять для возврата значений, т. е. указание ключевого слова OUTPUT не допускается. Тем не менее, можно определять значения по умолчанию.

В отношении пользовательских функций существует множество ограничений.

Если от хранимой процедуры не требуется указывать возвращаемое значение (код возврата), то функция должна в обязательном порядке явно вернуть какое то значение. При программировании функций не разрешается использование команд, которые могут вернуть значения непосредственно в соединение, а не как результат вычисления функции. Таким образом, в теле функции не допуска ется вызов команды PRINT, а также варианта команды SELECT, предназначенного для вывода данных. Не разрешается и использование команды FETCH, возвра щающей данные непосредственно в соединение. Однако применение этой ко манды для помещения данных из курсора в локальные переменные допускается.

В функции не разрешается изменений данных в таблицах базы данных, созда ние, модификация и удаление объектов базы данных. Тем не менее, разрешается использование команд UPDATE, INSERT И DELETE, изменяющих данные в пере менной t a b l e, которая является возвращаемым функцией значением. Помимо этого, в теле функции (кроме, конечно, функций Inline) разрешается создавать циклы, использовать команды ветвления, работать с транзакциями, объявлять переменные и курсоры и т. д.

Создание определяемых пользователем функций выполняется с помощью ко манды CREATE FUNCTION. Однако, для создания функций разных типов сущест вует разный синтаксис этой команды. В следующих трех разделах будет подроб но рассмотрен синтаксис команды CREATE FUNCTION ДЛЯ создания функций каждого из типов.

Глава 27. Функции SQL Server 2000 Функции Scalar Для создания функций типа Scalar предназначен следующий синтаксис команды CREATE FUNCTION:

CREATE FUNCTION [owner_name.]function_name ([{@parameter_name scalar_parameter_data_type [= d e f a u l t ]} [,... n ] ] ) RETURNS scalar_return_data_type [WITH function_option [,... n ] ] [AS] BEGIN funct i on_body RETURN scalar_expression END Рассмотрим назначение и использование параметров команды:

О [owner_name.]function_name Данный параметр предназначен для указания имени (functionname), а при необходимости дополнительно и владельца (ownername) создаваемой функ ции. Если имя функции или владельца содержит неразрешенные символы, то следует использовать ограничители (двойные кавычки или квадратные скоб ки). Указание имени базы данных или сервера не разрешается, т. е. функция может быть создана только в текущей базе данных.

П @parameter_name scalar_parameter_data_type [=default] Посредством этой конструкции определяются входные параметры создаваемой функции. Как и параметры хранимой процедуры, параметры функции должны начинаться с символа @ и быть уникальными в пределах функции. В теле функ ции параметр может использоваться как обычная переменная. Имя параметра указывается с помощью аргумента Sparametername. Через пробел после имени необходимо задать тип данных, который будет иметь параметр. Для этого предна значен аргумент scalar_parameter_data_type. Уже из имени аргумента можно сделать вывод, что параметр функции может иметь только скалярный тип дан ных. То есть, как уже было сказано, не допускается применение типов данных timestamp, text, ntext, image, table и cursor. Дополнительно для параметра функции с помощью аргумента default можно определить значение по умолча нию, которое будет присваиваться параметру в случаях, когда при вызове функ ции явно не указывается значение соответствующего параметра.

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

О WITH function_option [,...n] Использование данного аргумента необходимо в случаях, когда требуется указать дополнительные опции, с применением которых должна быть созда на функция. Собственно опции задаются конструкцией function_option, которая имеет синтаксис:

f u n c t i o n _ o p t i o n : : = (ENCRYPTION I SCHEMABINDING) 1116 Часть У. Программирование Указание ключевого слова ENCRYPTION предписывает серверу выполнить шифрование кода команды CREATE FUNCTION, С ПОМОЩЬЮ которой была соз дана функция. Это позволяет скрыть от пользователей принципы работы функции. Если же указывается ключевое слово SCHEMABINDING, TO сервер вы полняет связывание создаваемой функции со всеми объектами, на которые ссылаются команды функции. Это позволяет избежать модификации этих объектов, которая может привести к нарушению работы функции (например, удаление столбца таблицы, из которого осуществлялась выборка данных).

Однако в этом случае для обращения к объектам необходимо использовать двухчастные имена (включающие имя владельца).

О AS Это необязательное ключевое слово говорит о том, что далее следует набор команд, которые являются телом функции.

• BEGIN...END Назначение этой конструкции традиционно. Она используется для объедине ния команд, которые будут являться телом функции. Все команды, являю щиеся телом функции, должны находиться между ключевыми словами BEGIN И END.

О RETURN scalar_expression Как и при работе с хранимыми процедурами, когда в теле функции встреча ется команда RETURN, TO сервер завершает выполнение функции. При этом результатом работы функции будет являться значение, полученное в резуль тате вычисления выражения scaiar_expression. Этот результат должен иметь тип данных, указанный после ключевого слова RETURNS. В отличие от хранимых процедур, не требующих обязательного использования команды RETURN, при работе с функцией выход из нее происходит только при выпол нении команды RETURN. В принципе, в теде функции может присутствовать более одной команды RETURN, каждая из которых обрабатывается в той или иной ситуации.

С Замечание ~) Последняя команда,тела функции всегда должна быть RETURN, даже если гаранти рованно до достижения конца функции будет выполнена другая команда RETURN.

Это проиллюстрировано в приведенном ниже примере.

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

CREATE FUNCTION MyFuncA(@parA i n t, @ParB i n t, @parC i n t, @ u i n t ) Nm RETURNS r e a l ' AS Глава 27. Функции SQL Server BEGIN...-,- •.. •• • DECLARE @D int SET @D=@parB*@parB-4*@parA*@parC IF @D0 RETURN NULL IF @Num=l RETURN {(-@parB+SQRT(@D))/(2*@parA)) ELSE RETURN ((-@parB-SQRT(@D))/(2*@parA)) RETURN NULL END Теперь попробуем использовать эту функцию:

SELECT dbo.MyFuncA(l,4/5,l), dbo.MyFuncA(-1,4,5,1), dbo.MyFuncA(-l,4,5, 2) Будет возвращен следующий результат:

1118 Часть V. Программирование AS RETURN SELECT au_lname, au_fname, phone FROM authors WHERE LEFT(au_lname,l)=@Char Попробуем выполнить созданную функцию:

SELECT * FROM MyFuncB('G') Будет возвращен следующий результат:

аи lname au_fname phone Green Marjorie 415 986- Gringlesby Burt 707 938- Greene Morningstar 615 297- (3 row(s) affected) Функции Multi-statement Для создания функций этого типа применяется следующий вариант команды CREATE FUNCTION:

CREATE FUNCTION [owner_name.]function_name ( [ { @parameter_name scalar_parameter_data_type [ = d e f a u l t ] } [,...n ] ] ) RETURNS @return_variable TABLE table_type_definition [ WITH function_option [,...n ] ] [ AS ] BEGIN function_body RETURN END Большая часть аргументов команды CREATE FUNCTION, используемых при созда нии функций типа Multi-statement, были рассмотрена ранее при описании соз даний функций других типов. Тем не менее, некоторые отличия все же имеют ся. Самое заметное отличие — в определении типа возвращаемого значения.

Напомним, что тип возвращаемого значения указывается после ключевого слова RETURNS. В отличие от функций Inline и Scalar здесь необходимо указать имя локальной переменной, содержимое которой будет возвращено как результат выполнения функции. Как видно, эта переменная имеет тип данных table. При этом необходимо явно определить набор столбцов, которые будут применяться для хранения данных. Дополнительно можно определить индексы, ограничения целостности и т. д. Подробно работа с переменными типа данных t a b l e была рассмотрена в главе 26.

Еще одно отличие связано с завершением работы функции. Как и при работе с функциями других типов, завершение работы функции Multi-statement происхо дит при выполнении команды RETURN. Однако не требуется указание значения, которое будет возвращено как результат выполнения функции. Всегда возвра щается содержимое переменной типа t a b l e, указанной после ключевого слова RETURNS.

Глава 27. Функции SQL Server 2000 Изменение функций Не стоит и говорить, что по тем или иным причинам может возникнуть необхо димость внести в уже созданную функцию некоторые изменения. Решением "в лоб" будет удаление функции и повторное ее создание с внесенными изменения ми. Однако минусом такого подхода является потеря всех разрешений, выданных пользователям базы данных на доступ к этой функции. Более того, если с функ цией был связан некоторый объект базы данных (т. е. ссылающийся на функцию и созданный с указанием опции SCHEMABINDING), TO удалить ее не удастся.

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

Изменение функций типа Scalar осуществляется с помощью следующего вари анта команды:

ALTER FUNCTION [owner_name.]function_name ([{@parameter_name scalar_parameter_data_type [= default ]} [,...n]]) RETURNS scalar_return_data_type [WITH function_option [, n]] [AS] BEGIN funct i on_body RETURN scalar_expression END Изменение же функций типа Inline выполняется с помощью команды:

ALTER FUNCTION [owner_name.]function_name ([(@parameter_name scalar_parameter_data_type [= default]} [,...n]]) RETURNS TABLE [ WITH function_option [,...n ] ] [ AS ] RETURN [ ( ] select_stmt [ ) ] Наконец, для изменения функций Multi-statement предназначен такой вариант команды:

ALTER FUNCTION [owner_name.]function_name ([(@parameter_name scalar_parameter_data_type [= default]} [,...n]]) RETURNS 8return_variable TABLE table_type_definition [WITH function_option [.. ]],.n [AS] BEGIN funct i on_body RETURN END He трудно заметить, что команда ALTER FUNCTION практически повторяет син таксис команды CREATE FUNCTION. Поэтому мы не будем лишний раз останавли ваться на рассмотрении уже описанных параметров. Скажем только, что при изменении функции необходимо полностью указывать все ее команды, что можно сравнить с созданием функции с нуля. Помочь в изменении функции 1120 Часть V. Программирование может системная хранимая процедура s p h e i p t e x t, позволяющая получить код команды CREATE FUNCTION, с помощью которого была создана функция. На пример, для получения кода функции MyFuncB, созданной в одном из предыду щих разделов, можно выполнить команду:

sp_helptext 'dbo.MyFuncB' Глава Вставка, удаление и изменение данных Изначально целью любой системы управления базами данных является предос тавление пользователям удобных и эффективных механизмов управления дан ?

ными. Любая СУБД предоставляет пользователям ийст|руме йты»для ввода, изме нения, удаления и выборки данных. Остальные возможности, такие как репли-т кация, резервное копирование, автоматическое администрирование, перенос данных и другие являются лишь дополнительными компонентами, обеспечи вающими более эффективное решение все тех же задач ввода, изменения, уда ления и выборки данных.

Своеобразным стандартом является язык SQL, различные модификации кото рого используются практически во всех современных СУБД для управления данными. В главе 25 были рассмотрены основы языка Transact-SQL, являющего ся расширением стандарта ANSI SQL-92 и используемого в SQL Server 2000.

Задачи, которые можно решать с помошью Transact-SQL, довольно обширны.

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

SQL Server 2000 предлагает несколько различных механизмов управления дан ными. Например, вставка данных может выполняться не только средствами Transact-SQL, но и с помощью утилиты bcp.exe или служб трансформации дан ных (DTS, Data Transformation Services). Однако в этой главе будет рассмотрено использование только команд INSERT (добавление строк), UPDATE (изменение данных) и DELETE (удаление строк).

( Замечание ~^ Для управления данными Microsoft предлагает множество технологий— ODBC, ADO, OLE DB, DB Library и другие. В этой книге будет рассмотрено управление дан ными только с помощью Transact-SQL. Для получения информации о работе с дру гими технологиями управления данными следует обратиться к дополнительным ис точникам информации.

Добавление строк Прежде чем начать работу с данными, их необходимо добавить в таблицу. Сразу же после создания таблица не содержит никаких данных и не предлагает пользо 1122 Часть V. Программирование вателям никакой информации. После того, как таблица будет заполнена данными, пользователи смогут производить выборку, изменение и удаление данных.

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

О Команда INSERT. Обеспечивает вставку одной или более строк в существую щую таблицу на основе явно заданных значений или результата выборки данных.

О Команда SELECT...INTO. С ее помощью на основе результата выборки создает ся новая таблица, которая будет иметь структуру, необходимую для хранения выбранных данных, и содержать весь результат выборки.

Замечание В конце главы также будет рассмотрена вставка строк с использованием механиз мов массивного копирования — команды BULK INSERT И утилиты bcp.exe.

Более подробно каждая из команд будет рассмотрена в следующих разделах.

В начале каждого раздела предлагается синтаксис рассматриваемой команды с описанием назначения и использования всех параметров и аргументов команды.

После этого будут приведены примеры, относящиеся к различным аспектам работы команды.

Команда INSERT Команда INSERT используется для вставки в таблицу одной или более строк. Это единственная команда, с помощью которой можно добавить данные в сущест вующую таблицу. Синтаксис команды INSERT таков:

INSERT [INTO] (table_name WITH ( t a b l e _ h i n t _ l i m i t e d [,... n ] ) I view_name | r o w s e t _ f u n c t i o n _ l i m i t e d } { [ ( c o l u m n _ l i s t ) ] {VALUES ({DEFAULT | NULL I e x p r e s s i o n } [,... n ] ) I derived_table I execute_statement}) I DEFAULT VALUES Рассмотрим подробно назначение и использование каждого из аргументов.

О table_name Имя таблицы, в которую необходимо добавить строки. Помимо имени таблицы можно указать имя ее владельца и имя базы данных, в которой она находится. То есть имя таблицы можно записать в форме database. owner. tablename.

• WITH (table_hint_limited [,...n]) После ключевого слова WITH указывается один или более хинтов, с помощью которых можно устанавливать необходимый режим блокирования при встав ке данных. Конструкция table_hint_limited имеет следующую структуру:

Глава 28. Вставка, удаление и изменение данных t a b l e _ h i n t _ l i m i t e d : : = {INDEX(index_val [,... n ] ) I FASTFIRSTROW I HOLDLOCK I PAGLOCK I READCOMMITTED I REPEATABLEREAD I ROWLOCK I SERIALIZABLE I TABLOCK I TABLOCKX} ( Замечание ^ Использование хинтов и описание уровней блокирования было рассмотрено в разд. "Управление блокировками на уровне команд" главы 19.

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

П rowset_function_limited Этот аргумент подразумевает использование функций OPENQUERY ИЛИ OPENROWSET, с помощью которых можно выполнять вставку данных на свя занном (linked) сервере.

CJ (column_list) С помощью этого параметра указывается список столбцов, в которые необ ходимо вставить данные. Имена столбцов, в которые необходимо вставить данные, просто перечисляются через запятую. Порядок перечисления столб цов задает порядок перечисления вставляемых значений. Порядок значений, указываемых с помощью ключевого слова VALUES, должен соответствовать порядку перечисления столбцов. Если список столбцов не указывается, то команда INSERT поочередно вставляет значения, указанные с помощью VALUES, во все столбцы таблицы. Однако при этом не происходит вставка в столбцы счетчика (IDENTITY) И столбцы типа данных timestamp, т. к. значе ния в них контролируются сервером автоматически. То есть пользователь не должен указывать с помощью VALUES значения для таких столбцов. В список столбцов могут не входить имена столбцов, для которых определено значе ние по умолчанию или разрешено хранение значений NULL. Перечисление всех остальных столбцов обязательно.

( Замечание ^ Рекомендуется всегда перечислять столбцы, в которые должны быть вставлены данные. Особенно это замечание касается хранимых процедур. Предположим, что в хранимой процедуре не были явно указаны столбцы, в которые должны быть встав лены данные, т. е. вставка данных производилась последовательно во все столбцы таблицы. На каком-то этапе структура таблицы была изменена. Например, измени лось количество столбцов или их порядок, поменялись их имена, были определены 1124 Часть V. Программирование значения по умолчанию или сделаны другие изменения. Если количество столбцов и типы данных не изменились коренным образом, то хранимая процедура, ничего не подозревая о проделанных модификациях, будет продолжать вставлять данные.

Однако логическая целостность окажется нарушенной. Если бы имена столбцов бы ли бы указаны явно, то процедура либо выдала ошибку, либо продолжала корректно работать. В таблицу можно было бы легко добавить новые столбцы, разрешив для них хранение значений NULL, или определив значения по умолчанию. В этом случае процедура продолжала бы корректно работать.

П VALUES ({DEFAULT I NULL I expression} [,...n]) После ключевого слова VALUES указываются значения, которые должны быть вставлены в перечисленные столбцы. Порядок указания вставляемых значе ний должен строго соответствовать порядку перечисления столбцов. Как видно из синтаксиса, с помощью команды INSERT МОЖНО вставить не только явное значение, но и значение по умолчанию, определенное для столбца.

Для этого достаточно указать ключевое слово DEFAULT. При указании NULL В столбец будет вставлено значение NULL. Однако необходимо убедиться, что столбец позволяет хранение этих значений. Для вставки конкретного значе ния достаточно указать необходимое выражение. В этом выражении могут использоваться константы и переменные, но запрещается вызов подзапросов, функций и других сложных выражений. При необходимости подзапросы и функции могут быть выполнены заранее, а возвращаемый результат занесен в переменную, которая и будет указана при вставке строки. Конструкция [,...п] говорит о том, что в скобках может быть указано множество значе ний. Более того, количество вставляемых значений должно строго соответст вовать количеству столбцов, перечисленных с помощью конструкции (coiumn_iist). Если список столбцов не задан явно, то количество указы ваемых значений должно соответствовать количеству столбцов таблицы за исключением столбцов счетчика (IDENTITY) И столбцов timestamp.

( Замечание } В принципе, в столбец счетчика допускается вставка значений, указанных пользова телем. Для разрешения этой возможности используется команда S E T IDENTITY_INSERT [ d a t a b a s e. [ o w n e r. ] ] { t a b l e } {ON I OFF}.

О derived_table В предыдущем пункте было рассмотрено явное задание значений, вставляе мых в столбцы, с помощью ключевого слова VALUES. Однако этот метод с помощью одной команды INSERT позволяет вставить всего одну строку в таб лицу. Но часто бывает необходимо с помощью одной команды разместить в таблице множество строк. При этом данные обычно берутся из одной или нескольких таблиц. Конечно, вставка за раз по одной строке без возможно сти использования подзапросов требует больших затрат. Решением проблемы является вставка данных на основе результата выборки, возвращаемого обычной командой SELECT. Аргумент derived_table как раз и подразумевает использование команды SELECT, С ПОМОЩЬЮ которой должен быть подготов Глава 28. Вставка, удаление и изменение данных лен набор данных, добавляемых в»'Таблицу.;

Можно применять как: простые запросы, просто выбирающие столбцы одной таблицы, так и сложные запро сы, использующие объединение, агрегирование, различные выражения, преоб разования и т. д. Единственным требованием к результату выборки является соответствие количества и порядка возвращаемых столбцов порядку и количе ству столбцов, перечисленных в конструкции ( c o i u m n i i s t ) команды INSERT.

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

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

С помощью аргумента e x e c u t e s t a t e m e n t результат выполнения команды EXECUTE будет вставлен в таблицу. В команде EXECUTE могут выполняться как команды SELECT И READTEXT, так и хранимые проце дуры. Использование хранимых процедур для подготовки набора данных для вставки имеет ряд преимуществ. Например, можно не разрешать пользовате лям непосредственный доступ к таблицам, а ограничиться предоставлением им права на выполнение процедуры. Кроме того, при изменении логики формирования набора данных администратору достаточно будет исправить одну хранимую процедуру, и не вносить никаких изменений в клиентские приложения. Результат, возвращаемый командой EXECUTE, должен следовать всем правилам, относящимся к команде SELECT Й описанным в предыдущем пункте. В частности количество, Порядок и типы данных, возвращаемые ко мандой EXECUTE, должны соответствовать списку столбцов, указанных с по мощью конструкции (column_list).

Самый простой вариант команды INSERT можнб записать в виде:

INSERT t a b l e _ n a m e VALUES (expressions (,....n])"'' После ключевого слова VALUES В скобках должны быть перечислены значения для всех столбцов таблицы кроме столбца-счетчика (IDENTITY) И столбца times tamp. Например, для вставки новой строки в таблицу authors необходимо вы полнить команду:,.;

.:,-...

INSERT authors VALUES ('237-52-1978', "MaffiaeV, 'Evgeniy^1, '• " '390 223-3418', 'Puschkina 6', 'Abakan', 'KH','65500', 0).

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

INSERT authors (au_id, au_lname, au_fname, contract) VALUES ('238-52-1978', 'Mamaev', 'Evgeniy', 0) 1126 Часть V. Программирование В рассмотренных примерах вставляемое значение задается с помощью констант.

Нетрудно привести пример с использованием переменных:

DECLARE @Varl char(10), @Var2 char(30), @Var3 char(30) SET @Varl='239-52-1978' SET @Var2='Mamaev' SET @Var2='Evgeniy' INSERT authors (au_id, au_lname, au_fname, contract) VALUES (@Varl, @Var2, @Var3, 0) Во всех рассмотренных примерах данные для вставки были подготовлены зара нее, и их значение было известно до выполнения вставки данных. Однако такой подход позволяет вставить за одну команду только одну строку. Рассмотрим пример добавления в таблицу множества строк на основе результата выполне ния запроса. Для этого сначала создадим таблицу compactauthors:

CREATE TABLE c o m p a c t a u t h o r s ( a u _ i d c h a r ( 1 0 ), name c h a r ( 1 5 ), phone c h a r ( 1 2 ) ) Теперь вставим в созданную таблицу строки:

INSERT compactauthors SELECT au_id, CAST((RTRIM(au_lname)+ ' '+LEFT(au_fname,l)+'.') asCHAR(15)), phone F O authors W E E c o n t r a c t = l A D state='CA' RM HR N После выполнения команды в таблицу compactauthors будет добавлено трина дцать строк. Для просмотра содержимого таблицы выполним следующий запрос:

SELECT * F O compactauthors RM Будет получен результат:

au_id name phone Приведенный пример иллюстрирует формирование значений для столбца name как результата обработки столбцов aufname и auiname исходной таблицы authors. Это сравнительно простой пример. В более сложных запросах могут ис пользоваться подзапросы, множество таблиц, сложные функции агрегирования и т. д. Все это позволяет реализовывать очень сложные алгоритмы обмена данными.

Глава 28. Вставка, удаление и изменение данных Команда SELECT...INTO Команда INSERT предоставляет пользователям мощные средства закачки данных в таблицу. Однако эта команда разрешает вставлять данные только в созданную таблицу. Тем не менее, иногда бывает необходимо добавить данные в отдельную таблицу. Конечно, можно сначала создать таблицу с помощью команды CREATE TABLE и потом закачать в нее нужные данные. Но можно воспользоваться ко мандой SELECT...INTO, которая позволяет автоматически создавать новую табли цу на основе результата выборки данных.

Замечание Мы рассматриваем команду SELECT...INTO как отдельную команду, но на самом деле это просто один из режимов работы команды SELECT. Тем не менее, создание новой таблицы на основе выборки имеет специфические моменты.

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

Синтаксис команды SELECT...INTO таков:

SELECT {column_name [[AS] column_alias],...n} INTO new_table FROM {source_table,...n} [select options] Рассмотрим подробно назначение и использование каждого из аргументов:

О column_name Имя столбца одной из таблиц, указанных в списке FROM { s o u r c e t a b i e [,...n]}. Указанный столбец будет включен в результат выборки. Если имя столбца повторяется в нескольких таблицах, то необходимо дополнительно привести имя таблицы. С другой стороны, если из разных таблиц выбирается множество столбцов с одинаковыми именами, то необходимо использовать псевдонимы (alias). Дело в том, что по умолчанию в создаваемой таблице столбцы будут иметь то же имя, что и в исходной. При выборке нескольких одноименных столбцов из разных таблиц возникнет ситуация, что в одной таблице должно быть создано несколько столбцов с одинаковым именем.

Однако это недопустимо.

• [AS] column_alias С помощью этого аргумента указывается псевдоним, который будет присвоен столбцу. Псевдонимы позволяют присваивать столбцам имена, отличные от первоначальных. Использование псевдонимов необходимо при выборке не скольких одноименных столбцов из разных таблиц. Кроме того, если данные в столбе формируются не простым копированием, а после дополнительной обработки одного или более столбцов одной или более исходной таблицы, то этот столбец не имеет никакого имени. Тем не менее, при создании таблицы р ••/. Часть V. Программирование • • •••• •.••• каждому из столбйов Должно быть присвоено определенное уникальное имя.

Это можно сделать с помощью псевдонима.

О INTO new_table Указание ключевого слова INTO говорит о том, что на основе результата вы борки должна быть создана новая таблица. Если запрос выполняется без ука зания INTO, то создание таблицы производиться не станет, и результат вы борки будет выведен на экран. Имя создаваемой таблицы указывается с помощью аргумента n e w t a b i e. Необходимо убедиться, что в базе данных уже не имеется таблицы или представления с аналогичным именем. На ос нове выборки можно также создавать и временные таблицы (указав # или ## перед именем таблицы). Это предоставляет удобный механизм для времен ного хранения промежуточных данных. Например, можно в хранимой про цедуре создать локальную временную таблицу, которая станет использоваться для хранения промежуточных данных: Эта таблица будет автоматически •'-"•• уничтожаться при завершении хранимой процедуры. Кроме того, если другой ;

• пользователь вызовет эту же хранимую процедуру, будет создана вторая таб •• '' "• лица. При использовании стандартных таблиц применение команды • SELECT...INTO требует дополнительной проверки на существование в базе данных указанной таблицы. При работе с временными таблицами эту про верку выполнять не нужно, т. к. разные копии хранимой процедуры могут без проблем создавать одноименные локальные временные таблицы.

• FROM {source_table,...n) После ключевого слова FROM приводится список таблиц, из которых будут выбираться данные. Если указывается более одной таблицы, то их имена не обходимо разделить запятой. Помимо указания существующих статических таблиц, можно использовать динамические таблицы, содержимое которых формируется во время выполнения запроса на основе результата выборки, возвращаемого подзапросом.

О select_options Эта конструкция подразумевает применение различных разделов команды SELECT (WHERE, ORDER BY, GROUP BY И Т. Д.). ОдНЭКО ИСПОЛЬЗОВЭНИе ЭТИХ р а з делов не обязательно.

) Г Замечание По умолчанию создание таблицы с помощью команды SELECT...INTO запрещено.

Чтобы иметь возможность выполнить эту команду, необходимо на уровне таблицы разрешить ее выполнение. Для этого используется хранимая процедура sp_dboption 'database name', ' s e l e c t into/bulkcopy', TRUE. Вместо аргумента database^name следует подсТаЙить имя нужной базы данных.

Последний пример' прЪдьгдущегб раздела выполнял вставку в таблицу compact authors набора строк на основе результата выборки. Рассмотрим при мер использования команды SELECT...INTO, приводящий к такому же результату.

Глава 28. Вставка, удаление и изменение данных Единственное условие — необходимо гарантировать, что в базе данных уже нет таблицы или представления с именем compactauthors. Если для выполнения предыдущего примера такая таблица была создана, то ее нужно удалить с по мощью следующей команды:

DROP TABLE compactauthors После этого можно выполнять команду SELECT...INTO:

SELECT a u _ i d, CAST((RTRIM(au_lname)+' ' + L E F T ( a u _ f n a m e, 1 ) + '. ' ) as CHAR(15)) as name, p h o n e INTO c o m p a c t a u t h o r s FROM a u t h o r s WHERE c o n t r a c t s AND s t a t e = ' C A ' Как видно из примера, для второго столбца (name) был использован псевдоним, т. к. по умолчанию столбцу не присваивается никакого имени. Набор данных в таблице после выполнения приведенной команды будет идентичен набору дан ных, приведенному для последнего примера предыдущего раздела.

До сих пор были рассмотрены примеры, выполняющие выборку данных лишь из одной таблицы. Следующий пример создает временную локальную таблицу # t i t i a u t h, состоящую всего из двух столбцов. Таблица содержит информацию об авторах и написанных ими книгах. Содержимое таблицы формируется на основе запроса, обращающегося к трем разным таблицам с применением до полнительных условий выборки данных. Выборка осуществляется только для авторов, проживающих в штате Калифорния и в городах Oakland, Berkeley, Palo Alto и Menlo Park.

S L C [Фамилия]=au_fname, [Название книги]=title EE T I T tttitlauth F O titleauthor, authors, t i t l e s NO RM W E E authors.au_id=titleauthor.au_id A D HR N t i t l e s. t i t l e _ i d = t i t l e a u t h o r. t i t l e _ I D A D state='CA' A D N N city IN ('Oakland1, 'Berkeley 1, 'Palo Alto', 'Menlo Park') Просмотрим данные, которые были помещены в таблицу ittitlauth:

SELECT * F O i t i t l a u t h RM Будет получен результат:

Фамилия Название книги Johnson Prolonged Data, Deprivation: Four Case Studies Marjorie The Busy Executive's Database Guide Marjorie You Can Combat Computer Stress!

Cheryl But Is It User Friendly?

Dean Straight Talk About Computers Abraham The Busy Executive's Database Guide Ann Secrets of Silicon Valley Stearns Cooking with Computers: Surreptitious Balance Sheets Stearns Computer Phobic AND Non-Phobic Individuals Livia Computer Phobic AND Non-Phobic Individuals Sheryl Secrets of Silicon Valley (11 row(s) affected) 1130 Часть V. Программирование Изменение данных В предыдущих разделах была подробно рассмотрена вставка данных. Однако не менее важной операцией работы с информацией является и операция измене ния. Нередко бывает, что с течением времени становится необходимым внести некоторые изменения в данные.

В распоряжении пользователей имеется множество различных способов и мето дов выполнения таких изменений. Кроме того, можно просто удалить старые данные и вместо них вставить новые. Тем не менее, в Transact-SQL существует специальная команда, предназначенная для выполнения изменений данных в таблицах — команда UPDATE.

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

Рассмотрим синтаксис команды UPDATE:

UPDATE ( t a b l e _ n a m e WITH ( t a b l e _ h i n t _ l i m i t e d [... n ] ) I view_name I r o w s e t _ f u n c t i o n _ l i m i t e d } SET {column_name = { e x p r e s s i o n I DEFAULT | NULL} I Svariable = e x p r e s s i o n I @variable=column=expression} [,... n ] {{[FROM { t a b l e _ s o u r c e } [,... n ] ] [WHERE s e a r c h _ c o n d i t i o n ] } I [WHERE CURRENT OF {{[GLOBAL] cursor_name} I c u r s o r _ v a r i a b l e _ n a m e } ] } [OPTION ( q u e r y _ h i n t [,... n ] ) ] Рассмотрим назначение и использование параметров команды:

• table_name WITH (table_hint_limited [...n]) С помощью этой конструкции указывается имя таблицы, в которой необхо димо выполнить изменения. Дополнительно могут быть перечислены хинты, с помощью которых определяется режим блокирования данных в изменяе мой таблице. Структура и использование конструкции tabie_hint_iimited аналогичны работе с одноименной структурой, описанной в разд. "Команда ISERT" ранее в этой главе. Следует обратить внимание, что за одну операцию изменения могут быть модифицированы данные, находящиеся в одной таб лице. Для изменения данных множества таблиц придется выполнить команду UPDATE количество раз, равное количеству таблиц.

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

Глава 28. Вставка, удаление и изменение данных С? rowset_function_limited Этот параметр подразумевает применение функций OPENQUERY И OPENROWSET, с помощью которых задается набор изменяемых строк. Эти функции исполь зуются при изменении данных через OLE DB, особенно на удаленных ис точниках.

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

• column_name={expression I DEFAULT I NULL} С помощью этой конструкции указывается, какое значение должно быть со хранено в конкретном столбце. Имя столбца задается с помощью параметра columnname. Если для столбца приведено значение по умолчанию, то, указав DEFAULT, можно присвоить столбцу это значение. При вводе параметра NULL столбец примет неопределенное значение. Однако использование параметра NULL возможно только в том случае, если для столбца разрешено хранение значений NULL. Параметр expression подразумевает указание выражения и предназначен для присвоения столбцу произвольных значений. Выражение может представлять собой константу, имя переменной, имя столбца и т. д.

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

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

• @variable=expression При использовании этой конструкции в переменную будет занесено значе ние указанного выражения. В выражении могут использоваться имена столб цов, переменных (в т. ч. той, в которую будет сохранен результат), констант и т. д. При этом изменения самих данных не происходит. Аналогичного ре зультата можно добиться и при использовании команды SELECT.

О @variable=column=expression Данный вариант подразумевает одновременное присваивание результата вы числения выражения переменной и столбцу. Это бывает полезно при выпол нении изменений множества строк, когда значение следующей изменяемой строки зависит от значений предыдущих строк. Переменная может использо ваться для значений предыдущих строк и указываться в выражении. Указан ным способом можно легко пронумеровать строки таблицы, используя что то вроде SET @Varl=RowNum=@Varl + l.

П FROM {table_source} Если для изменения данных используются значения, хранящиеся в других таблицах, то эти таблицы можно указать в разделе FROM. Синтаксис и при менение этого раздела аналогичны использованию раздела FROM команды SELECT и было описано ранее в этой главе.

i132 Часть V. Программирование -, О W E E search_c6nditieb ;

HR Конструкция определяет логические условия, ограничивающие диапазон из меняемых строк, а также устанавливающие связи между таблицей, указанной после ключевого слова UPDATE И таблицами, указанными в разделе FROM. Ис пользование раздела WHERE И логических условий будет подробно рассмотре но в следующей главе при описании команды SELECT.

О WHERE CURRENT OF {{[GLOBAL] cursor_name } I cursor_variable_name} Эта конструкция предназначена для обновления данных в курсорах. Измене ние данных производится в текущей позиции курсора. Имя изменяемого курсора может быть указано непосредственно с помощью параметра cursorname или с помощью переменной ( c u r s o r v a r i a b l e n a m e ). Если на сервере существуют локальный и глобальный курсоры с одинаковыми име нами, то при указании ключевого слова GLOBAL будет использоваться гло бальный курсор. В противном случае изменения станут производиться в ло кальном курсоре. Перед выполнением изменений в курсоре следует убедиться, что он поддерживает изменение данных.

• OPTION (query_hint [,...n]) С помощью этого раздела пользователь может контролировать поведение оп тимизатора запросов при выполнении изменений. Синтаксис данного разде ла и описание всех параметров также будут рассмотрены в следующей главе при описании команды SELECT.

Рассмотрим несколько примеров использования команды UPDATE. Чтобы не из менять данные в таблице authors, создадим временную таблицу, в которую скопируем часть данных из этой таблицы:

SELECT au_id, au_lname, au_fname, phone INTO #auto FROM authors WHERE state='CA' AND contracts Чтобы было с чем сравнивать, выведем содержимое этой таблицы:

SELECT * FROM t a u t o Будет получен следующий результат:

-.. •.

au_id au_lnarae au_fname phone 172-32-1176 White 213-4 6-8915 Green 238-95-7766 Carson 267-41-2394 O'Leary 274-80-9391 Straight " 409-56-7008 Bennet 427-17-2319 Dull 472-27-2349 Gringlesby 486-29-1786 Locksley ;

672-71-3249 Yokomoto..' • 724-80-9391 MacFeather 756-30-7391 Karsen 846-92-7186 Hunter (13 row(s) affected! ' ' Глава 28. Вставка, удаление и изменение данных Теперь изменим данные в столбцах aulname и au_fname. В первом из них со храним сразу имя и фамилию автора, а во втором — фамилию и первую букву имени. Причем будем изменять данные только тех авторов, у которых телефон оканчивается на цифру 8:

UPDATE #auto SET au_lname=au_lname+' '+au_fname, au_fname=LEFT (au_fname,1) + '. '+au_lname W E E phone LIKE '%8' HR Теперь посмотрим результат:

au_id aulname au fname phone Johnson 496- 172-32-1176 White Marjorie 986- 213-4 6-8915 Green Cheryl 548- 238-95-7766 Carson M. O'Leary 286- 267-41-2394 O'Leary Michael Dean 834- 274-80-9391 Straight Abraham 658- 409-56-7008 Bennet A. Dull 836- 427-17-2319 Dull Ann Burt 938- 472-27-2349 Gringlesby Charlene 585- 486-29-1786 Locksley 672-71-3249 Yokomoto Akiko A. Yokomoto 935- 724-80-9391 MacFeather Stearns S. MacFeather 354- Li via 756-30-7391 Karsen 534- 846-92-7186 Hunter Sheryl S. Hunter 836- (13 row(s) affected) Часть V. Программирование DECLARE @Varl money, @Var2 int SET @Varl= UPDATE #titl SET @Varl=price=ISNULL(price,0)+@Varl*Q.l, title_id=LEFT(type,3)+ISNULL(RIGHT(CAST(@Varl as char(6)),3),'NUL') При просмотре содержимого таблицы увидим следующее:


title id title pub_id type price Так как данный пример приведен только в качестве иллюстрации возможностей Transact-SQL по изменению данных, то не стоит искать здравого смысла в рас смотренном запросе.

Глава 28. Вставка, удаление и изменение данных Будут удалены 4 строки, после чего в таблице останутся следующие строки:

title_id title pub_id type price BU2075 You Can Combat Computer Stress... 0736 business 2.99Q MC3021 The Gourmet Microwave 0877 mod_cook 2. PC9999 Net Etiquette 1389 popular_comp NULL BU1111 Cooking with Computers: Surrep... 1389 business 11. BU1032 The Busy Executive's Database... 1389 business 19. (5 row(s) affected) (" Замечание ^ Перед тем, как удалить строки, иногда бывает полезно предварительно просмотреть их. Для этого можно заменить ключевое слова DELETE на SELECT *. В ответ будет выведен список строк, которые предполагается удалить. Однако этот метод не при меним при работе с курсорами.

Механизмы массивного копирования Возможности переноса и обработки данных, предоставляемые службами транс формации данных DTS, могут быть использованы для решения самых изощрен ных задач. Но иногда бывает необходимо просто перенести в таблицу SQL Server 2000 данные из обычного текстового файла. Такой процесс называется массивным копированием (bulk copy). Особенностью массивного копирования является отсутствие любых изменений данных. Информация просто копируется из текстового файла в таблицу базы данных. Допускается использование только одного текстового файла и одной таблицы.

В SQL Server 2000 имеется очень мощная система массивной закачки данных.

Эта система даже имеет свой программный интерфейс, работающий через ODBC (ODBC BCAPI, ODBC bulk copy API). Используя этот API, независимые производители могут создавать свои собственные утилиты закачки данных или использовать его в приложениях OLE DB, ODBC, SQL-DMO или DB-Library.

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

SQL Server 2000 имеет несколько встроенных средств, с помощью которых можно выполнять массивную закачку данных:

П утилита командной строки bcp.exe;

О команда Transact-SQL BULK INSERT;

• службы трансформации данных DTS.

1136 Часть V. Программирование Замечание Массивная закачка с помощью DTS работает с API массивного копирования, а не использует утилиту bcp.exe или команду BULK INSERT, которые, в свою очередь, также обращаются к API массивного копирования.

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

Замечание Следует обратить особое внимание на перенос колонок типа timestamp и вычис ляемых колонок. Непосредственная вставка таких данных в таблицу не поддержи вается. Взамен SQL Server 2000 для колонок timestamp генерирует новые значе ния, а значения вычисляемых колонок вообще не хранятся в таблице, а получаются динамически при каждом обращении. При вставке в таблицу, имеющую колонку timestamp или вычисляемую колонку, следует изменить файл форматирования для пропуска этих колонок. При выполнении экспорта из таблицы SQL Server 2000 в текстовый файл значения для вычисляемых колонок и колонок timestamp сохра няются подобно обычным колонкам.

Область применения утилиты bcp.exe В утилите bcp.exe реализована поддержка текстовых файлов произвольного фор мата и поддержка стандарта Unicode. С помощью этой программы можно легко передавать данные между серверами SQL Server 2000 и SQL Server 7.0 с различны ми кодовой страницей, порядком сортировки и сопоставлением Unicode. Утилита bcp.exe также активно использовалась в SQL Server 7.0 при изменении на сервере одного из этих параметров. Перед тем, как изменить кодовую страницу, порядок сортировки или сопоставление Unicode производится выкачивание данных из всех таблиц в текстовые файлы и скриптование всех объектов базы данных. Затем вы полняются все необходимые изменения, и перестраиваются системные базы дан ных. Заключительным этапом является создание объектов базы данных с помо щью заранее подготовленных скриптов и последующее закачивание данных из текстовых файлов в только что созданные таблицы.

( Замечание ^ В зависимости от используемого формата текстового файла могут существовать не которые ограничения на выполнение утилиты bcp.exe. Например, при использова нии обычного текстового формата копирование данных на- различных языках будет невозможно.

Глава 28. Вставка, удаление и изменение данных Другой областью применения утилиты bcp.exe является обмен информацией с системами, не поддерживаемыми SQL Server 2000. Практически любая програм ма, работающая с данными, поддерживает работу с текстовыми файлами. Не имея возможности обмениваться данными напрямую, можно в качестве проме жуточного хранилища использовать текстовые файлы. В этом случае утилита bcp.exe может служить механизмом интеграции SQL Server 2000 с различными приложениями. Используя возможности подсистемы автоматизации, можно спланировать работу программы bcp.exe таким образом, что обмен данными бу дет происходить автоматически без участия администратора.

Импорт и экспорт данных утилитой bcp.exe Как уже говорилось, утилита bcp.exe обладает довольно высокой функциональ ностью. Конечно, отсутствие удобного графического интерфейса является зна чительным минусом, но, тем не менее, с ее помощью можно решать довольно "тяжелые" задачи переноса данных. Утилита bcp.exe может выполнять как экс порт, так и импорт данных. Как и все утилиты командной строки, параметры работы утилиты bcp.exe задаются с помощью специальных ключей. Для более детального знакомства с возможностями утилиты приведем все параметры ее запуска:

Ьср {[[database_name.][owner].]{table_name I view_name} I "query"} (in I out I queryout I format} data_file [-m max_errors] [-f format_file] [ e err_file] [-F first_row] [-L last_row] [-b batch_size] [-n] [-c] [-w] [-N] [ V (60 I 65 I 70)] [-6] [-q] [ C code_jage] [ t field_term] [ r row_term] - - [ i input_file] [-o output_file] [ a packet_size] - [ S server_name[\instance_name]] [ U login_id] [-P password] - t-T] [-v] [-R] [-k] [-E] [-h "hint [ n]"] Рассмотрим подробно назначение и использование каждого из параметров.

П database_name Независимо от того, какая конкретно выполняется операция — импорт или экспорт, этот параметр указывает базу данных, с которой будет работать утилита bcp.exe. Данный параметр не является обязательным и может быть опущен. В этом случае работа будет вестись с базой данных по умолчанию, установленной для пользователя, работающего с утилитой.

П owner Этот параметр указывает, кому принадлежит таблицы или представление, с которым будет работать утилита bcp.exe. Параметр также может быть опу щен. В этом случае SQL Server 2000 предполагает, что владельцем объекта является текущий пользователь. Если такого объекта не существует, то предполагается, что владельцем является пользователь dbo.

П table_name I view_name Имя таблицы или представления, с которыми будет работать утилита.

1138 Часть V. Программирование • "query" Утилита bcp.exe не позволяет копировать данные из нескольких таблиц, но разрешает получать их с помощью запроса. При этом автоматически создает ся временная таблица, в которую вставляются данные, получаемые в резуль тате выполнения запроса. Затем производится массивное выкачивание дан ных из этой таблицы во временный файл. Запрос разрешается указывать только при выполнении операций экспорта данных из SQL Server 2000. Ука зание имен базы данных, владельца, таблицы или представления при выбор ке данных с помощью запроса запрещается.

G in I out I queryout I format Для программы bcp.exe необходимо явно указать направление перекачивания данных. Если нужно закачать данные из текстового файла в таблицу SQL Server 2000, то указывается in. Если же выполняется экспорт данных из SQL Server 2000 в текстовый файл, то используется out. Когда же требуется зака чать в текстовый файл результат выполнения запроса, то следует применять queryout. Параметр format используется в том случае, когда нужно получить только файл форматирования, но не выполнять сам перенос.

О data_file Этот параметр задает имя текстового файла, с которым будет работать утили та bcp.exe. При выполнении импорта в SQL Server 2000 файл должен содер жать необходимые данные, если же производится экспорт, то утилита удалит указанный файл, создаст его заново и заполнит данными.

П -m max_errors В процессе переноса данных могут возникнуть ошибки, связанные с тем, что в текстовом файле указаны неверные данные. Параметр -m m a x e r r o r s управляет количеством ошибок, которое будет допускать утилита bcp.exe. Ес ли копируемая строка имеет неправильный формат, то она игнорируется.

При этом на единицу увеличивается счетчик ошибок. Когда счетчик достига ет указанной величины, процесс переноса данных прерывается и генерирует ся сообщение об ошибке. По умолчанию допускается 10 ошибок независимо от количества переносимых строк.


• -f format_file Утилита bcp.exe позволяет работать с текстовыми файлами, имеющими про извольные разделители строк и колонок. Кроме того, поддерживается работа с различными форматами самих данных. Сам текстовый файл не сбдержит никакой информации о своем формате. Эта информация должна указываться отдельно одним их трех следующих способов:

• пользователь вводит ее интерактивно, отвечая на вопросы утилиты;

• с помощью ключей форматирования -п, -с, -w, -6 и -N;

• взять ее из специального файла форматирования с расширением fmt, ко торый можно создать вручную или с помощью утилиты bcp.exe.

Глава 28. Вставка, удаление и изменение данных Если выполняется импорт данных из SQL Server 2000, то необходимо указать формат, в котором будут сохранены данные. В том случае, когда данные за качиваются в SQL Server 2000, файл форматирования определяет, как будут рассматриваться данные в файле. С помощью параметра -f f o r m a t f i l e указывается имя файла форматирования, содержащего описание структуры текстового файла. Файл форматирования может быть создан автоматически в процессе работы утилиты. Для этого используется ключ - format, описание работы которого было дано ранее. Имя файла, который должен быть полу чен, указывается в параметре -f f o r m a t f i l e. Если этот параметр опущен, то по умолчанию создается файл bcp.fmt.

П -е err_file Как уже говорилось, в процессе переноса данных могут встретиться ошибки.

По умолчанию неправильные строки игнорируются и пропускаются. Найти потом эти ошибочные строки довольно проблематично. Утилита bcp.exe по зволяет копировать неверные данные в отдельный файл. Пользователь может позже исправить несоответствия в полученном файле и добавить их в табли цу. Параметр -е e r r _ f i i e предписывает утилите сохранять неверные строки в указанном файле. Если этот параметр опущен, то файл не создается, и ин формация об ошибках не сохраняется.

О -F first_row Предположим, что вы выполняли копирование миллиона строк, и где-то на половине переноса произошел сбой. Часть данных была скопирована, а другая — нет. Утилита bcp.exe позволяет продолжить копирование с того места, на котором оно прервалось. Для этого используется параметр -F first_row. С его помощью можно явно указать, с какой строки тексто вого файла следует начинать копирование. По умолчанию копирование на чинается с первой строки файла.

П -L last_row Помимо того, что можно начать копирование с определенной строки, поль зователь также может указать до какой строки включительно следует выпол нять перенос. Используя параметр -L l a s t r o w совместно с параметром -F f i r s t r o w, можно разбить весь процесс копирования на отдельные бло ки. По умолчанию для параметра -L last_row устанавливается значение 0.

Это означает, что будут скопированы все строки, начиная с указанной в па раметре -F f irst_row, и до конца файла.

П -b batch_size Для каждой базы данных можно установить, будут ли операции вставки дан ных при выполнении массивного копирования выполняться с помощью тран закций или же они станут производиться напрямую. Вставка данных с помо щью транзакций позволяет добавить либо все данные, либо никаких. По умолчанию утилита bcp.exe вставляет все данные одним блоком. Если эта опе рация выполняется с использованием транзакций и происходит ошибка при вставке всего лишь одной строки, то производится откат всей операции встав 1140 Часть V. Программирование ки. Если осуществляется вставка нескольких сотен тысяч строк, то такой вари ант неудовлетворителен. Для решения этой проблемы утилита bcp.exe позволя ет выполнять вставку данных блоками или пакетами (batch). Пакет состоит из ограниченного количества строк. Вставка каждого пакета выполняется как от дельная транзакция. Неудачная вставка одного пакета не приведет к полной отмене массивного копирования. Весь процесс добавления разбивается на множество более мелких операций. Количество строк в пакете устанавливается с помощью параметра -ь b a t c h s i z e. Запрещается использование этого пара метра С В е Т О С Параметром -h "ROWS_REP_BATCH=nn".

О МС Н • -n Как уже говорилось, утилита bcp.exe может работать с различными формата ми текстовых файлов. Кроме того, имеется специальный формат файлов, на зывающийся исконным (native). В этом формате данные представляются имен но в том виде, в каком они хранятся в таблице SQL Server 2000. Пользова тель не должен указывать никакой информации о формате текстового файла.

Полученный файл исконного формата не может быть просмотрен напрямую в текстовом редакторе. Исконный формат обеспечивает наиболее высокую производительность операций массивного копирования. К недостаткам можно отнести несовместимость с другими приложениями. Исконные фай лы поддерживаются только серверами SQL Server. При использовании опции -п для создания текстовых файлов для SQL Server 6.x следует учесть, что ко лонки Unicode не будут восприниматься в SQL Server 6.x.

• -с Если нужно, чтобы все данные в текстовом файле были сохранены в сим вольном виде, то необходимо использовать ключ -с. Полученный файл можно просматривать в любом текстовом редакторе и использовать для лю бой системы обработки информации. Для разделения колонок применяется символ табуляции \ t, а для разделения строк — символ новой строки \п.

Если указывается ключ -с, то сведения о формате текстового файла приво дить не нужно.

• -W Результатом использования этого ключа будет создание текстового файла, в котором все данные сохранены в текстовом формате с поддержкой Unicode.

Для разделения колонок применяется символ табуляции \ t, для разделения строк — символ новой строки \п. Файлы Unicode в принципе можно про читать с помощью текстового редактора, но это связано с определенными трудностями. Кроме того, такие файлы нельзя использовать, если нужно пе редать данные в SQL Server 6.x, т. к. эти системы не поддерживают стандарта Unicode.

• -N ;

Этот формат поддерживается только утилитой bcp.exe, поставляемой с SQL Server 2000 и SQL Server 7.0. В более ранних версиях (до SQL Server 7.0) под держка этого формата не реализована. Формат является комбинацией фор Глава 28. Вставка, удаление и изменение данных.

матов, обеспечиваемых опциями -п и -w. При использовании опции -N ДЛЯ всех текстовых данных используется формат Unicode, а все другие типы дан ных представляются в исконном, внутреннем, формате SQL Server 2000. Та кой подход обеспечивает высокую производительность наряду с возможно стью хранения данных на любом национальном языке. Поэтому такие файлы часто применяются для переноса данных между серверами SQL Server 2000.

Недостатком является то, что полученные текстовые файлы могут быть ис пользованы только в SQL Server 2000.

О [-V (60 I 65 | 70)] Задание этой опции предписывает утилите использовать типы данных, со вместимые с SQL Server указанной версии. Эта возможность не существовала в более ранних версиях утилиты bcp.exe.

• - Если подготавливаемый текстовый файл предназначен для SQL Server 6.x, то использование ключа -б предпишет утилите bcp.exe представлять данные в формате, доступном SQL Server 6.x. В противном случае не гарантировано, что все типы данных будут правильно считаны. Опция -6 может использо ваться совместно с опциями -с и -п.

( Замечание ) При копировании данных в SQL Server 6.x следует учесть, что в этой версии для по лей типа b i t не поддерживается значение NULL, поэтому утилита bcp.exe заменит NULL на 0. Кроме того, при переносе полей типа datetime и smalldatetime дан ные всегда сохраняются в формате ODBC, а не в формате SQL Server 6.x. Поэтому могут возникнуть проблемы при переносе информации о дате и времени.

• -q Если имя таблицы или представления, с которым будет работать утилита bcp.exe, содержит недопустимые символы, например пробелы, то имя должно заключаться в двойные кавычки. Дополнительно необходимо указать ключ -q, чтобы утилита восприняла значения в кавычках как имена объектов.

• -С code_page При переносе данных, не поддерживаемых Unicode (колонки типа t e x t, varchar и char), требуется явно указать, к какой кодовой странице они при надлежат. Однако этого можно не делать, если не используются символы ко дом ниже 32 или выше 127. Для установки кодовой страницы предназначен ключ -с. Аргумент code_page может принимать одно из следующих значений:

• ОЕМ. Кодовая страница, установленная на локальном компьютере. Если опция -с не указана, то по умолчанию утилита bcp.exe работает именно в этом режиме.

• АСР. Кодовая страница 1252 (ISO 1252, ANSI/Microsoft Windows).

• RAW. При указании этого параметра данные записываются в "сыром" (raw) виде. Никакое преобразование не выполняется. Это позволяет достичь •(142 Часть V. Программирование максимальной производительности. Часто используется при работе с дан ными на однотипных серверах.

• vaiue. В этом случае необходимо указать конкретный номер кодовой страницы, в соответствии с которым будет выполнено преобразование данных.

О -t field_term С помощью опции -t можно указать произвольный разделитель для коло нок. По умолчанию используется символ табуляции (\t).

D -r row_term С помощью опции -г можно указать произвольный разделитель для строк.

По умолчанию используется символ перевода строки (\п).

П -i input_file, Если при запуске утилиты bcp.exe не указан ни один из параметров формата файла (ключи -п, -с, -w, -N или -б), то пользователь для каждой колонки должен будет вручную ввести информацию о типе данных и его размерно сти. Утилита bcp.exe позволяет автоматизировать процесс ввода информации о форматировании данных. Для этого применяется файл ответов (response file). Это не то же самое, что файл форматирования. Файл ответов заменяет клавиатурный ввод, тогда как файл форматирования используется напрямую.

Это можно сравнить с работой средств перенаправления MS-DOS, в частно сти символа.

О -о output_file Помимо того, что утилита bcp.exe позволяет не вводить данные с клавиату ры, а брать их из файла, она имеет возможность сохранять в отдельный файл всю информацию, выводимую в процессе работы на экран. Это сравнимо с использованием символа при работе со средствами перенаправления MS DOS. Запись информации в файл может понадобиться при автоматическом запуске утилиты bcp.exe. Если в ходе ее работы произошли какие-либо ошибки, то администратор может позже проанализировать полученную ин формацию. Кроме того, если утилита выводит на экран много сообщений, не помещающихся на один экран, то также можно перенаправить их в файл.

П -a packet_size Если утилита bcp.exe выкачивает данные из удаленного сервера, то не избе жать использования сетевых протоколов. С помощью опции -а можно управлять размером пакета, передаваемого по сети. По умолчанию устанав ливается минимальный размер пакета, равный 4096 байтам. Максимальный размер пакета равен 65 535 байт.

( Замечание ^ Данные по сети передаются пакетами, размер которых может меняться. Скорость передачи данных зависит от размера пакета. Чем больше пакет, чем меньше управ ляющей информации приходится на один байт данных и тем выше скорость пере Глава 28. Вставка, удаление и изменение данных дачи данных. С другой стороны, повреждение пакета потребует повторной передачи данных. Если работа сети нестабильна и часто происходят сбои при передаче дан ных, то слишком большой размер пакета может существенно снизить производи тельность. Чтобы избежать этого, утилита bcp.exe может автоматически уменьшать размер пакета вплоть до минимального размера (4096 байт). Средний размер паке та за всю работу утилиты выводится после завершения переноса данных.

• -S server_name[\instance_name] Если требуется скопировать данные с удаленного сервера, то следует явно указать его имя. Для этого используется опция -s. Если данные будут копи роваться с локального сервера, то использование этой опции необязательно, т. к. по умолчанию утилита bcp.exe работает с локальным сервером. При не обходимости следует указать имя инсталляции, с которой нужно работать.

О -U login_id С помощью этой опции указывается имя учетной записи SQL Server 2000, под которой будет работать утилита bcp.exe. Утилита сможет скопировать только те данные, к которым имеет доступ используемая учетная запись. Яв ное указание имени учетной записи в командной строке требуется при авто матическом запуске утилиты bcp.exe. Это позволит предоставить утилите фиксированный набор прав доступа, не зависящих от того, какой пользова тель работает в конкретный момент на компьютере.

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

П -т Эта опция предписывает утилите bcp.exe для соединения с сервером SQL Server 2000 использовать доверительное соединение. То есть права доступа утилиты bcp.exe будут соответствовать правам доступа учетной записи Win dows NT пользователя, запустившего утилиту. При этом значения опций -и и -р будут проигнорированы.

( Замечание ^ Использование опции -т необходимо лишь в том случае, если явно указана опция -и. Если опция -и отсутствует, то по умолчанию устанавливается доверительное соединение с правами учетной записи Windows NT пользователя, запустившего ути литу bcp.exe, и нужды в использовании опции -т нет.

• -V С помощью этого ключа можно получить информацию о версии утилиты bcp.exe.

у 144 Часть V. Программирование ' ' • -R По умолчанию утилита bcp.exe игнорирует региональные установки, сделан ные администратором для данных времени, даты, валюты, десятичных зна чений и других параметров. Получаемый текстовый файл будет иметь всегда один и тот же формат данных, независимо от региональных установок. Это позволяет стандартизировать операции обмена данными между серверами с различными значениями региональных установок. Но в некоторых случаях все же требуется, чтобы данные в текстовом файле соответствовали значени ям региональных установок. Для этого необходимо использовать опцию -R.

• -к При указании этого ключа для пустых колонок текстового файла в таблицу станет добавляться значение NULL. В противном случае в таблицу будет вставлено значение по умолчанию, определенное для соответствующей ко лонки.

• -Е Если в таблице, в которую осуществляется вставка данных, имеется колонка с установленным свойством IDENTITY, TO ПО умолчанию при вставке каждой новой строки значение в этой колонке будет генерироваться автоматически SQL Server 2000. То есть значения для колонки IDENTITY В текстовом файле и колонке таблицы будут разными. Но часто бывает, что нужно вставить данные в колонку IDENTITY таким образом, чтобы они были идентичны дан ным в текстовом файле. Чтобы добиться этого, при запуске утилиты bcp.exe необходимо указать ключ -Е.

П -h " h i n t [,...n] " Ключ позволяет выполнить некоторые дополнительные операции предвари тельной обработки данных перед вставкой их в таблицу. Управление этими операциями осуществляется с помощью специальных ключевых слов или xunmoe (hint). Допустимы следующие хинты:

• CHECKCONSTRAINTS. По умолчанию при вставке данных проверка ограни чений целостности (constraints) не выполняется. Использование этого хин та заставит сервер произвести проверку на соответствие данных установ ленным ограничениям целостности. Если данные не соответствуют од ному из установленных ограничений целостности, то вставка не осущест вляется.

• ORDER (column [ASC | DESC] {,... n ] ). По умолчанию считается, что данные в текстовом файле не отсортированы. Если же при создании тек стового файла данные не были упорядочены, то с помощью этого хинта можно указать их порядок сортировки в файле. В хинте указывается имя колонки (column), по которой выполнена сортировка и порядок сорти ровки — по возрастанию (ASC) ИЛИ убыванию (DESC). Указание порядка сортировки данных в текстовом файле в некоторых случаях может суще ственно повысить производительность операций вставки. Однако следует обратить внимание, что повышение производительности будет достигнуто Глава 28. Вставка, удаление и изменение данных / лишь в том случае, если сортировка выполнена по колонке, участвующей в кластерном индексе (clustered index). Если же указывается имя колонки, не участвующей в кластерном индексе или неправильное имя, то хинт ORDER игнорируется, и вставка данных производится в обычном режиме.

• TABLOCK. Применение этого хинта заставит SQL Server 2000 блокировать таблицу, в которую осуществляется вставка данных, на все то время, пока выполняется процесс массивного копирования. Блокирование таблицы позволяет повысить производительность операций вставки, т. к. управле ние блокировками осуществляется не на уровне отдельной строки или страницы, а на уровне таблицы. Это позволяет резко снизить затраты на ведение журнала блокировок. Недостатком блокирования является огра ничения доступа к данным обычного пользователя. В то же время, ис пользование хинта TABLOCK разрешает вставлять данные в таблицу не скольким процессам массивного копирования. Однако добавление данных несколькими процессами возможно только в том случае, если в таблице не определены индексы. Для каждой таблицы может быть уста новлено индивидуальное значение по умолчанию для хинта TABLOCK. ЭТО регулируется С ПОМОЩЬЮ ОПЦИИ " t a b l e l o c k on b u l k l o a d ".

• KILOBYTES_PER_BATCH=CC. С помощью этого хинта можно явно указать, какой размер в килобайтах должен иметь пакет. Значение по умолчанию для этого параметра не определено.

• ROWS_PER_BATCH=bb. В отличие от предыдущего этот хинт определяет раз мер пакета не в килобайтах, а в строках. Операции переноса данных будут оптимизированы для указанного значения. Запрещается использование этого хинта совместно с опцией -ь. Значение по умолчанию для хинта ROWS_PER_BATCH не определено.

'ч Замечание ) При работе с текстовыми файлами исконного формата (native format), подготовлен ными в SQL Server 6.x, использование хинтов не поддерживается.

Формат файлов утилиты bcp.exe Как уже говорилось, генерируемые утилитой bcp.exe текстовые файлы могут иметь разные форматы. Выбор конкретного формата зависит от целей экспорта.

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

Текстовые файлы, имеющие символьный формат, могут быть использованы практически в любой системе обработки информации, в текстовых процессорах, 1146 Часть V. Программирование электронных таблицах и так далее. Рассмотрим пример получения текстового файла, данные в котором будут представлены визуально:

bcp "pubs..discounts" out discounts.txt -с ( Замечание ^ Напомним, что для получения текстового файла в символьном формате необходимо указать ключ -с.

Эта команда выполняет экспорт данных из таблицы discounts базы данных pubs. Таблица содержит три строки. В результате выполнения команды будет получен текстовый файл d i s c o u n t s. t x t, при просмотре которого можно будет увидеть следующее:

I n i t i a l Customer 10. Volume Discount 100 1000 6. Customer Discount 8042 5. В файле имеется ПЯТЬ КОЛОНОК: discounttype, s t o r _ i d, lowqty, highqty И d i s count. По умолчанию колонки разделяются символом табуляции (\t), а стро ки — символом начала новой строки (\п). При необходимости в качестве разде лителей могут быть использованы и другие символы.



Pages:     | 1 |   ...   | 28 | 29 || 31 | 32 |   ...   | 33 |
 





 
© 2013 www.libed.ru - «Бесплатная библиотека научно-практических конференций»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.