使脚本组件根据文本文件中的值动态分配数据类型

问题描述 投票:1回答:1

我有一个任务是使用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();

            }
        }

包变量详细信息

Package Variable Details

但问题是我只能使用单一数据类型将所有值从文本文件加载到表中(我使用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。

sql-server ssis etl script-component
1个回答
1
投票

这是从这个髋关节射击,但可能使用tryparse:

col += int.TryParse(ID, out num)? "int" : "nvarchar(200)";
© www.soinside.com 2019 - 2024. All rights reserved.