|
По материалам статьи Marcin Policht: SQL Server 2000 DTS Part 9 - DTS Designer Tasks В нашей предыдущей
статье, мы начали рассмотрение основных принципов и
возможностей задачи Transform Data Task. Мы продолжаем эту
тему, сосредоточившись на её более "тонких" особенностях. Мы
уже описали цели четырех закладок Transform Data Task
Properties, реализующих наиболее распространённые сценарии
использования этой задачи, не обращаясь к теме использования
многопроходной, стадийной обработки данных. SELECT Shippers.ShipperID, Shippers.CompanyName, Shippers.Phone, COUNT(OrderID) AS Orders FROM Shippers INNER JOIN Orders ON ShipVia = ShipperID GROUP BY Shippers.ShipperID, Shippers.CompanyName, Shippers.Phone Так как мы используем в качестве получателя данных базу tempdb, вероятно Вам потребуется обновить таблицу - адресат данных (иначе Вы получите сообщение об ошибке, указывающее на то, что получающая данные таблица не существует). Чтобы проверить так ли обстоит дело, посмотрите содержание закладки Destination. Если структура таблицы не указана, нажмите кнопку Create..., и вставьте следующий SQL скрипт: CREATE TABLE [ShippersOrders] ( [ShipperID] int NOT NULL, [CompanyName] nvarchar (40) NOT NULL, [Phone] nvarchar (24) NULL, [Orders] int) Далее, перейдите на закладку Transformations и обратите
внимание на то, что появилось новое поле со списком "Phases
filter", в котором по умолчанию, указано значение "Row
transform", так как это было единственно возможным значением в
SQL Server 7.0. Вы можете легко проверить, что этот список
содержит много других значений, соответствующих всем возможным
стадиям (и подстадиям) Transform Data Task. Чтобы исследовать
максимум функциональных возможностей многофазной трансформации
данных, мы будем использовать ActiveX скрипт, так что удалите
все уже существующие преобразования с помощью кнопки Delete.
Нажмите кнопку New и убедитесь, что выбрано значение ActiveX
Script для создания нового преобразования, и подтвердите Ваш
выбор. В диалоговом окне Transformation Options, вызываемом
кнопкой Edit, Вы увидите дополнительную закладку с именем
Phases. На ней Вы можете определить какие стадии (и подстадии)
будут использоваться в преобразовании. Как говорилось раньше,
была установлена функция Row transform, и Мы её можем довольно
просто изменить. Настройте содержание закладок Source и
Destination так, чтобы все имеющиеся поля были внесены в
список отбора полей. Перейдите опять на закладку General окна
Transformation Options и нажмите кнопку Properties .... Вы
увидите диалоговое окно ActiveX Script Transformation
Properties, со всеми стадиями, внесенными в список на закладке
Phases (новая закладка должна появиться в нижней - левой части
диалогового окна). Отметьте все чекбоксы с левой стороны окна,
и автоматически сгенерируйте код, нажав кнопку Auto Gen. Как
только Вы это сделаете, код появится в правой части
окна.
Разделение обработки на стадии обеспечивает несколько
преимуществ. Вы получаете больше контроля над манипуляцией
данными и возможность обработки ошибок с восстановлением.
Преобразование может быть повторно начато с места сбоя, без
повторной загрузки уже обработанных данных. Function PreSourceMain() PreSourceMain = DTSTransformstat_OK End Function Function Main() DTSDestination("Orders") = DTSSource("Orders") DTSDestination("Phone") = DTSSource("Phone") DTSDestination("CompanyName") = DTSSource("CompanyName") DTSDestination("ShipperID") = DTSSource("ShipperID") Main = DTSTransformStat_OK End Function Function TransFailureMain() TransFailureMain = DTSTransformstat_OK End Function Function InsertSuccessMain() InsertSuccessMain = DTSTransformstat_OK End Function Function InsertFailureMain() InsertFailureMain = DTSTransformstat_OK End Function Function BatchCompleteMain() BatchCompleteMain = DTSTransformstat_OK End Function Function PumpCompleteMain() PumpCompleteMain = DTSTransformstat_OK End Function Function PostSourceMain() PostSourceMain = DTSTransformstat_OK End FunctionВначале, создадим глобальную переменную DTS пакета с именем "LogFile", перейдя в диалоговое окно Package Properties (как это делается, описывалось в одной из предыдущих статей) и выбрав тип "строка" с каким - либо значением (например, "d:\logs\MPDPump.log" - который нужно предварительно создать). После этого, измените ActiveX скрипт, следующим образом: ' Copy each source column to the destination column Function PreSourceMain() Const Overwrite = TRUE Set oFSO = CreateObject("Scripting.FileSystemObject") Set oLogFile = oFSO.CreateTextFile(DTSGlobalVariables("LogFile").Value, Overwrite) DTSGlobalVariables("TotalBatches").Value = 0 DTSGlobalVariables("TotalRows").Value = 0 oLogFile.Close Set oFSO = Nothing PreSourceMain = DTSTransformstat_OK End Function ' Copy each source column to the destination column Function Main() DTSDestination("Orders") = DTSSource("Orders") DTSDestination("Phone") = DTSSource("Phone") DTSDestination("CompanyName") = DTSSource("CompanyName") DTSDestination("ShipperID") = DTSSource("ShipperID") DTSGlobalVariables("TotalRows").Value = _ DTSGlobalVariables("TotalRows").Value + 1 MsgBox "Row #: " & DTSGlobalVariables("TotalRows").Value Main = DTSTransformStat_OK End Function Function TransFailureMain() TransFailureMain = DTSTransformstat_OK End Function Function InsertSuccessMain() InsertSuccessMain = DTSTransformstat_OK End Function Function InsertFailureMain() InsertFailureMain = DTSTransformstat_OK End Function Function BatchCompleteMain() DTSGlobalVariables("TotalBatches").Value = _ DTSGlobalVariables("TotalBatches").Value + 1 MsgBox "Batch #: " & DTSGlobalVariables("TotalBatches").Value BatchCompleteMain = DTSTransformstat_OK End Function Function PumpCompleteMain() Const ForReading = 1, ForWriting = 2, ForAppending = 8 Set oFSO = CreateObject("Scripting.FileSystemObject") Set oLogFile = oFSO.OpenTextFile(DTSGlobalVariables("LogFile").Value, ForWriting) oLogFile.WriteLine "Total Rows:" & vbTab & DTSGlobalVariables("TotalRows").Value oLogFile.WriteLine "Total Batches:" & vbTab & DTSGlobalVariables("TotalBatches").Value oLogFile.Close Set oFSO = Nothing PumpCompleteMain = DTSTransformstat_OK End Function Function PostSourceMain() PostSourceMain = DTSTransformstat_OK End Function Этот простой пример демонстрирует разделение записей на блоки, и сохранение общего числа блоков и записей в файл журнала. Он призван помочь Вам создавать свои, более сложные пакеты. Также, Вы можете изучить главу Phased Transformation Samples в SQL Server 2000 Books Online для получения дополнительной информации на эту тему (Вы найдете там примеры, демонстрирующие TransformFailed и InsertFailed). В следующей статье, мы рассмотрим ещё две задачи DTS. |
Перевод: Александра Гладченко 2004г. |