Saya memiliki tugas memuat data dari file .txt ke tabel SQL Server menggunakan Komponen Skrip di SSIS. Saya telah memuatnya dengan sukses menggunakan skrip.

 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();

            }
        }

Rincian Variabel Paket

Package Variable Details

Tetapi masalahnya adalah saya dapat memuat semua nilai dari file teks ke tabel hanya dengan satu tipe data (saya menggunakan nvarchar(200) sebagai tipe data umum untuk semua nilai). Saya telah melewati nvarchar(200) sebagai nilai di salah satu variabel paket dan saya menyebutnya dalam skrip.

Saya mengharapkan komponen skrip untuk menetapkan Tipe Data ke kolom dengan memahami nilai yang tersedia dalam file teks.

Contoh: File teks yang saya muat ke dalam tabel memiliki data berikut.

Id,Name,Age
1,Arun,25
2,Ramesh,26
3,Anish,28

Hasilnya tabel dengan nama dbo.File_1 dibuat dengan kolom Id, Name dan Age. Tetapi semua kolom ini dibuat dengan tipe data yang sama nvarchar(200) seperti yang disebutkan sebelumnya.

Tetapi persyaratan saya adalah komponen skrip harus menetapkan tipe data berdasarkan nilai, katakan misalnya, Id Kolom harus ditetapkan dengan tipe data int, Nama harus ditetapkan dengan tipe data nvarchar(50) dan seterusnya. Demikian juga skrip harus menetapkan tipe data berdasarkan segala jenis nilai (Seperti Desimal, Tanggal, dll)

Apakah ada cara yang mungkin untuk mencapai ini? Terima kasih sebelumnya.

Petunjuk Tambahan:

Script ini biasanya Drop dan Buat tabel baru setiap kali selama eksekusi. Nama tabel didasarkan pada FileName.

1
Krishna 3 Januari 2018, 14:18

1 menjawab

Jawaban Terbaik

Ini memotret dari pinggul yang satu ini, tapi mungkin menggunakan tryparse:

col += int.TryParse(ID, out num)? "int" : "nvarchar(200)";
1
KeithL 3 Januari 2018, 17:09