DTSオブジェクトからSQLステートメントをエクスポートするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/240719

  •  04-07-2019
  •  | 
  •  

質問

SQL Server 2000を実行していますが、必要に応じて解析してWikiドキュメントに入れることができるように、すべてのDTSオブジェクトからSQLステートメントをエクスポートする必要があります。

それを行う方法はありますか?

各DTSオブジェクトを、プロセス名とファイルヘッダーとして抽出された日付を含むファイル名としてオブジェクト名を使用して、テキストファイルにダンプすることができます。

ありがとう。

役に立ちましたか?

解決

タスクからSQLをダンプする Python 2.6 スクリプト(Python 2.5に簡単に移植可能)がありますVisual Basicコードとして保存されたDTSパッケージ内。

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.'

他のヒント

DTSパッケージ用のオブジェクトモデルを備えたAPIがあります。これによりSQLテキストを取得できます。 Books on Lineのドキュメントでは、これについてある程度説明していますこちら により、オブジェクトモデルの使用例が得られます。 DTSパッケージをVisual BASICファイルに保存し、VBファイルがオブジェクトモデルに対して行う処理を確認します。

いくつかの作業を保存したいが、数ドルを払っても構わない場合は、ツールがあります。 DTSパッケージを完全に文書化します。 XMLにも出力されるため、これらのSQLステートメントを取得するのは比較的簡単です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top