Как экспортировать инструкцию SQL из объекта DTS?

Я использую SQL Server 2000, и мне нужно экспортировать оператор SQL из всех объектов DTS, чтобы их можно было проанализировать и при необходимости поместить в вики-документацию.

Есть способ сделать это?

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

благодаря.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
1 979
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Для пакетов DTS существует API с объектной моделью. Вы можете получить текст SQL через это. Документы Books on Line в некоторой степени описывают это. Здесь. Вы можете получить примеры использования объектной модели с помощью Сохранение пакета DTS в файл Visual BASIC и посмотреть, что файл VB делает с объектной моделью.

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

Конечно, разумная цена .... Жаль, что их рынок довольно быстро истощается с выходом 2008 года.

Keng 23.06.2009 17:07
Ответ принят как подходящий

У меня есть сценарий Python 2.6 (легко переносимый на Python 2.5), который выгружает SQL из задач в пакете DTS, который был сохранен как код Visual Basic.

Обратитесь к сообщению ConcernedOfTunbridgeWells, чтобы узнать, как сохранить пакет DTS в файл VB. После сохранения файла VB запустите на нем эту функцию. Он создаст папку в том же месте, что и файл VB, который содержит код из пакета, и сбросит найденный код SQL. Предполагается, что выходные данные SQL передаются в файлы CSV (см. Параметр outExt) или поступают из задачи «Выполнить задачу SQL», и имена SQL-запросов соответствуют выходному файлу или задаче SQL. Если ваш пакет больше ничего не делает, это полезное решение.

Не стесняйтесь очистить этот код, если хотите.

# from __future__ import with_statement  # Version 2.5 requires this.
import os, re

def dump_sql(infile, outExt=r'csv'):
    """Parse a DTS package saved as a .bas file, and dump the SQL code.

    Pull out the SQL code and the filename for each task.  This process
    depends on the way that DTS saves packages as VB modules.

    Keyword arguments:
    infile - The .bas file defining a DTS package.
    outExt - The extension (without a period) of the files exported by the
             data pumps in the DTS package. These are used to rename the
             extracted SQL scripts. If an extract file does not use this
             extension, then the whole name of the extract file is used to
             name the SQL script. (default: csv)

    The function produces a folder in the same folder that contains the
    .bas file. It's named like this: if the .bas file is "DTS package.bas",
    then the directory will be named "DTS package_SQL". The SQL scripts are
    stored in this folder.

    """
    #Declare all of the RE's used in the script here.
    basExtRE = re.compile(r'\.bas$', re.IGNORECASE)
    outExtRE = re.compile(r'\.' + outExt + r'$', re.IGNORECASE)
    startTaskRE = re.compile(r'Set oCustomTask(\d+) = oTask.CustomTask')
    startSqlRE = re.compile(
        r'oCustomTask(\d+)\.(?:Source)?SQLStatement = "(.*)"( & vbCrLf)?')
    nextSqlRE = re.compile(
        r'oCustomTask(\d+)\.(?:Source)?SQLStatement = oCustomTask\1\.'
        r'(?:Source)?SQLStatement & "(.*)"( & vbCrLf)?')
    filenameRE = re.compile(
        r'oCustomTask(\d+)\.DestinationObjectName = "(.*)"')
    descripRE = re.compile(r'oCustomTask(\d+)\.Description = "(.*)"')
    invalidCharsRE = re.compile(r'[][+/*?<>,.;:"=\\|]')

    #Read the file
    with open(infile, 'r') as f:

        #Produce the directory for the SQL scripts.
        outfolder = '%s_SQL\\' % basExtRE.sub('', infile)
        if not os.path.exists(outfolder):
            os.makedirs(outfolder)

        taskNum = -1
        outfile = ''
        sql = []

        for line in f:
            line = line.rstrip().lstrip()

            if taskNum == -1:
                #Seek the beginning of a task.
                m = startTaskRE.match(line)
                if m is not None:
                    taskNum = int(m.group(1))
            elif line == '' and outfile != '':
                #Save the SQL code to a file.
                if sql:
                    if os.path.exists(outfile):
                        os.unlink(outfile)
                    with open(outfile, 'w') as fw:
                        fw.writelines(["%s" % sqlQ for sqlQ in sql])
                    print "%2d - %s" % (taskNum, outfile)
                else:
                    print "%2d > No SQL (%s)" % (
                        taskNum, os.path.basename(outfile))
                sql = []
                outfile = ''
                taskNum = -1
            else:
                #Acquire SQL code and filename
                m = startSqlRE.match(line)
                if m:
                    #Start assembling the SQL query.
                    tnum, sqlQ, lf = m.groups()
                    assert int(tnum) == taskNum
                    sql = [sqlQ.replace('""', '"')
                           + ('\n' if lf is not None else '')]
                    continue
                m = nextSqlRE.match(line)
                if m:
                    #Continue assembling the SQL query
                    tnum, sqlQ, lf = m.groups()
                    assert int(tnum) == taskNum
                    sql.append(sqlQ.replace('""', '"')
                               + ('\n' if lf is not None else ''))
                    continue
                m = descripRE.match(line)
                if m:
                    # Get a SQL output filename from the task's
                    # description.  This always appears near the top of the
                    # task's definition.
                    tnum, outfile = m.groups()
                    assert int(tnum) == taskNum
                    outfile = invalidCharsRE.sub('_', outfile)
                    outfile = "%s%s.sql" % (outfolder, outfile)
                    continue
                m = filenameRE.match(line)
                if m:
                    # Get a SQL output filename from the task's output
                    # filename.  This always appears near the bottom of the
                    # task's definition, so we overwrite the description if
                    # one was found earlier.
                    tnum, outfile = m.groups()
                    assert int(tnum) == taskNum
                    outfile = os.path.basename(outfile)
                    outfile = outExtRE.sub('', outfile)
                    outfile = "%s%s.sql" % (outfolder, outfile)
                    continue
    print 'Done.'

Другие вопросы по теме