Як зробити 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…
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 …
А тобто якщо в мене було:
То я просто залишаю [dbo].таблиця і се? … Завтра перевірю…
> Ні, зробили інструкцію, щоб бази називалися однаково > :)Тож варіант;) Адміністративні заходи, як спосіб економії коду.
> , як спосіб економії коду.Не в коді ж справа, просто по іншому не вийшло, лана, дякую ? пробуватиму.
Нічого не вийшло :(. Не зрозуміло нічи…
Як роблю по кроках:
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
> Все правильно зроблено. Тепер теж для всіх тяган.Ок.