如何创建一个SSIS包,它将运行位于特定文件夹中的T-SQL查询列表?

时间:2018-01-18 17:10:33

标签: sql-server tsql ssis etl ssis-2012

我正在使用SQL Server 2012,我需要创建一个SSIS包,该包将运行来自特定文件夹的T-SQL个查询列表。

我的T-SQL个查询列表的名称以' 01(查询名称)开头.sql'该文件夹包含25个查询的列表。我需要任务来运行这些查询 从查询' 01开始...'到' 25 ...'

可以在SSIS包中创建吗?如果是,我应该使用哪个任务?

更新1

我尝试了 @Hadi 建议的第一种方法,脚本任务抛出以下异常

  

错误:调用目标抛出了异常

我在SSDT中的任务的截图

enter image description here

脚本任务VB代码

 <Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute()> _
<System.CLSCompliantAttribute(False)> _
Partial Public Class ScriptMain
 Inherits Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase

 Public Sub Main()

    Using sr As New IO.StreamReader(Dts.Variables("strFilename").Value.ToString)

        Dts.Variables("strQuery").Value = sr.ReadToEnd()
        sr.Close()

    End Using

    Dts.TaskResult = ScriptResults.Success
End Sub

End Class

变量

enter image description here

2 个答案:

答案 0 :(得分:5)

(1)使用脚本任务+执行SQL任务

  1. 添加Foreach循环容器
  2. 选择type = File enumerator
  3. 选择包含.sql文件作为源目录
  4. 的文件夹
  5. 选择Fully qualified文件名选项
  6. 转到变量映射标签,将结果映射到变量(创建新的ex @[User::strFilename]
  7. 创建类型字符串变量@[User::strQuery]
  8. 在foreach循环容器中添加脚本任务并选择@[User::strFilename]作为只读变量@[User::strQuery]作为 ReadWrite Variable
  9. 在脚本任务中编写以下代码(选择Visual Basic作为语言)

    Try
    
        Using sr as new IO.StreamReader(Dts.Variables("strFilename").Value.ToString)
    
            Dts.Variables("strQuery").Value = sr.ReadToEnd()
            sr.Close()
    
        End Using
    
        Dts.TaskResult = ScriptResults.Success
    
    Catch ex as exception
    
        Messagebox.Show(ex.Message)
        Dts.TaskResult = ScriptResults.Failure
    
    End Try
    
  10. 添加Execute SQL Task链接到Script Task,然后选择ConnectionString属性,然后选择SQLSource Type property = Variable

  11. 选择@[User::strQuery]SourceVariable
  12. (2)使用执行流程任务

    使用foreach循环容器循环遍历这些文件,然后使用Execute process task使用SQLCMD运行这些查询。

    其他信息:

    (3)使用批处理文件

    你也可以在没有SSIS的情况下实现这一点,只需使用你用记事本创建的批处理文件.BAT

答案 1 :(得分:1)

当我学到新的东西时,我对哈迪赞不绝口。

但这是我用脚本任务完成的。经销商的选择。

//Read SQL to string
System.IO.StreamReader sr = new System.IO.StreamReader(Dts.Variables["ForEachFilePathName"].Value);
string sql = sr.ReadToEnd();
sr.Close();

string cstr = Dts.Variables["connString"].Value;
using (System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(cstr))
{
   System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(sql, conn);

     conn.Open();
     cmd.ExecuteNonQuery();
}