Domanda

Sto eseguendo SQL Server 2000 e ho bisogno di esportare l'istruzione SQL da tutti gli oggetti DTS in modo che possano essere analizzati e inseriti in una documentazione wiki se necessario.

C'è un modo per farlo?

forse scaricare ogni oggetto DTS in un file di testo con il nome dell'oggetto come nome del file con il nome del processo e la data in cui è stato estratto come intestazione del file.

Grazie.

È stato utile?

Soluzione

Ho uno Python 2.6 (facilmente trasportabile su Python 2.5) che scarica l'SQL dalle attività in un pacchetto DTS che è stato salvato come codice Visual Basic.

Fare riferimento al post di ConcernedOfTunbridgeWells per scoprire come salvare il pacchetto DTS in un file VB. Dopo aver salvato un file VB, eseguire questa funzione su di esso. Creerà una cartella nella stessa posizione del file VB che contiene il codice dal pacchetto e scaricherà il codice SQL che trova. Presuppone che l'output dell'SQL vada in file CSV (vedere il parametro outExt ) o provenga da un " Esegui attività SQL " attività e nomina le query SQL dopo il file di output o l'attività SQL. Se il tuo pacchetto non fa nient'altro, questa è una soluzione utile.

Sentiti libero di ripulire questo codice se sei così propenso.

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

Altri suggerimenti

Esiste un'API con un modello a oggetti per i pacchetti DTS. È possibile ottenere il testo SQL attraverso questo. I documenti di Books on Line lo descrivono in una certa misura Qui. È possibile ottenere esempi dell'utilizzo del modello a oggetti Salvataggio del pacchetto DTS in un file Visual BASIC e visualizzazione dell'azione del file VB nel modello a oggetti.

Se vuoi risparmiare un po 'di lavoro e non ti dispiace pagare qualche soldo c'è uno strumento che documenta completamente i tuoi pacchetti DTS. Emette anche in XML, quindi dovrebbe essere relativamente facile ottenere quelle istruzioni SQL.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top