загрузить плоский файл, разделенный запятыми, в таблицу SQL server с помощью задачи сценария ssis

#ssis

#ssis

Вопрос:

Я хочу загрузить данные из таблицы, разделенной запятыми, во временную таблицу на sql Server. Я использую этот код, и он отлично работает. Но поскольку это файл с разделителями «,», если какое-либо поле в файле содержит «,», то этот код не работает. как и в функции replace, которая «,» также является replace. Любая помощь

Импортирует System Импортирует System.Система импорта данных.Math импортирует Microsoft.SQLServer.Dts.Runtime импортирует систему.IO Импортирует system.Data.OleDb импортирует Microsoft.SQLServer.DTSRuntimeWrap

Открытый класс ScriptMain

 ' The execution engine calls this method when the task executes.
' To access the object model, use the Dts object. Connections, variables, events,
' and logging features are available as static members of the Dts class.
' Before returning from this method, set the value of Dts.TaskResult to indicate success or failure.
' 
' To open Code and Text Editor Help, press F1.
' To open Object Browser, press Ctrl Alt J.

Public Sub Main()
    Dts.TaskResult = Dts.Results.Failure
    Dim strFilePath As String = Dts.Variables("FilePath").Value.ToString
    Dim strCurrentZipFile As String = Dts.Variables("CurrentZipFile").Value.ToString
    Dim strConn As String = IO.Path.GetFileNameWithoutExtension(Dts.Variables("FilePath").Value.ToString)
    Dim strFields() As String = Dts.Variables("FilePath").Value.ToString.Split(",".ToCharArray())

    'Dts.Connections.Item(strConn).ConnectionString = strFilePath
    Dts.Connections.Item("EmpInfo").ConnectionString = strFilePath
    Dts.Variables("CurrentRawFile").Value = IO.Path.GetFileName(strCurrentZipFile)
    ' MsgBox(Dts.Variables("CurrentRawFile").Value)
    Dts.TaskResult = Dts.Results.Success


    ' The execution engine calls this method when the task executes.
    ' To access the object model, use the Dts object. Connections, variables, events,
    ' and logging features are available as static members of the Dts class.
    ' Before returning from this method, set the value of Dts.TaskResult to indicate success or failure.
    ' 
    ' To open Code and Text Editor Help, press F1.
    ' To open Object Browser, press Ctrl Alt J.


    Dim cm As ConnectionManager

    Dim con As OleDbConnection
    Dim cmd As New OleDbCommand()
    ' myADONETConnection = DirectCast(TryCast(Dts.Connections("Polldata").AcquireConnection(Dts.Transaction), SqlConnection), SqlConnection)

    '  MsgBox(myADONETConnection.ConnectionString, "PollData")

    Dim line1 As String = ""
    'Reading file names one by one
    Dim SourceDirectory As String = Dts.Variables("FilePath").Value.ToString
    cm = Dts.Connections("Polldata")
    Dim cmParam As Wrapper.IDTSConnectionManagerDatabaseParameters90
    cmParam = CType(cm.InnerObject, Wrapper.IDTSConnectionManagerDatabaseParameters90)
    con = CType(cmParam.GetConnectionForSchema(), OleDb.OleDbConnection)


    cmd.Connection = con
    'MsgBox(Dts.Variables("FilePath").Value.ToString)
    ' TODO: Add your code here
    '  Dim fileEntries As IO.DirectoryInfo = New IO.DirectoryInfo(SourceDirectory)
    ' MsgBox(fileEntries)
    ' For Each fileName As String In fileEntries.GetFiles()
    ' do something with fileName
    ' MsgBox(fileName)
    Dim columname As String = ""


    'Reading first line of each file and assign to variable
    Dim file2 As New System.IO.StreamReader(Dts.Variables("FilePath").Value.ToString) '(fileName)

    'Dim filenameonly As String = (((fileName.Replace(SourceDirectory, "")).Replace(".txt", "")).Replace("", ""))
    'Create a temporary table 
    line1 = (" IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].tmp_empinfo" amp; "') AND type in (N'U'))DROP TABLE [dbo].tmp_empinfo" amp; " Create Table dbo.tmp_empinfo" amp; "(" amp; file2.ReadLine().Replace(",", " VARCHAR(100),") amp; " VARCHAR(100))").Replace(".txt", "")

    file2.Close()

    ' MsgBox(line1.ToString())
    cmd.CommandText = line1
    cmd.ExecuteNonQuery()


    'MsgBox("TABLE IS CREATED")

    'Writing Data of File Into Table
    Dim counter As Integer = 0
    Dim line As String = ""

    Dim SourceFile As New System.IO.StreamReader(Dts.Variables("FilePath").Value.ToString) '(fileName)
    While (InlineAssignHelper(line, SourceFile.ReadLine())) IsNot Nothing

        If counter = 0 Then
            columname = line.ToString()
            ' MsgBox("INside IF")
        Else

            ' MsgBox("Inside ELSE")
            Dim query As String = "Insert into dbo.tmp_empinfo" amp; "(" amp; columname amp; "  VALUES('" amp; line.Replace(",", "','").Replace("""", "") amp; "')"

            'Dim query As String = "Insert into dbo.tmp_empinfo" amp; "(" amp; columname amp; "  VALUES(" amp; strFields.ToString amp; ")"

            ' Dim query As String = "BULK INSERT dbo.tmp_empinfo FROM '" amp; strFilePath amp; "' WITH " amp; " ( " amp; " FIELDTERMINATOR = '|', " amp; " ROWTERMINATOR = 'n' " amp; " )"


            MsgBox(query.ToString())

            cmd.CommandText = query
            cmd.ExecuteNonQuery()
        End If
  

Ответ №1:

«Я хочу загрузить данные из таблицы, разделенной запятыми, во временную таблицу на sql Server». Вы хотите сказать, что у вас в принципе уже есть столбец в таблице в базе данных, который содержит данные в списке, разделенном запятыми? Например,

ВЫБЕРИТЕ column_name ИЗ schema.table

выводит что-то вроде some_data, more_data, even_more_data, even,more_data? И ваша проблема в том, что текст не заключен в кавычки, поэтому некоторые строки в конечном итоге содержат дополнительные фантомные столбцы, когда вы пытаетесь загрузить его в пункт назначения?

Если это проблема, то я бы рекомендовал ввести идентификаторы в кавычках в ваши исходные данные перед их загрузкой в вашу исходную таблицу. Это означает, что любой процесс, который импортирует данные в эту таблицу, должен быть исправлен, чтобы вам не приходилось сталкиваться с такого рода проблемами. Если это невозможно сделать, вам придется встроить логику в ваш компонент script или оператор sql select, чтобы соответствующим образом разделить его. Единственный способ устранить проблему на этом этапе — исправить данные.

Я неправильно понял ваше намерение или это ответ на ваш вопрос?