Як зробити Data Transformation, щоб вказувати будь-який сервер

Привіт, у MS SQL Server є DT Service. І є консольна програма dtsrun.exe, яка в якості параметра може приймати ім'я сервера, ім'я БД…

При створенні самого DTS там у формах вибирається сервер та БД. Тобто ніби жорстко туди зашиваються.

Запитання: Як здати DTSку, яка б запускалася з параметрами переданими dtsrun (dtsrun.exe /S«Server» итд…)?

На такий рядок: %PROGRAMFILES%MICROSOFT SQL SERVER80TOOLSBINNdtsrun.exe /S%1 /U%2 /P%3 /R%4 /F%

5skor_exp.dts лається DTSRun: Loading&#133

Error: 2147217355 (80041035); Provider Error: 0 (0) Error string: General error 2147217355 (80041035). Error source: Microsoft Data Transformation Services (DTS) Package Help file: sqldts80.hlp Help context: 705

"%PROGRAMFILES%\MICROSOFT SQL SERVER\80\TOOLS\BINN\dtsrun.exe" /U"sa" /P "" /f%

> приймати ім'я сервера, ім'я БД…Не може приймати ім'я БД.

> Тобто ніби жорстко туди зашиваються.А ти не зашивай жорстко. Використовуйте, наприклад, глобальні змінні, які можна передати в командному рядку dtsrun.

З глобальних змінних можеш встановити властивості коннектів у пакеті за допомогою Dynamic Properties Task

> Не може приймати ім'я БД. А ключ R це що? Що таке Repository Data base name?

Завдання приблизно таке: Є сервери з різними іменами, на серверах однакові структурою БД з різними іменами.

Тобто Сервер: А БД Б. Сервер: У БД: Р.

Існує програма П, яка знає як називається необхідний сервер і необхідна БД.

Завдання запустити ДТС для сервера і БД, хто вкаже (у параметрах ком рядка) програма П.

Як таке зробити, навчи.

> А ти не зашивай жорстко.А як там у меню вибираєш сервер і БД зі списку.

> Є програма П, яка знає як потрібний сервер > та потрібна БД. > > Завдання запустити ДТС для сервера і БД, хто вкаже (у параметрах ком рядка) програма П.Створюєш пакет, зберігаєш його де-небудь. Хочеш, на якомусь сервері, хочеш - у файл. У пакеті першим завданням робиш Dynamic Properties Task, в якій розставляєш потрібні властивості з глобальних змінних. А глобальні змінні передаються ключем /A

Побачив, пробуватиму.

А як праметри передавати?

Одним рядком: /A«Data Source = %s Initial Catalog=%s»

Окремим ключем /A для кожної змінної

dtsrun /S (local) /E /N Package1 /A "Initial Catalog:8=qweqwe" /A "Data Source:8=ururu"

якщо для батника, то

dtsrun /S (local) /E /N Package1 /A "Initial Catalog:8=%1" /A "Data Source:8=%2"

> Окремим ключем /A для кожної змінноїАга, начебто виходить, шас спробую…

Можна просто імпортувати бібліотеку типів dtspkg.dll та отримати у своїй програмі весь функціонал dts.

> Можна просто імпортувати бібліотеку типів dtspkg.dll та > отримати у своїй програмі весь функціонал dts…Та не, і так добре, DiamondShark, дякую. :)

Блін так і не виходить. У мене БД називається «А» а на комп'ютері де зробили ДТС «Б».

При запуску у мене з базою А, лається що invalid object name Б.dbo. .

Тобто там база не змінилася: (Що не правильно? Де може бути помилка?

Так, як у ДТС в Source використовувати не Tabele/View де жорстко задається таблиця з префіксом базою, а Query, то працює.

Правда з 16 2 трансформації сварилися що немає такої таблиці дивно, але вже краще :)

> Правда з 16 2 трансформації лаялися що немає такої таблиціОтже схеми, все-таки, не зовсім однакові.

Може навіяти якийсь таск, який би перевіряв схему?

> Значить схеми, все-таки, не зовсім однакові.

> Може навіяти якийсь таск, який би перевіряв схему?Та не вмію я. Перевірка непотрібна схеми точно будуть однакові.

Я не впевнений, що правильно зробив.

> Я не впевнений, що правильно зробив.Правильно зробив.

> Правильно зробив.Так, а навпаки не виходить.

Весь цей час я говорив про трансформацію з SQL Server"a в BDF(Dbase IV). B там я у джерела(SQL Servera) задав не [базу].[таблицю], а запит і запрацювало.

А ось як навпаки. Тепер коли джерело це DBF, то в Destination задано [база].[таблиця] і як позбудеться цієї [бази](яка на іншому комп'ютері називається по іншому) незрозуміло.

> то в Destination задано [база].[таблиця] і як позбудеться > від цієї [бази]Так само, за допомогою Dynamic Properties Task.

Transform Data Task має властивість DestinationObjectName

> DestinationObjectNameТа я його бачив. Але що писати туди? Не зрозумів.

При розвантаженні я всім завдань як би виходить призначив БД, і використовував запит.

А що писати DestinationObjectName - незрозуміло.

Налаштування в яку передається БД називається SQLCatalog. Таблиця називається Table.

Що потрібно написати в DestinationObjectName?

Апнука, хотілося б розібратися до кінця, а то шас зав'язка наім'я БД залишилася…

DestinationObjectName property specifies name of a data destination.

Typically, DestinationObjectName є основним файлом або файлом name або Microsoft® Excel worksheet name.

Скільки часу потрібно на те, щоб в індексі БОЛ набрати слово DestinationObjectName?

> Це треба було три доби чекати?Ні, зробили інструкцію щоб бази називалися однаково :) Це було одноразове рішення, але можливо знадобиться ще колись, тому хочу розібратися.

> The DestinationObjectName property &#133

А тобто якщо в мене було:

То я просто залишаю [dbo].таблиця і се? &#133 Завтра перевірю&#133

> Ні, зробили інструкцію, щоб бази називалися однаково > :)Тож варіант;) Адміністративні заходи, як спосіб економії коду.

> , як спосіб економії коду.Не в коді ж справа, просто по іншому не вийшло, лана, дякую ? пробуватиму.

Нічого не вийшло :(. Не зрозуміло нічи…

Як роблю по кроках:

2. Заходжу в налаштування. http://www.ksoftware.ru/images/other/TransformationQuestion/2.png

Тут же незрозуміло, що робити, Add або Edit. Роблю Add.

3. Відкривається вікно з усіма налаштуваннями пакета, чому вони опинилися всередині створеної настройки незрозуміло.

4. вибираю DestinationObjectName http://www.ksoftware.ru/images/other/TransformationQuestion/4.png

Знову незрозуміло що робити.

5. Вибираю константу вказую ім'я таблиці. http://www.ksoftware.ru/images/other/TransformationQuestion/5.png

6. Жму ок, закривається, відкриваю знову знову теж що і на кроці3. Нічого не змінилося…

Особливо не зрозуміло, чому налаштування всього пакета всередині кожної настройки це руйнує мій моск.

Хм, 5ь років тому, використовуючи [9], мені знадобилося всього два робочі дні на реалізацію подібного, в цей час входило так само подрімати, полазити в інеті, поїсти, погуляти і подібне.

> Хочеш, щоб я вставив замість «штатним» твій текст?

Я не розумію, навіщо стільки часу мучитися, якщо мс надала інструмент у вигляді інтерфейсу. Для його використання достатньо 1. Імпортувати бібліотеку типів 2. Зробити один раз свій імпорт, зберегти скрипт 3. Перекласти скрипт з vb до delphi 4. У процесі перекладу розібратися що й навіщо 5. Змінювати всі параметри надалі так як потрібно

> 3. Перекласти скрипт з vb до delphiТут навіть дельфі не потрібен.

Цілком vbscript або jscript вистачить. Критерій "підготовленими фірмою MS засобами" дотримано ;)

Якщо ж шкода ресурсу мишки, можна написати ActiveX Script Task:

Function Main() Dim oPackage Set oPackage = DTSGlobalVariables.Parent oPackage.Tasks("DTSTask_DTSDataPumpTask_1").CustomTask.DestinationObjectName = "ZZZ0" oPackage.Tassk("DT .DestinationObjectName = "qqq0" oPackage.Tasks("DTSTask_DTSDataPumpTask_3").CustomTask.DestinationObjectName = "jhgjhg" і т.д. Main = DTSTaskExecResult_Success End Function

а ще краще, щось універсальне, на кшталт такого:

Function Main() Dim oPackage Dim oTask STOP Set oPackage = DTSGlobalVariables.Parent Завжди 2012. oTask.CustomTask.DestinationObjectName = UnqualifyName(oTask.CustomTask.DestinationObjectName) End If Next

Main = DTSTaskExecResult_Success End Function

Function UnqualifyName(sName) Dim elts elts = Split(sName, ".") Select Case UBound(elts) Case 0, 1 UnqualifyName = sName Case 2 If elts(1) = "" Then UnqualifyName = elts(2) Else UnqualifyName = elts(1) & "." & elts(2) End If Case Else err.Raise vbObjectError+1, "UnqualifyName", "Invalid object name" End Select End Function

> Все правильно зроблено. Тепер теж для всіх тяган.Ок.