SQL Server Central is supported by Red Gate Software Ltd.
 
Log in  ::  Register  ::  Not logged in
Search:  
 
 

Portable DTS Packages

By Kevin Feit, 2003/05/09

Total article views: 32620 | Views in the last 30 days: 90
Portable DTS Packages

Introduction

Have you ever faced the situation where you have needed to move a DTS package from one server to another, say from development to production?  The typical approach might be to save it as a file from your development server, then connect to production, open the file, modify the database connection, and then save it on production.  This works fairly well assuming you are only moving one or two packages and you have access to the production database server.  But if you need to move multiple packages across multiple environments, this will get tedious very quickly.  It can also be error prone.  For example, you can miss changing a connection, or the transformations can be inadvertently reset as the package is edited.  

Running a package from the command line

For our discussion, let’s assume you have a straightforward package to extract some data from your database based on a query, as shown in Figure 1 below.  However the approach described will also work for nearly any activity using a DTS package, such as importing data from a file or moving data between databases.

 

Figure 1. A typical DTS package

Connection 1 is the database connection (source) and Connection 2 is the destination, in this case a text file. 

The first question to address is: Can we avoid the need to save the package on different servers (development, QA, production)?  Well, we can save the package as a file.  But don’t you still have to open the package from Enterprise Manager to execute it?  No.  Microsoft provides a command line utility to run a DTS package.  It is called dtsrun.exe.  Dtsrun.exe accepts a file name and package name as arguments.  So you can enter:

dtsrun /Fmydtspkg /Nmydtspkg

to run a package named mydtskpkg.dts.

Of course, we still have one major problem to overcome: the package is still executing against the database we created on.

Making the package portable

So, how do we deal with the fact that the server name and database name are in effect hard coded in the package?  The DTS editor provides the “Dynamic Properties Task”.  Add a Dynamic Properties Task to the package.  The properties window for it will appear.  Type in a description, such as “Set Data Source”, and then click the “Add…” button.  Open the tree to Connections-Connection 1-Data Source.  Click the checkbox “Leave this dialog box open after adding a setting”, then click the Set… button.

 

Figure 2.Set the Data Source to a Global Variable

 

In the next dialog box, set source to Global Variable and then click the Create Global Variables… button.  Enter a Name, leave the type as String, and enter a default value.

Now choose the variable that you just created.

Repeat the process described for any other properties that you want to change, such as Initial Catalog (the database name) and User ID and Password if you are not using integrated security.  If you are extracting to a text file, the Data Source for that connection will be the filename.

Important: Now that you have added the Dynamic Properties task, make sure it is the first task to execute by adding a “On Success” workflow between it and Connection 1.  If you don’t do this, the job will fail because the values are not yet set when it starts to execute the extraction step.  Your DTS package should now look something like:

 

Figure 3. A DTS package with the Set Data Source task

 

At this point, save the package and execute a test run of the package from Enterprise Manager to confirm that the changes made have been successful.

Setting variables from the command line

As you recall from the first section, we can run a DTS package from the command line using the dtsrun utility.  But how do we set the global variables?  To do this use the /A switch.  For example,

dtsrun /Fmydtspkg /Nmydtspkg /A”Server:8=devserver”

will set the global variable Server to devserver.  The :8 is required to indicated that data type is string.

Tip: The global variable names are case-sensitive.  Make sure you exactly match the name in your command line with the name used in the package.  If they don’t match, no error is reported, but the command line setting is ignored and the default value set in the package is used instead.

Putting it all together

Now that we have the building blocks, let’s build a simple batch file to run any dts package.  I will call it rundts.bat. 

@ECHO Off

IF not exist %1.dts goto badfile

set myserver=devserver

set mydb=devdb

set extractdir=c:\Extracts

set outdir=.\output

CALL dtsrun /F%1 /N%1 /WTRUE /A”DB:8=%mydb%” /A”Server:8=%myserver%” /A”Outfile:8=%extractdir%\%~1.txt” > “%outdir%\%~1.txt”

IF /i %2==Y start notepad %outdir%\%~1.txt

IF /i %3==Y pause

goto end

:badfile

ECHO Please provide a filename without DTS extension, followed by Y to show output, and another Y to pause before returning

:end

TIME /T

ECHO %1 Completed

@ECHO ON

rundts.bat

Edit the values in the four set statements accordingly to reflect your server name, database name, directory for the extracted data, and directory for the extract log.  The extract will use the same filename as the DTS package, but with a .txt extension.  Setting the /W flag to TRUE in the CALL dtsrun line indicates to log the output to the event viewer.

 

There are also two flags that rundts.bat accepts.  The first indicates whether to start notepad and open the output file after each step.  The second flag determines whether to pause between each step.  This allows the execution to be monitored or to run unattended.

 

So if you need to run three DTS packages, you can create another batch file as:

CALL RUNDTS extract1 Y Y

CALL RUNDTS extract2 Y Y

CALL RUNDTS extract3 Y N

 

This will pause processing between each extract and open the output file for review.

 

Conclusion

This article provided a straightforward approach to make DTS packages portable between servers or databases.  By leveraging the SQL Server 2000 Dynamic Properties Task and the ability to run packages from the command line, the package can be migrated with almost no effort. 

 

Of course, what is presented is just a starting point, but the general technique can modified to meet many needs.

 

By Kevin Feit, 2003/05/09

Total article views: 32620 | Views in the last 30 days: 90
Your response
 
 
Related tags

DTS    
SQL Server 7, 2000    
 
Related content

Locking Down DTS

By Brian Knight | Category: DTS
| 8,073 reads

DTS Basics

By Brian Knight | Category: DTS
| 10,392 reads
Already registered?  

Free registration required

To read the rest of this article, and access thousands of other articles, we ask you to register on the site and subscribe to our newsletters.

Register

E-mail address:
Password:
Password (confirm):

  

Subscriptions

We ask you to register on the site and subscribe to our newsletters. Subscribing to our newsletters gets you:

  • ALL of our content (thousands of articles, scripts, and forum postings)
  • A daily newsletter (example)
  • A weekly news round up (example)
  • The opportunity to ask and answer questions in our forums
  • A daily Question of the Day to test and help you increase your knowledge of SQL Server.

We ask that you give the newsletter a try for a week. Over 200,000 SQL Server Professionals a day find it entertaining and useful. If not, you are welcome to unsubscribe at anytime.

Steve Jones
Editor, SQLServerCentral.com