我的任务是使用 SSIS 中的脚本组件将 .txt 文件中的数据加载到 SQL Server 表中。我已经使用脚本成功加载了它。
public void Main()
{
//Declare Variables
string SourceFolderPath = Dts.Variables["$Project::Landing_Zone"].Value.ToString();
string FileExtension = Dts.Variables["User::FileExtension"].Value.ToString();
string FileDelimiter = Dts.Variables["User::FileDelimiter"].Value.ToString();
string ArchiveFolder = Dts.Variables["User::ArchiveFolder"].Value.ToString();
string ColumnsDataType = Dts.Variables["User::ColumnsDataType"].Value.ToString();
string SchemaName = Dts.Variables["$Project::SchemaName"].Value.ToString();
//Reading file names one by one
string[] fileEntries = Directory.GetFiles(SourceFolderPath, "*" + FileExtension);
foreach (string fileName in fileEntries)
{
SqlConnection myADONETConnection = new SqlConnection();
myADONETConnection = (SqlConnection)(Dts.Connections["DBConn"].AcquireConnection(Dts.Transaction) as SqlConnection);
//Writing Data of File Into Table
string TableName = "";
int counter = 0;
string line;
string ColumnList = "";
//MessageBox.Show(fileName);
System.IO.StreamReader SourceFile =
new System.IO.StreamReader(fileName);
while ((line = SourceFile.ReadLine()) != null)
{
if (counter == 0)
{
ColumnList = "[" + line.Replace(FileDelimiter, "],[") + "]";
TableName = (((fileName.Replace(SourceFolderPath, "")).Replace(FileExtension, "")).Replace("\\", ""));
string CreateTableStatement = "IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[" + SchemaName + "].";
CreateTableStatement += "[" + TableName + "]')";
CreateTableStatement += " AND type in (N'U'))DROP TABLE [" + SchemaName + "].";
CreateTableStatement += "[" + TableName + "] Create Table " + SchemaName + ".[" + TableName + "]";
CreateTableStatement += "([" + line.Replace(FileDelimiter, "] " + ColumnsDataType + ",[") + "] " + ColumnsDataType + ")";
SqlCommand CreateTableCmd = new SqlCommand(CreateTableStatement, myADONETConnection);
CreateTableCmd.ExecuteNonQuery();
//MessageBox.Show(CreateTableStatement);
}
else
{
string query = "Insert into " + SchemaName + ".[" + TableName + "] (" + ColumnList + ") ";
query += "VALUES('" + line.Replace(FileDelimiter, "','") + "')";
// MessageBox.Show(query.ToString());
SqlCommand myCommand1 = new SqlCommand(query, myADONETConnection);
myCommand1.ExecuteNonQuery();
}
counter++;
}
SourceFile.Close();
}
}
包变量详细信息
但问题是我只能使用单一数据类型将文本文件中的所有值加载到表中(我使用 nvarchar(200) 作为所有值的通用数据类型)。我已将 nvarchar(200) 作为其中一个包变量中的值传递,并在脚本中调用了它。
我期望脚本组件通过了解文本文件中可用的值来为列分配 DataType。
示例:我加载到表中的文本文件有以下数据。
Id,Name,Age
1,Arun,25
2,Ramesh,26
3,Anish,28
因此,将创建一个名为 dbo.File_1 的表,其中包含 Id、Name 和 Age 列。但是所有这些列都是使用前面提到的相同数据类型 nvarchar(200) 创建的。
但我的要求是脚本组件应根据值分配数据类型,例如,列 ID 应分配数据类型 int,名称应分配数据类型 nvarchar(50) 等等。同样,脚本应根据任何类型的值(如十进制、日期等)分配数据类型
有没有可能的方法来实现这一目标?提前致谢。
附加提示:
该脚本通常在执行期间每次都删除并创建一个新表。表名基于 FileName。