SSIS Excel 导入 - 工作表变量还是通配符?



我有一个 SSIS 数据导入包,它使用源 Excel 电子表格,然后将数据导入到 SQL Server 数据库表中。我一直没有成功地自动化此过程,因为 Excel 文件的工作表名称每天都在更改。因此,我不得不在每天运行导入之前手动更改工作表名称。需要注意的是,永远不会有任何其他工作表。

我可以为工作表名称创建一个变量吗? 我可以使用通配符而不是工作表名称吗? 在启动导入作业之前,我最好创建一个 Excel 宏或类似内容来更改工作表名称吗?

我使用以下脚本任务 (C#(:

System.Data.OleDb.OleDbConnection objConn;
DataTable dt;
string connStr = ""; //Use the same connection string that you have in your package
objConn = new System.Data.OleDb.OleDbConnection(ConnStr);
objConn.Open();
dt = objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbShemaGuid.Tables,null);
objConn.Close();
foreach(DataRow r in dt.Rows)
{
//for some reason there is always a duplicate sheet with underscore.
string t = r["TABLE_NAME"].ToString(); 
//Note if more than one sheet exist this will only capture the last one
if(t.Substring(t.Length-1)!="_")
{
Dts.Variables["YourVariable"].Value = t;
}
}

然后在 SSIS 中,我添加另一个变量来构建我的 SQL。

新变量"从 [" + "您的变量" + "]中选择 *">

最后,在 Excel 源中将数据源设置为该 SQL 变量。

在相同的情况下,这非常适合我,以防它对您或其他人有所帮助:

必需的包级字符串变量 2:

  • varDirectoryList - 您将在 SSIS 中将其用于每个循环变量映射

  • varWorksheet - 这将保存您更改的工作表名称。因为你只有 1,所以它是完美的。

建立:

  • a. 为每个循环添加 SSIS
  • b. Excel 连接管理器(在测试时连接到第一个工作簿,然后在最后您将转到属性并在表达式"Excel 文件路径"中添加您的 varDirectoryList。将延迟验证设置为 True 以及您的 Excel 源任务。*这将有助于它浏览您文件夹中的每个工作簿(
  • c. 在 For Each 循环中添加一个 Scrip 任务 C#,标题为"获取更改工作表 名称为变量"或您的偏好。
  • 使用 Excel 源到 SQL 表目标的数据流任务。

在 Scrip 任务中添加以下代码:

using System.Data.OleDb;

public void Main()
{
// store file name passed into Script Task
string WorkbookFileName = Dts.Variables["User::varDirectoryList"].Value.ToString();
// setup connection string
string connStr = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties="EXCEL 12.0;HDR=Yes;IMEX=1;"", WorkbookFileName);
// setup connection to Workbook
using (var conn = new OleDbConnection(connStr))
{
try
{
// connect to Workbook
conn.Open();
// get Workbook schema
using (DataTable worksheets = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null))
{
// in ReadWrite variable passed into Script Task, store third column in the first 
// row of the DataTable which contains the name of the first Worksheet
Dts.Variables["User::varWorkSheet"].Value = worksheets.Rows[0][2].ToString();
//Uncomment to view first worksheet name of excel file. For testing purposes.
MessageBox.Show(Dts.Variables["User::varWorkSheet"].Value.ToString());
}
}
catch (Exception)
{
throw;
}
}

}

设置并运行此设置后,您将收到一个消息框,显示每个工作簿不断变化的工作表名称。

  • 如果您使用的是 Excel 源 SQL 命令,则需要第三个字符串 变量,如:varExcelSQL,里面有一个表达式,如:SELECT 列来自 ['varWorkSheet$'],它将动态更改以匹配 每个工作簿。您可能需要也可能不需要单引号,更改为 在 varExcelSQL 中需要。
  • 如果您不使用 Excel 源 SQL,而只是直接从 表;进入 Excel 源属性 -->访问模式 -->从变量 --> 打开行集 --然后选择 varWorkSheet。

只要列结构保持不变,就应该照顾它。

如果您碰巧在一列中获取具有多种数据类型的文件;则可以在连接字符串中使用IMEX=1,这会强制数据类型在导入时DT_WSTR。

希望这有帮助:-(

如果使用 SSIS 导入工作表,则可以使用脚本任务查找工作表的名称,然后更改名称或需要执行的任何其他操作,以使其适合导入的其余部分。这是查找我在此处找到的工作表的示例

Dim excel As New Microsoft.Office.Interop. Excel.ApplicationClass
Dim wBook As Microsoft.Office.Interop. Excel.Workbook
Dim wSheet As Microsoft.Office.Interop. Excel.Worksheet
wBook = excel.Workbooks.Open 
wSheet = wBook.ActiveSheet()
For Each wSheet In wBook.Sheets
MsgBox(wSheet.Name)  
Next

在 MsgBox 行上,您可以更改名称或将其报告给另一个进程

最新更新