SQL Server: способ представления таблицы Excel в SQL Server. Excel в sql


sql-server - Вставить данные MS Excel в SQL Server

Я разработал макрос Excel VBA для резки и вставки любого выбора из Excel в SQL Server, создав новую таблицу. Макрос отлично подходит для быстрого и грязного создания таблиц до нескольких тысяч строк и нескольких столбцов (теоретически он может управлять до 200 столбцов). Макрос пытается автоматически определять имена заголовков и назначать наиболее подходящий тип данных для каждого столбца (он обрабатывает столбцы varchar до 1000 символов).

Рекомендуемая процедура установки:

  • Убедитесь, что Excel включен для запуска макросов. (Файл- > Параметры- > Центр доверия- > Настройки центра доверия- > Параметры макроса- > Включить все макросы..)
  • Скопируйте код VBA ниже в модуль, связанный с вашей личной книгой (чтобы макрос был доступен для всех листов)
  • Назначьте соответствующее макрокоманду (я назначил Ctrl Shift X)
  • Сохраните свою личную книгу

Использование макроса

  • Выберите ячейки в Excel (включая заголовки столбцов, если они существуют), которые будут перенесены в SQL
  • Нажмите назначенное сочетание ключевых слов, которое вы назначили для запуска макроса
  • Следуйте инструкциям. (Имя таблицы по умолчанию - ## Таблица)
  • Вставьте содержимое буфера обмена в окно SSMS и запустите сгенерированный код SQL. BriFri 238

Код VBA:

Sub TransferToSQL() ' ' TransferToSQL Macro ' This macro prepares data for pasting into SQL Server and posts it to the clipboard for inserting into SSMS ' It attempts to automatically detect header rows and does a basic analysis of the first 15 rows to determine the most appropriate datatype to use handling text entries upto 1000 chars. ' ' Max Number of Columns: 200 ' ' Keyboard Shortcut: Ctrl+Shift+X ' ' ver Date Reason ' === ==== ====== ' 1.6 06/2012 Fixed bug that prevented auto exit if no selection made / auto exit if blank Tablename entered or 'cancel' button pressed ' 1.5 02/2012 made use of function fn_ColLetter to retrieve the Column Letter for a specified column ' 1.4 02/2012 Replaces any Tabs in text data to spaces to prevent Double quotes being output in final results ' 1.3 02/2012 Place the 'drop table if already exists' code into a separate batch to prevent errors when inserting new table with same name but different shape and > 100 rows ' 1.2 01/2012 If null dates encountered code to cast it as Null rather than '00-Jan-1900' ' 1.1 10/2011 Code to drop the table if already exists ' 1.0 03/2011 Created Dim intLastRow As Long Dim intlastColumn As Integer Dim intRow As Long Dim intDataStartRow As Long Dim intColumn As Integer Dim strKeyWord As String Dim intPos As Integer Dim strDataTypeLevel(4) As String Dim strColumnHeader(200) As String Dim strDataType(200) As String Dim intRowCheck As Integer Dim strFormula(20) As String Dim intHasHeaderRow As Integer Dim strCellRef As String Dim intFormulaCount As Integer Dim strSQLTableName As String Dim strSQLTableName_Encap As String Dim intdataTypelevel As Integer Const strConstHeaderKeyword As String = "ID,URN,name,Title,Job,Company,Contact,Address,Post,Town,Email,Tele,phone,Area,Region,Business,Total,Month,Week,Year," Const intConstMaxBatchSize As Integer = 100 Const intConstNumberRowsToAnalyse As Integer = 100 intHasHeaderRow = 0 strDataTypeLevel(1) = "VARCHAR(1000)" strDataTypeLevel(2) = "FLOAT" strDataTypeLevel(3) = "INTEGER" strDataTypeLevel(4) = "DATETIME" ' Use current selection and paste to new temp worksheet Selection.Copy Workbooks.Add ' add temp 'Working' Workbook ' Paste "Values Only" back into new temp workbook Range("A3").Select ' Goto 3rd Row Selection.PasteSpecial Paste:=xlFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False ' Copy Format of Selection Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False ' Copy Values of Selection ActiveCell.SpecialCells(xlLastCell).Select ' Goto last cell intLastRow = ActiveCell.Row intlastColumn = ActiveCell.Column ' Check to make sure that there are cells which are selected If intLastRow = 3 And intlastColumn = 1 Then Application.DisplayAlerts = False ' Temporarily switch off Display Alerts ActiveWindow.Close ' Delete newly created worksheet Application.DisplayAlerts = True ' Switch display alerts back on MsgBox "*** Please Make selection before running macro - Terminating ***", vbOKOnly, "Transfer Data to SQL Server" Exit Sub End If ' Prompt user for Name of SQL Server table strSQLTableName = InputBox("SQL Server Table Name?", "Transfer Excel Data To SQL", "##Table") ' if blank table name entered or 'Cancel' selected then exit If strSQLTableName = "" Then Application.DisplayAlerts = False ' Temporarily switch off Display Alerts ActiveWindow.Close ' Delete newly created worksheet Application.DisplayAlerts = True ' Switch display alerts back on Exit Sub End If ' encapsulate tablename with square brackets if user has not already done so strSQLTableName_Encap = Replace(Replace(Replace("[" & Replace(strSQLTableName, ".", "].[") & "]", "[]", ""), "[[", "["), "]]", "]") ' Try to determine if the First Row is a header row or contains data and if a header load names of Columns Range("A3").Select For intColumn = 1 To intlastColumn ' first check to see if the first row contains any pure numbers or pure dates If IsNumeric(ActiveCell.Value) Or IsDate(ActiveCell.Value) Then intHasHeaderRow = vbNo intDataStartRow = 3 Exit For Else strColumnHeader(intColumn) = ActiveCell.Value ActiveCell.Offset(1, 0).Range("A1").Select ' go to the row below If IsNumeric(ActiveCell.Value) Or IsDate(ActiveCell.Value) Then intHasHeaderRow = vbYes intDataStartRow = 4 End If ActiveCell.Offset(-1, 0).Range("A1").Select ' go back up to the first row If intHasHeaderRow = 0 Then ' if still not determined if header exists: Look for header using keywords intPos = 1 While intPos < Len(strConstHeaderKeyword) And intHasHeaderRow = 0 strKeyWord = Mid$(strConstHeaderKeyword, intPos, InStr(intPos, strConstHeaderKeyword, ",") - intPos) If InStr(1, ActiveCell.Value, strKeyWord) > 0 Then intHasHeaderRow = vbYes intDataStartRow = 4 End If intPos = InStr(intPos, strConstHeaderKeyword, ",") + 1 Wend End If End If ActiveCell.Offset(0, 1).Range("A1").Select ' Goto next column Next intColumn ' If auto header row detection has failed ask the user to manually select If intHasHeaderRow = 0 Then intHasHeaderRow = MsgBox("Does current selection have a header row?", vbYesNo, "Auto header row detection failure") If intHasHeaderRow = vbYes Then intDataStartRow = 4 Else intDataStartRow = 3 End If End If ' *** Determine the Data Type of each Column *** ' Go thru each Column to find Data types If intLastRow < intConstNumberRowsToAnalyse Then ' Check the first intConstNumberRowsToAnalyse rows or to end of selection whichever is less intRowCheck = intLastRow Else intRowCheck = intConstNumberRowsToAnalyse End If For intColumn = 1 To intlastColumn intdataTypelevel = 5 For intRow = intDataStartRow To intRowCheck Application.Goto Reference:="R" & CStr(intRow) & "C" & CStr(intColumn) If ActiveCell.Value = "" Then ' ignore blank (null) values ElseIf IsDate(ActiveCell.Value) = True And Len(ActiveCell.Value) >= 8 Then If intdataTypelevel > 4 Then intdataTypelevel = 4 ElseIf IsNumeric(ActiveCell.Value) = True And InStr(1, CStr(ActiveCell.Value), ".") = 0 And (Left(CStr(ActiveCell.Value), 1) <> "0" Or ActiveCell.Value = "0") And Len(ActiveCell.Value) < 10 Then If intdataTypelevel > 3 Then intdataTypelevel = 3 ElseIf IsNumeric(ActiveCell.Value) = True And InStr(1, CStr(ActiveCell.Value), ".") >= 1 Then If intdataTypelevel > 2 Then intdataTypelevel = 2 Else intdataTypelevel = 1 Exit For End If Next intRow If intdataTypelevel = 5 Then intdataTypelevel = 1 strDataType(intColumn) = strDataTypeLevel(intdataTypelevel) Next intColumn ' *** Build up the SQL intFormulaCount = 1 If intHasHeaderRow = vbYes Then ' *** Header Row *** Application.Goto Reference:="R4" & "C" & CStr(intlastColumn + 1) ' Goto next column in first data row of selection strFormula(intFormulaCount) = "= ""SELECT " For intColumn = 1 To intlastColumn If strDataType(intColumn) = "DATETIME" Then ' Code to take Excel Dates back to text strCellRef = "Text(" & fn_ColLetter(intColumn) & "4,""dd-mmm-yyyy hh:mm:ss"")" ElseIf strDataType(intColumn) = "VARCHAR(1000)" Then strCellRef = "SUBSTITUTE(" & fn_ColLetter(intColumn) & "4,""'"",""''"")" ' Convert any single ' to double '' Else strCellRef = fn_ColLetter(intColumn) & "4" End If strFormula(intFormulaCount) = strFormula(intFormulaCount) & "CAST('""& " & strCellRef & " & ""' AS " & strDataType(intColumn) & ") AS [" & strColumnHeader(intColumn) & "]" If intColumn < intlastColumn Then strFormula(intFormulaCount) = strFormula(intFormulaCount) + ", " Else strFormula(intFormulaCount) = strFormula(intFormulaCount) + " UNION ALL """ End If ' since each cell can only hold a maximum no. of chars if Formula string gets too big continue formula in adjacent cell If Len(strFormula(intFormulaCount)) > 700 And intColumn < intlastColumn Then strFormula(intFormulaCount) = strFormula(intFormulaCount) + """" intFormulaCount = intFormulaCount + 1 strFormula(intFormulaCount) = "= """ End If Next intColumn ' Assign the formula to the cell(s) just right of the selection For intColumn = 1 To intFormulaCount ActiveCell.Value = strFormula(intColumn) If intColumn < intFormulaCount Then ActiveCell.Offset(0, 1).Range("A1").Select ' Goto next column Next intColumn ' Auto Fill the formula for the full length of the selection ActiveCell.Offset(0, -intFormulaCount + 1).Range("A1:" & fn_ColLetter(intFormulaCount) & "1").Select If intLastRow > 4 Then Selection.AutoFill Destination:=Range(fn_ColLetter(intlastColumn + 1) & "4:" & fn_ColLetter(intlastColumn + intFormulaCount) & CStr(intLastRow)), Type:=xlFillDefault ' Go to start row of data selection to add 'Select into' code ActiveCell.Value = "SELECT * INTO " & strSQLTableName_Encap & " FROM (" & ActiveCell.Value ' Go to cells above data to insert code for deleting old table with the same name in separate SQL batch ActiveCell.Offset(-1, 0).Range("A1").Select ' go to the row above ActiveCell.Value = "GO" ActiveCell.Offset(-1, 0).Range("A1").Select ' go to the row above If Left(strSQLTableName, 1) = "#" Then ' temp table ActiveCell.Value = "IF OBJECT_ID('tempdb.." & strSQLTableName & "') IS NOT NULL DROP TABLE " & strSQLTableName_Encap Else ActiveCell.Value = "IF OBJECT_ID('" & strSQLTableName & "') IS NOT NULL DROP TABLE " & strSQLTableName_Encap End If ' For Big selections (i.e. several 100 or 1000 rows) SQL Server takes a very long time to do a multiple union - Split up the table creation into many inserts intRow = intConstMaxBatchSize + 4 ' add 4 to make sure 1st batch = Max Batch Size While intRow < intLastRow Application.Goto Reference:="R" & CStr(intRow - 1) & "C" & CStr(intlastColumn + intFormulaCount) ' Goto Row before intRow and the last column in formula selection ActiveCell.Value = Replace(ActiveCell.Value, " UNION ALL ", " ) a") ' Remove last 'UNION ALL' Application.Goto Reference:="R" & CStr(intRow) & "C" & CStr(intlastColumn + 1) ' Goto intRow and the first column in formula selection ActiveCell.Value = "INSERT " & strSQLTableName_Encap & " SELECT * FROM (" & ActiveCell.Value intRow = intRow + intConstMaxBatchSize ' increment intRow by intConstMaxBatchSize Wend ' Delete the last 'UNION AlL' replacing it with brackets to mark the end of the last insert Application.Goto Reference:="R" & CStr(intLastRow) & "C" & CStr(intlastColumn + intFormulaCount) ActiveCell.Value = Replace(ActiveCell.Value, " UNION ALL ", " ) a") ' Select all the formula cells ActiveCell.Offset(-intLastRow + 2, 1 - intFormulaCount).Range("A1:" & fn_ColLetter(intFormulaCount + 1) & CStr(intLastRow - 1)).Select Else ' *** No Header Row *** Application.Goto Reference:="R3" & "C" & CStr(intlastColumn + 1) ' Goto next column in first data row of selection strFormula(intFormulaCount) = "= ""SELECT " For intColumn = 1 To intlastColumn If strDataType(intColumn) = "DATETIME" Then strCellRef = "Text(" & fn_ColLetter(intColumn) & "3,""dd-mmm-yyyy hh:mm:ss"")" ' Format Excel dates into a text Date format that SQL will pick up ElseIf strDataType(intColumn) = "VARCHAR(1000)" Then strCellRef = "SUBSTITUTE(" & fn_ColLetter(intColumn) & "3,""'"",""''"")" ' Change all single ' to double '' Else strCellRef = fn_ColLetter(intColumn) & "3" End If ' Since no column headers: Name each column "Column001",Column002".. strFormula(intFormulaCount) = strFormula(intFormulaCount) & "CAST('""& " & strCellRef & " & ""' AS " & strDataType(intColumn) & ") AS [Column" & CStr(intColumn) & "]" If intColumn < intlastColumn Then strFormula(intFormulaCount) = strFormula(intFormulaCount) + ", " Else strFormula(intFormulaCount) = strFormula(intFormulaCount) + " UNION ALL """ End If ' since each cell can only hold a maximum no. of chars if Formula string gets too big continue formula in adjacent cell If Len(strFormula(intFormulaCount)) > 700 And intColumn < intlastColumn Then strFormula(intFormulaCount) = strFormula(intFormulaCount) + """" intFormulaCount = intFormulaCount + 1 strFormula(intFormulaCount) = "= """ End If Next intColumn ' Assign the formula to the cell(s) just right of the selection For intColumn = 1 To intFormulaCount ActiveCell.Value = strFormula(intColumn) If intColumn < intFormulaCount Then ActiveCell.Offset(0, 1).Range("A1").Select ' Goto next column Next intColumn ' Auto Fill the formula for the full length of the selection ActiveCell.Offset(0, -intFormulaCount + 1).Range("A1:" & fn_ColLetter(intFormulaCount) & "1").Select If intLastRow > 4 Then Selection.AutoFill Destination:=Range(fn_ColLetter(intlastColumn + 1) & "3:" & fn_ColLetter(intlastColumn + intFormulaCount) & CStr(intLastRow)), Type:=xlFillDefault ' Go to start row of data selection to add 'Select into' code ActiveCell.Value = "SELECT * INTO " & strSQLTableName_Encap & " FROM (" & ActiveCell.Value ' Go to cells above data to insert code for deleting old table with the same name in separate SQL batch ActiveCell.Offset(-1, 0).Range("A1").Select ' go to the row above ActiveCell.Value = "GO" ActiveCell.Offset(-1, 0).Range("A1").Select ' go to the row above If Left(strSQLTableName, 1) = "#" Then ' temp table ActiveCell.Value = "IF OBJECT_ID('tempdb.." & strSQLTableName & "') IS NOT NULL DROP TABLE " & strSQLTableName_Encap Else ActiveCell.Value = "IF OBJECT_ID('" & strSQLTableName & "') IS NOT NULL DROP TABLE " & strSQLTableName_Encap End If ' For Big selections (i.e. serveral 100 or 1000 rows) SQL Server takes a very long time to do a multiple union - Split up the table creation into many inserts intRow = intConstMaxBatchSize + 3 ' add 3 to make sure 1st batch = Max Batch Size While intRow < intLastRow Application.Goto Reference:="R" & CStr(intRow - 1) & "C" & CStr(intlastColumn + intFormulaCount) ' Goto Row before intRow and the last column in formula selection ActiveCell.Value = Replace(ActiveCell.Value, " UNION ALL ", " ) a") ' Remove last 'UNION ALL' Application.Goto Reference:="R" & CStr(intRow) & "C" & CStr(intlastColumn + 1) ' Goto intRow and the first column in formula selection ActiveCell.Value = "INSERT " & strSQLTableName_Encap & " SELECT * FROM (" & ActiveCell.Value intRow = intRow + intConstMaxBatchSize ' increment intRow by intConstMaxBatchSize Wend ' Delete the last 'UNION AlL' Application.Goto Reference:="R" & CStr(intLastRow) & "C" & CStr(intlastColumn + intFormulaCount) ActiveCell.Value = Replace(ActiveCell.Value, " UNION ALL ", " ) a") ' Select all the formula cells ActiveCell.Offset(-intLastRow + 1, 1 - intFormulaCount).Range("A1:" & fn_ColLetter(intFormulaCount + 1) & CStr(intLastRow)).Select End If ' Final Selection to clipboard and Cleaning of data Selection.Copy Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False ' Repaste "Values Only" back into cells Selection.Replace What:="CAST('' AS", Replacement:="CAST(NULL AS", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False ' convert all blank cells to NULL Selection.Replace What:="'00-Jan-1900 00:00:00'", Replacement:="NULL", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False ' convert all blank Date cells to NULL Selection.Replace What:="'NULL'", Replacement:="NULL", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False ' convert all 'NULL' cells to NULL Selection.Replace What:=vbTab, Replacement:=" ", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False ' Replace all Tabs in cells to Space to prevent Double Quotes occuring in the final paste text Selection.Copy MsgBox "SQL Code has been added to clipboard - Please Paste into SSMS window", vbOKOnly, "Transfer to SQL" Application.DisplayAlerts = False ' Temporarily switch off Display Alerts ActiveWindow.Close ' Delete newly created worksheet Application.DisplayAlerts = True ' Switch display alerts back on End Sub Function fn_ColLetter(Col As Integer) As String Dim strColLetter As String If Col > 26 Then ' double letter columns strColLetter = Chr(Int((Col - 1) / 26) + 64) & _ Chr(((Col - 1) Mod 26) + 65) Else ' single letter columns strColLetter = Chr(Col + 64) End If fn_ColLetter = strColLetter End Function

qaru.site

c# - SQL Server: способ представления таблицы Excel в SQL Server

Я ищу способ переместить все это в SQL Server и сделать там что-нибудь. Например, я хотел бы загрузить файлы с SQL Server в Excel, внести изменения (даже в заголовки строк) и загрузить их обратно. С VBA или С#.

Почему вы хотите "загружать файлы" из базы данных, чтобы изменить содержимое, а затем перезагрузить их? Это побеждает всю цель базы данных...

Я предлагаю вам работать исключительно в базе данных и редактировать свои данные через соответствующие операторы SQL или, если вам неудобно, использовать такой инструмент, как SQL Developer или SQL Server Management Studio.

С чем я должен быть осторожен?

Смешивание Excel и базы данных. Они имеют разные цели и возможности и должны использоваться соответственно.

Каковы возможные ошибки, я должен стараться избегать?

См. Выше. Проверьте данные в листах Excel, возможно, потребуется экранирование из-за специальных/зарезервированных символов, если вы вставляете их в базу данных. Выберите соответствующие типы данных для столбцов базы данных. Используйте ограничения для обеспечения определенного уровня качества данных. Там больше тонны, если вы совершенно новичок в базах данных, это может быть хорошим началом (я уверен, что есть много других уроков, просто ознакомьтесь с основными понятиями): http://www.techonthenet.com/sql_server/

Создать файл таблицы Excel Excel;

Используйте цикл for, чтобы просмотреть все файлы. Если они все находятся в одной папке, они должны быть довольно прямолинейными, если они распределены по всей системе, вам нужно либо иметь лист конфигурации со всеми файловыми путями, либо вам нужно подумать, если какая-либо другая логика для идентификации соответствующих файлов на вашем ПК.

Чтобы открыть файл, используйте метод Workbooks.Open в VBA. Назначьте рабочую книгу объекту, чтобы вы могли работать с ним более легко. Таким образом, у вас будет доступ ко всем его свойствам и данным. Используйте их для создания CREATE TABLE [...] SQL-Statement. Это выражение создаст вашу таблицу.

Подключитесь к базе данных и выполните указанный оператор через объект ADODB.Connection.

За цикл будет делать это для всех ваших файлов Excel, так что будет таблица базы данных для каждого файла Excel.

Прочитайте заголовки файла Excel

Это будет частью вышеприведенного шага, так как вам, скорее всего, понадобится информация заголовка для создания ваших таблиц (определение столбцов и т.д.). В случае, если ваш "заголовок" состоит из первой строки на листе, вы можете получить содержимое с помощью Worksheet.Cells или Worksheet.Range в VBA.

Создайте столбцы с ними и заполните данные.

Создание столбцов также будет частью создания таблицы. Заполнение таблиц содержимым может работать аналогично.

Используйте цикл for-loop для перехода по каждой строке и создайте INSERT INTO [...] SQL для каждой строки, затем выполните ее (или если вы создаете массив для хранения всех операторов вставки и выполняете их в массе Я бы предпочел это, но он более продвинутый, чем просто создание инструкции и ее выполнение сразу). Не забудьте совершить.

Если у вас есть какие-то конкретные вопросы, не стесняйтесь спрашивать. Надеюсь, это поможет создать основу для вашего проекта. Если вы столкнулись с трудностями при попытке реализовать определенные аспекты всего этого, скорее всего, это будет существующее решение где-то в StackOverflow или Google. Я думаю, что с VBA я никогда не сталкивался с тем, что никогда не было сделано раньше, есть много ресурсов, доступных для получения фрагментов кода для конкретных проблем.

qaru.site

Импорт Excel в SQL со смешанными столбцами – большие номера содержат E + MS Excel онлайн

Я импортирую документ Excel в таблицу SQL с помощью мастера импорта. Моя таблица содержит много столбцов, а некоторые из них содержат номера телефонов и идентификаторы номеров / букв, которые довольно длинны (10 + номера).

После импорта документа Excel эти числа будут изменены. Пример: 22222222222222200000 хранится как 2.22222E + 19 в базе данных SQL.

Я пробовал форматировать столбцы в Excel как строки, общие, целочисленные и т. Д., Но это, похоже, не имеет значения. Когда столбцы установлены в целое число, они точно показывают число в Excel, но при импорте они модифицируются, чтобы содержать E +.

При загрузке мастер импорта автоматически предполагает, что эти столбцы являются «Float», и я попытался изменить их на nvarchar. Импорт по-прежнему будет изменять большие числа.

Есть ли способ импортировать эти значения точно так же, как они появляются в Excel?

Solutions Collecting From Web of "Импорт Excel в SQL со смешанными столбцами – большие номера содержат E +"

Я видел эту проблему раньше, это Excel, это проблема не SSIS. Excel отображает первые несколько строк, а затем вводит тип данных, даже если вы явно задали его в тексте. Что вам нужно сделать, это поместить это в строку подключения файла Excel в пакете SSIS. Эта команда сообщает Excel, что столбцы содержат смешанные типы данных и намекает на необходимость дополнительной проверки, прежде чем решить, что столбец является числовым, если на самом деле это не так.

;Extended Properties="IMEX=1"

Он должен работать с этим (в большинстве случаев). Более безопасная вещь – экспортировать данные Excel в текст с разделителями табуляции и использовать SSIS для импорта.

существует возможность редактировать сопоставление столбцов с выбранным типом данных. он находится на одном из последних этапов мастера. будьте осторожны, чтобы не потерять 0 в начале телефонных номеров из-за преобразования данных, это может когда-нибудь стать настоящей головной болью, когда вы пропустите это

excel.bilee.com

Вставка строк из Excel в SQL Server MS Excel онлайн

Я работаю над вставкой из Excel 2010 в SQL Server 2008. Мне удалось успешно вставить одно значение ячейки в таблицу SQL из excel с помощью кнопки. Теперь я пытаюсь вставить много строк. Я пытаюсь использовать один цикл для повторения и вставки значений. Мой код выглядит следующим образом:

Option Explicit Private Conn As ADODB.Connection Private Sub CommandButton1_Click() Dim val1 As Integer Dim i As Integer Dim Conn As ADODB.Connection Dim sConnString As String For i = 1 To 2 Cells(i, 1) = "val1" Next i 'This will create the string to connect. sConnString = "Driver={SQL Server};Data Source=**;Initial Catalog = **;Trusted_Connection =yes;" 'Create Connection and the Recordset Objects. Set Conn = New ADODB.Connection 'Open the Connection in Order to Execute. Conn.Open sConnString Conn.Execute ("insert into TestTable(TestColumn) Values(" & val1 & ")") 'Clean If CBool(Conn.State And adStateOpen) Then Conn.Close Set Conn = Nothing End Sub

Я вставляю значение в таблицу, но это не значения, которые находятся в ячейках A1: A2. Может ли кто-нибудь сказать мне, как моя петля и моя инструкция вставки неверны? Есть ли лучший способ справиться с этим. Я знаю, что на данный момент я использую только 2 строки, но я буду вставлять 1100 строк, поэтому нужен цикл или итеративный процесс.

Спасибо за ваше время.

Solutions Collecting From Web of "Вставка строк из Excel в SQL Server"

Вы неправильно устанавливаете val1. Изменить:

Cells(i, 1) = "val1"

в

val1 = Cells(i, 1)

Попробуйте следующее:

Option Explicit Private Conn As AD ODB.Connection Private Sub CommandButton1_Click() Dim val(1100) As Integer Dim i As Integer Dim Conn As ADODB.Connection Dim sConnString As String For i = 1 To 2 val(i) = Cells(i,1).value 'This will create the string to connect. sConnString = "Driver={SQL Server};Data Source=**;Initial Catalog = **;Trusted_Connection =yes;" 'Create Connection and the Recordset Objects. Set Conn = New ADODB.Connection 'Open the Connection in Order to Execute. Conn.Open sConnString Conn.Execute ("insert into TestTable(TestColumn) Values(" & val(i) & ")") 'Clean If CBool(Conn.State And adStateOpen) Then Conn.Close Set Conn = Nothing Next i End Sub

excel.bilee.com