我有一个任务是使用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)创建的。
但我的要求是脚本组件应该根据值分配数据类型,例如,应该为Column Id分配数据类型为int,Name应该分配数据类型为nvarchar(50),依此类推。同样,脚本应根据任何类型的值(如Decimal,Date等)分配数据类型
有没有可能的方法来实现这一目标?提前致谢。
附加提示:
此脚本通常在执行期间每次都删除并创建一个新表。表名基于FileName。
这是从这个髋关节射击,但可能使用tryparse:
col += int.TryParse(ID, out num)? "int" : "nvarchar(200)";