我想创建一个SSIS包,它使用执行SQL语句生成的数据写入文件。传递正确的SQL作为变量的其他包将调用此通用包。
因此在通用包中:
我想执行动态SELECT查询并从单个数据库实例获取动态列数,连接字符串不会每次调用并将结果存储到平面文件中。
在SSIS中实现这一目标的理想方法是什么。
我尝试了什么:
我能找到的最简单的解决方案是编写一个脚本任务,该任务将打开SQL连接,使用SQLCommand执行SQL,使用获取的数据填充数据表,并使用System.io将内容直接写入文件系统。文件并释放连接。
我尝试使用OLE数据库源与变量提供的SQL(将Validation设置为false)并将行指向Flat文件连接。但是由于列的动态数量和名称,我遇到了错误。
是否有更标准的方法可以在不使用脚本任务的情况下实现此目的?
答案 0 :(得分:0)
如何...将所有字段值连接到一个字段中,并将AllFields映射到文本文件目标中的字段。
SELECT [f1] +','+ [f2] AS AllFields FROM [dbo]。[A]
所有“其他”包都知道如何创建正确的SQL。他们与“通用”软件包的唯一合同是最终只有一个字段命名为“AllFields”。
答案 1 :(得分:0)
直接回答你的问题,我认为没有"标准"这样做的方式。我相信Anoop的解决方案可以很好地工作,而我没有测试过这个想法,我希望在编写自己的解决方案之前我会调查它。您不应该在该解决方案中使用脚本任务...
无论如何,我确实编写了自己的方法来从SQL表生成csv文件,这些文件可能会遇到边缘情况,需要抛光但现在工作得很好。我在此任务之前循环遍历多个表,因此可以用您想要的任何变量替换CurrentTable变量。
这是我的代码:
public void Main()
{
string datetime = DateTime.Now.ToString("yyyyMMddHHmmss");
try
{
string TableName = Dts.Variables["User::CurrentTable"].Value.ToString();
string FileDelimiter = ",";
string TextQualifier = "\"";
string FileExtension = ".csv";
//USE ADO.NET Connection from SSIS Package to get data from table
SqlConnection myADONETConnection = new SqlConnection();
myADONETConnection = (SqlConnection)(Dts.Connections["connection manager name"].AcquireConnection(Dts.Transaction) as SqlConnection);
//Read data from table or view to data table
string query = "Select * From [" + TableName + "]";
SqlCommand cmd = new SqlCommand(query, myADONETConnection);
//myADONETConnection.Open();
DataTable d_table = new DataTable();
d_table.Load(cmd.ExecuteReader());
//myADONETConnection.Close();
string FileFullPath = Dts.Variables["$Project::ExcelToCsvFolder"].Value.ToString() + "\\Output\\" + TableName + FileExtension;
StreamWriter sw = null;
sw = new StreamWriter(FileFullPath, false);
// Write the Header Row to File
int ColumnCount = d_table.Columns.Count;
for (int ic = 0; ic < ColumnCount; ic++)
{
sw.Write(TextQualifier + d_table.Columns[ic] + TextQualifier);
if (ic < ColumnCount - 1)
{
sw.Write(FileDelimiter);
}
}
sw.Write(sw.NewLine);
// Write All Rows to the File
foreach (DataRow dr in d_table.Rows)
{
for (int ir = 0; ir < ColumnCount; ir++)
{
if (!Convert.IsDBNull(dr[ir]))
{
sw.Write(TextQualifier + dr[ir].ToString() + TextQualifier);
}
if (ir < ColumnCount - 1)
{
sw.Write(FileDelimiter);
}
}
sw.Write(sw.NewLine);
}
sw.Close();
Dts.TaskResult = (int)ScriptResults.Success;
}
catch (Exception exception)
{
// Create Log File for Errors
//using (StreamWriter sw = File.CreateText(Dts.Variables["User::LogFolder"].Value.ToString() + "\\" +
// "ErrorLog_" + datetime + ".log"))
//{
// sw.WriteLine(exception.ToString());
//}
Dts.TaskResult = (int)ScriptResults.Failure;
throw;
}
Dts.TaskResult = (int)ScriptResults.Success;