#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, чтобы соответствующим образом разделить его. Единственный способ устранить проблему на этом этапе — исправить данные.
Я неправильно понял ваше намерение или это ответ на ваш вопрос?