SQL Server в вопросах и ответах

Журнал "Windows 2000 Magazine", #03/2000

В: У меня на разных компьютерах установлено два SQL Server 7.0. Для обмена данными между ними я использовал Data Transformation Services (DTS), чтобы импортировать данные на компьютер-адресат. Выбрав нужные данные, я начал передавать их, и DTS выдал сообщение, что все объекты и данные импортированы успешно. Однако поля типа VARCHAR, ранее содержавшие 500-1000 слов, теперь, на компьютере-получателе, были установлены в NULL. Некоторые записи содержали кавычки, и я предположил, что сервер "споткнулся" на этом. Однако если дело в кавычках, то SQL Server должен был бы корректно импортировать остальные данные - не содержащие кавычек. В чем моя ошибка?

О: Действительно, у DTS бывают сбои при обработке длинных символьных полей из больших массивов входных данных. Иногда эту проблему можно решить, убрав флажок Fast Load на закладке Advanced диалога Transformation Task Properties. Если не поможет, стоит попробовать использовать для импорта данных bulk copy program (bcp). Хотя bcp не так проста в применении, как DTS, это позволит избежать подобных ошибок. Для примера стоит прочитать статью Microsoft "BUG: DTS Transfer Does Not Report Error When Input File is Missing Text Qualifier in Last Row" http://support.microsoft.com/support/kb/articles/q241/7/61.asp, где подтверждается, что при передаче данных DTS не выдает сообщение об ошибке при импорте последней строки входного файла в таблицу SQL Server, если входной файл содержит текстовые описатели, а в последнем столбце такой описатель пропущен. Чтобы обойти это препятствие, следует вручную отредактировать входной файл.

Кроме того, описанную проблему могли вызвать системные настройки по обработке значений Null. Вопреки стандарту ANSI, SQL Server по умолчанию создает столбцы, не принимающие значений Null, если только явно не использовать соответствующие объявления в операторах CREATE TABLE или ALTER TABLE.

Странно, но и ODBC и OLE DB обходят эту установку. Можно попробовать использовать различные опции для тонкой настройки работы с Null. На уровне базы данных для выбора метода работы (ANSI, или режим обратной совместимости SQL Server) можно применять функцию sp_dboption. Кроме того, имеется возможность менять параметры установок конкретного сеанса связи с базой, с помощью команды Transact SQL (T-SQL) SET ANSI_NULL_DFLT {ON | OFF}, а для определения текущих установок обработки Null пользоваться функцией GETANSINULL().

В: Что такое утилита ScriptPkg в Data Transformation Services (DTS) и где ее найти?

О: Стандартный редактор пакетов Packag Designer из DTS имеет графический пользовательский интерфейс и построен на технологии COM. К сожалению, это средство не такое гибкое, как хотелось бы большинству разработчиков. Наибольшие нарекания у потребителей вызывает отсутствие в DTS удобного редактора сценариев. При возникновении проблем с пакетами DTS выясняется, что сообщения об ошибках DTS, которые SQL Server пишет в файл ошибок, - довольно туманные и почти бесполезные. Утилита ScriptPkg позволяет интегрировать пакет DTS в среду Visual Basic (VB). ScriptPkg - свободно распространяемое средство VB, которое можно использовать для генерации файлов VBScript для пакета DTS. Эта утилита поставляется на SQL Server 7.0 CD-ROM, но она так хорошо спрятана, что большинство пользователей о ней не знают. Чтобы найти и установить данную утилиту (на компьютере с VB 6.0), нужно сделать следующее.

  1. Распаковать файл DTSDemo.exe из каталога \DevTools\Samples\DTS на SQL Server 7.0 CD-ROM.
  2. В поддиректории Designer запустить проект VB - ScriptPkg.vbp.
  3. Из меню File в VB создать исполняемый файл под именем ScriptPkg.exe, как показано на Экране 1.
  4. Сформировать пакет DTS в SQL Server 7.0 Enterprise Manager, сохранить его на локальном SQL-сервере.
  5. Запустить ScriptPkg.exe, и ввести имя пакета. ScriptPkg создаст сценарий (например, packagename.txt) в каталоге \temp.
  6. Скопировать код из файла-сценария в свое VB-приложение. Добавить в свое приложение библиотеки Microsoft ActiveX Data Objects (ADO) версии 2.1 или выше и Microsoft DTS Package Designer, или поэкспериментировать с тремя примерами VB DTS в каталоге \DevTools\Samples\DTS folder.

ScriptPkg записывает весь пакет DTS как одну процедуру, а размер процедуры в VB не может быть более 64 Кбайт. Поэтому, если сценарий ScriptPkg больше чем 64 Кбайт, надо вручную разбить его на несколько частей.

ScriptPkg - это мощное диагностическое средство, которое к тому же позволяет научиться DTS-программированию с применением технологии COM. Вы можете использовать ScriptPkg, чтобы изучить недокументированные возможности DTS. В дальнейшем знание VBScript пригодится Вам в решении задач администрирования SQL Server.

В: Я открыл небольшую телекоммуникационную фирму. Microsoft Visual FoxPro использовался мною в качестве среды разработки приложений и хранения данных. Я хотел бы импортировать ряд приложений в SQL Server. Однако мои приложения связаны с UDF, и я не знаю, как определить их в SQL Server. Я просматривал группы новостей и читал SQL Server 7.0 Books Online (BOL). Так поддерживает ли SQL Server 7.0 UDF или нет?

О: Совсем как в анекдоте - две новости: хорошая и плохая. Начну с плохой - SQL Server 7.0 функции UDF не поддерживает. Теперь хорошая новость: UDF будет поддерживать SQL Server 2000, который сейчас находится в стадии бета-тестирования. Между тем можно эмулировать UDF при помощи хранимых процедур, написанных на T-SQL, но этот метод многим представляется достаточно трудоемким и неэффективным.

Развивая затронутую Вами тему, отмечу, что пользователи FoxPro могут встречать следующие два сообщения об ошибках: "The Microsoft FoxPro driver is no longer supported and has been replaced by the Microsoft Visual FoxPro driver" и "Could not find installable ISAM." Для прояснения ситуации читайте статью Microsoft "PRB: FoxPro ODBC Driver Replaced by Visual FoxPro ODBC Driver" (пп. "Драйвер ODBC FoxPro заменен драйвером Visual FoxPro") http://support.microsoft.com/support/kb/articles/q235/3/57.asp.

В: С помощью каких средств были созданы данные для приложения FoodMart, которое поставляется вместе с Microsoft SQL Server OLAP Services (MSOLAP)? Почему для данных FoodMart использовалась база данных Access, а не таблицы SQL Server?

О: Microsoft поставляет данные для приложения FoodMart в формате .mdb потому, что не у каждого, кто желает использовать MSOLAP, есть установленный SQL-сервер. Многие забывают, что MSOLAP работает не только с SQL-сервером, но и с другими базами данных, например с такими, как Oracle8i. Поставка FoodMart в формате .mdb позволяет экспериментировать с MSOLAP без установки SQL-сервера. Наконец, если Вы планируете создать приложение на базе хранилища данных от Microsoft, то можете попрактиковаться, используя данные FoodMart в формате SQL-сервера. На Web-сайте SQL-сервера (http://www.microsoft.com/sql/productinfo/evalexercises.htm) можно взять несколько самораспаковывающихся и самонастраивающихся упражнений (см. Таблицу 1). На этом же сайте есть ознакомительные упражнения, которые помогут изучить методы репликации и модернизации.

В: Я установил новый экземпляр SQL Server 2000, и все утилиты SQL Server 7.0 пропали. Как мне их вернуть?

О: Хотя на одном компьютере можно запускать несколько экземпляров SQL-сервера, оставить на нем разные версии утилит нельзя. С новой версией SQL Server придется использовать соответствующие версии утилит (Query Analyzer, SQL Enterprise Manager, SEM, Microsoft Data Access Components, MDAC) для работы с SQL Server 7.0. Не устанавливайте новые экземпляры, если не хотите потерять старые версии утилит.

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

В: Я хотел бы хранить описания полей таблиц, их основных свойств, а также бизнес-свойств. Например, если у меня есть столбец OrderDate в таблице Orders, я должен знать, содержит ли поле дату размещения заказа клиентом или в нем указана дата исполнения заказа. Как это сделать с помощью Microsoft Repository?

О: SQL Server 2000 позволяет хранить дополнительные свойства многих типов объектов базы данных. Дополнительные свойства определяются пользователем и имеют тип SQL_ VARIANT. Программисты, работающие с VB, знакомы с типом данных VARIANT. Подобно типу данных в VB, SQL_VARIANT позволяет хранить различные типы данных в поле, параметре или переменной. Каждый экземпляр столбца SQL_VARIANT состоит из двух частей: собственно данные и метаданные, описывающие значение (например базовый тип данных поля, максимальный размер, точность и collation - сопоставление). Для получения мета-данных экземпляра SQL_VARIANT можно использовать функцию SQL_VARIANT_ PROPERTY.

Например, чтобы сохранить описание столбца au_id в таблице authors в базе данных pubs, нужно щелкнуть правой кнопкой мыши на имени столбца в окне Object Browser (новый интерфейс Query Analyzer), затем выбрать Extended Properties. Теперь следует добавить новое свойство WhatAmI и внести значение "I am the author id column!!!". То же самое можно сделать, используя процедуру sp_addextendedproperty:

sp_addextendedproperty 'WhatAmI2','This is a new property value','user', dbo, 'table', authors, 'column', au_id

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

SELECT * FROM ::fn_listextendedproperty(NULL, 'user', 'dbo','table','authors', 'column', default)

Objtype objname name            value
COLUMN  au_id           WhatAmI         I am the author id column!!!
COLUMN  au_id           WhatAmI2        This is a new property value
SELECT * FROM ::fn_listextendedproperty(NULL,'user','dbo','table', 'authors', 'column',default)

В: Я имею сертификат MCSE и собираюсь получить сертификат администратора БД (MCDBA). Я знаю, что для развертывания приложений SQL Server недостаточно прочитать специальную литературу. Тем не менее могли бы Вы рекомендовать какие-то источники информации для начинающих? У меня уже есть "Microsoft SQL Server 7.0 System Administration Training Kit" (Microsoft Press, 1999) и William Robert Stanek's "Microsoft SQL Server 7.0 Administrator's Pocket Consultant" (Microsoft Press, 1999).

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

Чтобы приобрести дополнительный опыт, импортируйте необработанные статистические данные в новую базу данных MS SQL или OLAP куб и представьте, что Вы - конечный пользователь, который хочет проанализировать данные. Изучите OLAP и приложение Food Mart. Можно поэкспериментировать с приложением "Duwamish" - его Вы найдете в Microsoft Developer Network (MSDN). Установите и исследуйте его в целом и покомпонентно, пересоберите. Более полную информацию и примеры Вы найдете на сайте Microsoft: http://msdn.microsoft.com/voices/sampleapp.asp и http://msdn.microsoft.com/library/techart/d35vbaroot.htm.

Помимо этого, стоит присоединиться к группе новостей news://msnews.microsoft.com/microsoft.public.msdn.duwamish, а также посмотреть новые примеры приложений - Fitch и Mather Stocks на сайте http://msdn.microsoft.com/library/techart/fm2kintro.htm

В: Я писал хранимую процедуру и столкнулся с проблемой при использовании оператора TOP с локальной переменной вместо фиксированного числа. Например, когда я пишу:

DECLARE @Counter INT
SELECT @Counter=5
SELECT TOP @Counter * FROM <mytable>
процедура возвращает ошибку. Но строка
SELECT TOP 5 * FROM <mytable>
работает. Что делать в таком случае?

О: Согласно SQL Server Books Online (BOL), можно использовать N в разделе TOP, чтобы ограничить количество строк, возвращаемых в результате исполнения SELECT запроса. Но N должно быть числом типа integer. В SQL Server 7.0 язык Transact SQL (T-SQL) не позволяет задействовать локальную переменную в разделе TOP N, даже если та имеет тип integer. Локальные и глобальные переменные можно идентифицировать с помощью префиксов: @ - для локальных и @@ - для глобальных переменных. Можно также использовать оператор SET, чтобы присвоить значение локальной переменной, или же определить локальные переменные, ссылаясь на них в списке полей оператора SELECT. Следующий пример, вероятно, поможет решить Вашу задачу:

DECLARE @counter INT
DECLARE @sql VARCHAR(255)
SET @Counter=5
SELECT @sql = <SELECT TOP < + str(@counter) + < * FROM authors>
EXEC (@sql)

Это T-SQL-предложение динамически строит и выполняет строку T-SQL, возвращающую первые N строк запроса. Динамический T-SQL позволяет создавать такие команды T-SQL, которые невозможно применять при использовании стандартных T-SQL методов.

В: Как использовать функции, определяемые пользователем (UDF) с SQL Server 2000?

О: Использование UDF в хранимых процедурах позволяет переместить дополнительную бизнес-логику приложения на сервер. При разработке SQL Server 2000 специалисты Microsoft собирались включать поддержку для независимых от языка UDF (например, UDF, записанное в VBScript). К сожалению, в силу существующих программных ограничений, UDFs пока можно создавать лишь на языке SQL (T-SQL). Приведу пример из SQL Server 2000 Books Online (BOL), показывающий, как используется типичная UDF, написанная на T-SQL:

CREATE FUNCTION CubicVolume
-- Входные размеры в сантиметрах.
 (@CubeLength decimal(4,1),
 @CubeWidth decimal(4,1),
 @CubeHeight decimal(4,1) )
RETURNS decimal(12,3) - Cubic centimeters.
AS
BEGIN
 RETURN ( @CubeLength * @CubeWidth * @CubeHeight )
END

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

Карен Уоттерсон

независимый журналист, редактор и консультант по клиент-серверным системам и хранилищам данных. Ей можно написать по адресу: karen_watterson@msn.com.

Брайан Моран

президент группы пользователей и директор по технологиям СУБД Spectrum Technology Group. Имеет сертификаты MCSE, MCSD и MCT. Ему можно написать по адресу: brian@spectrumtech.com.

Таблица 1. Microsoft SQL Server OLAP Services.
Ознакомительные упражнения.

File Size Description
SQL7Set.exe 356 Кбайт Обучение установке SQL-сервера.
FoodMart.exe 4,9 Мбайт Установка примера базы данных English Query.
DataTraS.exe 283 Кбайт Обучение работе с Data Transformation Services (DTS) для to перемещения данных из одной базы в другую.
LAPServ.exe 650 Кбайт Обучение возможностям MSOLAP 7.0 через построение многомерной базы данных, которую затем можно использовать для быстрого анализа больших массивов данных.