Come esportare l'istruzione SQL da un oggetto DTS?
-
04-07-2019 - |
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.
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.