Script Task, included in SQL Server Integration Services (SSIS), offers an extensive degree of flexibility that allows you to deal with non-traditional data stores and customize the processing of standard sources of data by leveraging their unique characteristics. Read on to learn more…
As we have demonstrated in recent articles published on this forum, Script Task,
included in SQL Server 2008 Integration Services,
offers an extensive degree of flexibility, making it possible to satisfy extraction, transformation, and loading requirements not covered by other, more specialized built-in components. This allows you to not only deal with non-traditional data stores (such as Active Directory
), but also customize the processing of standard sources of data (such as flat files) by leveraging their unique characteristics.
In order to explore the features that are available using this approach, we will demonstrate a sample procedure that involves the most common operations on file system objects (such as reading, renaming, or identifying their attributes). Our intention is to facilitate a scenario in which text files are uploaded to a designated folder in regular intervals. For each of them, our Script Task
will do the following:
- first verify the timestamp (ensuring that it matches the current date),
- read the entire content (saving it into an
SSIS
variable, which subsequently can be utilized by other package components), - alter the
.txt
extension to indicate that the processing has completed
By placing the task in a properly designed For Loop Container,
you can apply this sequence of steps to all files in the same folder relatively easily.
To accomplish our objective, start by launching Business Intelligence Development Studio
, create an SSIS
project based on the Integration Services
template, and define two String
SSIS
variables with the package scope. The first of them (named sFilePath
) should be set to a fully qualified path to the source file, while the other (which we will call sFileContent
) is intended to provide temporary storage for its content. Next, drag the Script Task
icon from the Toolbox
and drop it on the Designer
interface. Display its Editor
interface, and designate (respectively) Visual Basic .NET 2008
as the ScriptLanguage
, User::sFilePath
as ReadOnlyVariables
, and User::sFileContent
as ReadWriteVariables
. Finally, click on the Edit Script...
command button to bring up the Visual Studio Tools for Applications
interface, where we will enter our custom code.
File system functionality (including relevant classes with their properties and methods) that we will leverage in our example is incorporated into System.IO
and System.Text
namespaces (which you can find more about by referring to the msdn
Web site documentation). Since both of them should be included in the VSTA
project already, simply the add corresponding Imports
statements in the (General) (Declarations)
section on the ScriptMain.vb
tab in the VSTA
project window. Next, switch to the Public Main() Sub
and enter the following code:
Public Sub Main() ' ' Add your code here ' Dim strFilePath As String Dim strFileContent As String Dim objFileInfo As FileInfo Dim objStreamReader As StreamReader Try strFilePath = Dts.Variables("sFilePath").Value.ToString() objFileInfo = New FileInfo(strFilePath) If (objFileInfo.LastWriteTime().Date = DateTime.Today) Then MessageBox.Show("Today", "Last Modified Date", MessageBoxButtons.OK) objStreamReader = New StreamReader(strFilePath) strFileContent = objStreamReader.ReadToEnd() objStreamReader.Close() Dts.Variables("sFileContent").Value = strFileContent MessageBox.Show(Dts.Variables("sFileContent").Value, "File Content", MessageBoxButtons.OK) objFileInfo.MoveTo(strFilePath.Replace(".txt", ".old")) End If Dts.TaskResult = ScriptResults.Success Catch ex As Exception MessageBox.Show(ex.Message.ToString(), "Error", MessageBoxButtons.OK) Dts.Events.FireError(1, ex.TargetSite.ToString(), ex.Message.ToString(), "", 0) Dts.TaskResult = ScriptResults.Failure End Try End Sub End Class
We start by declaring a number of variables. Two of them, corresponding to those defined earlier in SSIS Designer
interface (namely User::sFilePath
and User::sFileContent
) will facilitate interaction between the package and VSTA
code. The FileInfo
object will provide the ability to identify the LastWriteTime
attribute and rename the text file after its processing has been completed. Methods defined as part of the StreamReader
class will allow us to read the content of our sample text file.
By enclosing our code into Try Catch
block, we guard against potential exceptions that might surface during runtime. With strFilePath
set to a value of SSIS User::sFilePath
variable, we use the LastWriteTime()
method of the FileInfo
object to determine whether the sample file was modified today (incidentally, if the file does not exist, the method returns 12:00 midnight, January 1, 1601 A.D. Coordinated Universal Time
, adjusted to local time). Assuming that the outcome is positive, we read its entire content using the ReadToEnd()
method. By assigning the value of strFileContent
to User::sFileContent
SSIS
variable, we make it available to other package components. Finally, we take advantage of the MoveTo()
method of FileInfo
class to replace the extension of the file from .txt
to .old
. For more information regarding the code following the Catch ex As Exception
statement, refer to our article on Script Task Exception Handling
. On a final note, keep in mind that the message boxes that we leverage to indicate the progress of execution are used strictly for testing purposes and should be avoided in production-ready implementations.
Obviously, this example serves barely as a hint of the abundant possibilities available via Script Task
to more skillful programmers. In our upcoming articles, we will be exploring other applications of this functionality.