Імпорт даних у SQL Server або базу даних Azure з Excel
Імпортувати дані з файлів Excel у SQL Server або базу даних SQL Azure можна кількома способами. Деякі методи дозволяють імпортувати дані за один крок безпосередньо із файлів Excel. Для інших методів необхідно експортувати дані Excel у вигляді тексту (CSV-файлу), перш ніж їх можна буде імпортувати.
У цій статті перелічені методи, що часто використовуються, і містяться посилання для отримання додаткових відомостей. Однак в ній не вказано повного опису таких складних інструментів і служб, як SSIS або Фабрика даних Azure. Додаткові відомості про рішення, що вас цікавить, див. за вказаними посиланнями.
Список методів
Існує кілька способів імпорту даних із Excel. Щоб використати деякі з цих засобів, необхідно встановити СЕРЕДОВИЩЕ SQL Server Management Studio (SSMS).
Для імпорту даних із Excel можна використовувати такі засоби:
| Спочатку експортуйте текст (SQL Server та База даних SQL Azure) |
Безпосередньо із Excel (тільки у локальному середовищі SQL Server) |
| Майстер імпорту неструктурованих файлів |
майстер імпорту та експорту SQL Server |
| Інструкція BULK INSERT |
Служби SQL Server Integration Services |
| Засіб масового копіювання (bcp) |
Функція OPENROWSET |
| Майстер копіювання (Фабрика даних Azure) |
| Фабрика даних Azure |
Якщо ви хочете імпортувати кілька аркушів із книги Excel, зазвичай потрібно запускати кожен із цих коштів окремо для кожного аркуша.
Додаткові відомості див. в обмеженнях та відомих проблемах для завантаження даних у файли Excel або з неї.
Майстер імпорту та експорту
Імпортуйте дані безпосередньо з файлів Excel за допомогою майстра імпорту та експорту SQL Server. Ви також можете зберегти параметри у вигляді пакета СЛУЖБ SQL Server Integration Services (SSIS), який можна налаштувати та повторно використовувати пізніше.
- У SQL Server Management Studio підключіться до екземпляра ядра СУБД SQL Server.
- Розгорніть вузол Бази даних.
- Клацніть правою кнопкою миші базу даних.
- Виберіть "Завдання".
- Виберіть Імпортувати дані або Експортувати дані:
Для отримання додаткових відомостей див. у наступних статтях:
Служби Integration Services (SSIS)
Якщо ви знайомі з SQL Server Integration Services (SSIS) і не хочете запускати майстер імпорту та експорту SQL Server, можна створити пакет служб SSIS, який використовує джерело Excel та призначення SQL Server у потоці даних.
Для отримання додаткових відомостей див. у наступних статтях:
Щоб навчитися створювати пакети SSIS, див. керівництво How to Create an ETL Package (Як створити пакет ETL).
OPENROWSET та пов'язані сервери
У базі даних SQL Azure неможливо імпортувати безпосередньо з Excel. Спочатку необхідно експортувати дані до текстового файлу (CSV).
Постачальник ACE (колишня назва – постачальник Jet), який підключається до джерел даних Excel, призначений для інтерактивного використання клієнта. Якщо ви використовуєте постачальник ACE у SQL Server, особливо в автоматизованих процесах або процесах, що виконуються паралельно, можуть з'явитися непередбачені результати.
Розподілені запити
Імпортуйте дані безпосередньо з файлів Excel у SQL Server за допомогою функції Transact-SQL OPENROWSET або OPENDATASOURCE . Така операція називається розподілений запит.
У базі даних SQL Azure неможливо імпортувати безпосередньо з Excel. Спочатку необхідно експортувати дані до текстового файлу (CSV).
Перед виконанням розподіленого запиту необхідно включити параметр Ad Hoc Distributed Queries у конфігурації сервера, як показано нижче. Для отримання додаткових відомостей див. у розділі "Конфігурація сервера: нерегламентовані розподілені запити".
sp_configure 'show advanced options', 1; RECONFIGURE; GO sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE; GO
У наведеному нижче прикладі коду дані імпортуються з листа Excel Sheet1 у нову таблицю бази даних за допомогою OPENROWSET.
USE ImportFromExcel; GO SELECT * INTO Data_dq FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0; Database=C:\Temp\Data.xlsx', [Sheet1$]); GO
Нижче наведено той самий приклад з OPENDATASOURCE.
USE ImportFromExcel; GO SELECT * INTO Data_dq FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0', 'Data Source=C:\Temp\Data.xlsx;Extended Properties=Excel 12.0'). [Sheet1 $]; GO
Щоб додати імпортовані дані в існуючу Використовуйте синтаксис INSERT INTO . SELECT. FROM. замість синтаксису SELECT. INTO. FROM. із попередніх прикладів.
Використовуйте стандартний синтаксис SELECT для отримання доступу до даних Excel без імпорту. FROM. .
Для отримання додаткових відомостей про розподілені запити див. у наступних статтях:
1 Розподілені запити, як і раніше, підтримуються в SQL Server, але документація цієї функції не оновлюється.
Пов'язані сервери
Крім того, можна налаштувати постійне підключення від SQL Server до файлу Excel як до пов'язаному серверу. У прикладі нижче дані імпортуються з аркуша Excel Data на існуючому зв'язаному сервері EXCELLINK до нової таблиці бази даних SQL Server з ім'ям Data_ls.
USE ImportFromExcel; GO SELECT * INTO Data_ls FROM EXCELLINK. [Data$]; GO
Ви можете створити зв'язаний сервер з SQL Server Management Studio (SSMS) або запустити системну процедуру sp_addlinkedserver , як показано в наступному прикладі.
DECLARE @RC INT; DECLARE @server NVARCHAR(128); DECLARE @srvproduct NVARCHAR(128); DECLARE @provider NVARCHAR(128); DECLARE @datasrc NVARCHAR(4000); DECLARE @location NVARCHAR(4000); DECLARE @provstr NVARCHAR(4000); DECLARE @catalog NVARCHAR(128); -- Set parameter values SET @server = 'EXCELLINK'; SET @srvproduct = 'Excel'; SET @provider = 'Microsoft.ACE.OLEDB.12.0'; SET @datasrc = 'C:\Temp\Data.xlsx'; SET @provstr = 'Excel 12.0'; EXEC @RC = [master].[dbo].[sp_addlinkedserver] @server, @srvproduct, @provider, @datasrc, @location, @provstr, @catalog;
Для отримання додаткових відомостей про пов'язані сервери див. у наступних статтях:
Додаткові приклади та відомості про пов'язані сервери та розподілені запити див. у наступній статті:
Необхідні компоненти
Щоб використовувати інші методи, описані на цій сторінці ( BULK INSERT оператор, засіб bcp або Фабрика даних (Azure), спочатку необхідно експортувати дані Excel у текстовий файл.
Збереження даних Excel у вигляді тексту
В Excel виберіть "Файл" | Збережіть як та виберіть текст (розділювача табуляції) (*.txt) або CSV (розділювачі-коми) (*.csv) як тип цільового файлу.
Якщо ви хочете експортувати кілька аркушів з книги, виберіть кожний аркуш і повторіть процедуру. Команда Зберегти як експортує лише активний лист.
Щоб оптимізувати використання імпорту, зберігайте аркуші, які містять лише заголовки стовпців та рядки даних. Якщо збережені дані містять заголовки сторінок, порожні рядки, нотатки тощо. д., при імпорті даних можуть виникнути непередбачені результати.
Майстер імпорту неструктурованих файлів
Імпортуйте дані, збережені як текстові файли, виконавши інструкції на сторінках майстра імпорту неструктурованих файлів.
Як описано раніше в розділі "Попередні вимоги", необхідно експортувати дані Excel у вигляді тексту, перш ніж використовувати майстер імпорту неструктурованих файлів для імпорту.
Щоб отримати додаткові відомості про майстра імпорту неструктурованих файлів, див. у розділі Майстер імпорту неструктурованих файлів у SQL.
Команда BULK INSERT
BULK INSERT — це команда Transact-SQL, яку можна виконати у SQL Server Management Studio. У наведеному нижче прикладі дані завантажуються з файлу Data.csv з роздільниками-комами в існуючу таблицю бази даних.
Як описано раніше в розділі попередніх вимог, необхідно експортувати дані Excel у вигляді тексту, перш ніж використовувати BULK INSERT для імпорту.BULK INSERT Неможливо зчитувати файли Excel безпосередньо. BULK INSERT За допомогою команди можна імпортувати файл CSV, що зберігається локально або в сховище BLOB-об'єктів Azure.
USE ImportFromExcel; GO BULK INSERT Data_bi FROM 'C:\Temp\data.csv' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n'); GO
Додаткові відомості та приклади SQL Server та База даних SQL Azure див. у таких статтях:
Засіб масового копіювання (bcp)
Засіб bcp запускається із командного рядка. У наведеному прикладі дані завантажуються з файлу Data.csv з роздільниками-комами в існуючу таблицю бази даних Data_bcp .
Як описано раніше у розділі "Попередні вимоги", необхідно експортувати дані Excel у вигляді тексту, перш ніж використовувати bcp для його імпорту. Засіб bcp не може безпосередньо читати файли Excel. Використовується для імпорту SQL Server або бази даних SQL з текстового файлу (CSV), збереженого в локальному сховищі.
Для текстового файлу (CSV), що зберігається у сховищі BLOB-об'єктів Azure, використовуйте BULK INSERT або OPENROWSET . Приклад див. у розділі "Використання BULK INSERT" або OPENROWSET(BULK. ) для імпорту даних у SQL Server.
bcp.exe ImportFromExcel..Data_bcp in "C:\Temp\data.csv" -T -c -t ,
Додаткові відомості про bcp див. у наступних статтях:
Майстер копіювання (ADF)
Імпортуйте дані, збережені як текстові файли, за допомогою покрокової інструкції майстра копіювання Фабрики даних Azure (ADF).
Як описано раніше в розділі "Попередні вимоги", необхідно експортувати дані Excel у вигляді тексту, перш ніж використовувати завод даних Azure для його імпорту. Фабрика даних не може зчитувати файли Excel безпосередньо.
Щоб отримати додаткові відомості про майстра копіювання, див.
Azure Data Factory
Якщо ви вже працювали з фабрикою даних Azure і не хочете запускати майстер копіювання, створіть конвеєр з копіюванням з текстового файлу в SQL Server або Базу даних SQL Azure.
Як описано раніше в розділі "Попередні вимоги", необхідно експортувати дані Excel у вигляді тексту, перш ніж використовувати завод даних Azure для його імпорту. Фабрика даних не може зчитувати файли Excel безпосередньо.
Додаткові відомості про використання цих джерел та приймачів фабрики даних див. у наступних статтях:
Щоб дізнатися, як скопіювати дані за допомогою фабрики даних Azure, див.
Поширені помилки
Microsoft.ACE.OLEDB.12.0" не зареєстровано
Ця помилка виникає, оскільки постачальник OLEDB не встановлено. Встановіть його з поширеного компонента Microsoft Access ядро СУБД 2016. Не забудьте встановити 64-розрядну версію, якщо Windows та SQL Server — 64-розрядні.
Повний текст помилки.
Msg 7403, Level 16, State 1, Line 3 The OLE DB provider "Microsoft.ACE.OLEDB.12.0" не буде registered.
Неможливо створити екземпляр постачальника OLE DB "Microsoft.ACE.OLEDB.12.0" для зв'язаного сервера "(null)"
Ця помилка означає, що Microsoft OLEDB не налаштований належним чином. Щоб вирішити цю проблему, виконайте наступний код Transact-SQL:
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1; EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1;
Повний текст помилки.
Msg 7302, Level 16, State 1, Line 3 Cannot створено за допомогою OLE DB provider "Microsoft.ACE.OLEDB.12.0" для linked server "(null)".
32-розрядний постачальник OLE DB "Microsoft.ACE.OLEDB.12.0" не може бути завантажений у процесі на 64-розрядну версію SQL Server.
Ця помилка виникає під час встановлення 32-розрядної версії постачальника OLD DB з 64-розрядною версією SQL Server. Щоб вирішити цю проблему, видаліть 32-розрядну версію та встановіть 64-розрядну версію постачальника OLE DB замість неї.
Повний текст помилки.
Msg 7438, Level 16, State 1, Line 3 The 32-bit OLE DB provider "Microsoft.ACE.OLEDB.12.0" може бути завантажений в-процес на 64-bit SQL Server.
Постачальник OLE DB "Microsoft.ACE.OLEDB.12.0" для зв'язаного сервера "(null)" повідомив про помилку.
Ця помилка зазвичай вказує на проблеми з роздільною здатністю між процесом SQL Server і файлом. Переконайтеся, що обліковий запис SQL Server має дозвіл на повний доступ до файлу. Ми не рекомендуємо імпортувати файли з настільного комп'ютера.
Повний текст помилки.
Msg 7399, Level 16, State 1, Line 3 OLE DB provider "Microsoft.ACE.OLEDB.12.0" для linked server "(null)" reported an error. Provider did not give any information про the error.
Неможливо ініціалізувати об'єкт джерела даних постачальника OLE DB "Microsoft.ACE.OLEDB.12.0" для зв'язаного сервера "(null)"
Ця помилка зазвичай вказує на проблеми з роздільною здатністю між процесом SQL Server і файлом. Переконайтеся, що обліковий запис SQL Server має дозвіл на повний доступ до файлу. Ми не рекомендуємо імпортувати файли з настільного комп'ютера.
Повний текст помилки.
Msg 7303, Level 16, State 1, Line 3 Cannot initialize the source object data of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".
Пов'язаний контент
SQL-Ex blog
Керівництво: як автоматизувати імпорт даних із Excel до бази даних, використовуючи VBA
- MS Access за допомогою ODBC, якщо даних небагато (просто скопіювати/вставити).
- Використовувати майстер імпорту та експорту даних, якщо даних багато
Тут передбачається, що ваші дані не є перехресною (півот) таблицею.
Встановлення
Почнемо зі створення макросу в Excel. На вкладці “Developer” стрічки (її може не бути за замовчуванням; ви можете додати її з меню Options), клацніть кнопку “View Code” (для Windows можна використовувати комбінацію клавіш Alt+F11).
У верхньому меню: Insert >> Module
На новій панелі (де друкується код) створіть функцію public:
Public Function ImportData()
End
Якщо ви надрукуєте “public function ImportData”, натисніть Enter, решта буде додано автоматично; тобто. будуть додані круглі дужки та ключове слово End.
Не забудьте зберегти файл з розширенням .xlsm, т.к. це книга з включеними макрокомандами (а чи не " звичайна " книга).
Огляд концепції
Ми будемо виконувати оператор INSERT у наступному форматі:
INSERT INTO myTableName
(field1, field2)
VALUES
(row1Value1, row1Value2),
(row2Value1, row2Value2)
- Заголовок SQL (INSERT INTO myTableName)
- Динамічно згенеровані "values", що є конкатенацією окремих рядків даних з електронної таблиці.
Давайте напишемо код!
Спочатку потрібно створити рядок підключення. Я залишаю точне значення для вас. Ви, звичайно, повинні переконатися, що користувач має необхідні дозволи на безпеку бази даних. У прикладі нижче використовується Active Directory - тому він виявляє мій вхід до Windows і не використовує локальний обліковий запис користувача SQL.
Я підключаюсь через ODBC. Якщо драйвер не встановлений на вашій машині, завантажте його.
У моєму випадку рядок підключення виглядає так:
Const strDbConn As String = "server=myServerName;Database=myDatabaseName;Trusted_Connection=Yes;Driver="
Для цього я створив глобальну змінну, розміщену вище оголошення функції, яке ми щойно створили.
Глобальну змінну ми можемо використовувати й інших функціях.
У мене є проста функція для виконання SQL:
Public Function RunSQL(strDbConn As String, strSQL As String)
Dim cnn As Object
Dim rst As Object
Set cnn = CreateObject("ADODB.Connection")
cnn.Open strDbConn
Set rst = CreateObject("ADODB.Recordset")
rst.Open strSQL, cnn, 3, 1 '3 = Keyset, 1 = Pessimistic
Set rst = Nothing
End Function
Помилка ADODB?
Цей код працює без необхідності додавати зовні посилання. Але якщо ви отримуєте помилку.
Раніше - можливо, це була попередня версія Excel - мені потрібно додати посилання, щоб використовувати код ADODB.
Ви можете це зробити в меню Tools >> References:
Відповідно до цієї статті вам потрібно зняти прапорець опції Microsoft ActiveX Data Objects [x.x] Library.
Вставка даних за допомогою SQL: заголовок
Нам потрібно створити початкову частину оператора SQL, яка буде статичною (тобто не змінюватиметься).
Створимо функцію, яка повертає жорстко закодований результат першої частини оператора INSERT для заданої таблиці та імен полів:
Public Function GetInsertHeader() As String
Dim strHeader As String
strHeader = ""
strHeader = strHeader & " INSERT INTO myTableName ("
strHeader = strHeader & "[field_one]"
strHeader = strHeader & " ,[field_two]"
strHeader = strHeader & " ,[field_three]"
strHeader = strHeader & ")"
GetInsertHeader = strHeader
End Function
Звичайно, вам потрібно змінити імена таблиці та полів
Вставка даних за допомогою SQL: самі дані
Нам потрібний спосіб для динамічної генерації values, які вставлятимуться до бази даних. Перш ніж створити SQL, нам потрібний спосіб проходу по всіх рядках в Excel зверху до низу. На першому кроці потрібно визначити скільки рядків у нас є.
Я використовую функцію нижче, щоб отримати кількість рядків в електронній таблиці.
Я визначаю тип LONG, оскільки Integer (ціле) є недостатньо великим для мого набору даних. Ціле обмежено 32000 рядками.
Public Function HowManyRows(sheetName As String) As Long
'Find out how many row there are
' Assumes the first column does NOT have a blank in it
Sheets(sheetName).Select
Range("A1").Select
Selection.End(xlDown).Select
Dim totalRows As Long
totalRows = ActiveCell.Row 'do NOT subtract one for the header
HowManyRows = totalRows
End Function
Проходячи в циклі кожен ряд, ми будемо створювати рядок, який бере значення окремих стовпців і додає їх до оператора SQL. Код наведений нижче:
Public Function getSQLForSingleRow(sheet As String, rowNumber As Long) As String
' Не забудьте змінити форматування, наприклад, дати або числа
fieldWithText = ReplaceSingleQuote(Worksheets(sheet).Range("A" & rowNumber).FormulaR1C1)
fieldWithDate = Format(Worksheets(sheet).Range("B" & rowNumber).FormulaR1C1, "mm/dd/yyyy")
fieldWithNumbers = CDbl(Nz(Worksheets(sheet).Range("C" & rowNumber).FormulaR1C1))
Dim strSQL As String
strSQL = "("
strSQL = strSQL & "'" & fieldWithText & "',"
strSQL = strSQL & "'" & fieldWithDate & "',"
strSQL = strSQL & " " & fieldWithNumbers & "" ' Кавички не потрібні, т.к. це число
strSQL = strSQL & " "
getSQLForSingleRow = strSQL
End Function
Я маю дві допоміжні функції; одну для тексту, а іншу для чисел. Якщо значення є текст, нам потрібно замінити ("екранувати") одиночну лапку, для цього у мене є така функція:
Public Function ReplaceSingleQuote(str As String) As String
If Len(Trim(str)) > 0 Then
ReplaceSingleQuote = Replace(str, "'", "''")
Else
ReplaceSingleQuote = str
End If
End Function
Я також створив функцію nz() (як "null-нуль", яка вбудована в деякі мови програмування), яка замінюватиме числові значення на "0", при необхідності:
Function Nz(value As String) As Double
If IsNull(value) Or (value = "") Then
Nz = 0
Else
Nz = value
End If
End Function
Ось код, який проходить у циклі кожен рядок електронної таблиці та генерує оператор SQL:
Public Function ImportData(sheet As String)
Dim i As Integer
Dim strSQL As String
Dim totalRows As Long
totalRows = HowManyRows(sheet)
strInsertHeader = GetInsertHeader()
Dim strIndividualRows As String
strIndividualRows = ""
For i = 2 To totalRows
strIndividualRows = strIndividualRows & getSQLForSingleRow(sheet, i)
' додати кому в кінці,
' яку видалимо потім, якщо потрібно
strIndividualRows = strIndividualRows & ","
Next
strSQL = strInsertHeader & " VALUES " & strIndividualRows
strSQL = RemoveLastCharacterIfComma(strSQL)
Call RunSQL(strDbConn, strSQL)
Range("A1").Select
MsgBox "Complete"
End Function
- Викликаємо функцію, яка передає ім'я електронної таблиці (аркуш) із даними, щоб визначити кількість рядків у наборі.
- Створюємо змінну, яка містить початок оператора SQL.
- Обходимо у циклі кожен рядок набору даних, створюючи оператор INSERT. VALUES.
- Наприкінці кожного рядка даних додаємо кому.
- Видаляємо останню кому в операторі.
- Виконуємо SQL.
Public Function RemoveLastCharacterIfComma(str As String) As String
str = Trim(str)
If Right(str, 1) = "," Then
RemoveLastCharacterIfComma = Left(str, Len(str) - 1)
Else
RemoveLastCharacterIfComma = str
End If
End Function
Як обійти обмеження на імпорт даних
Я зіткнувся з тим, що при надто довгих конкатенованих "значеннях" Excel зазнає краху. З'ясувалося, що я маю обмежити скрипт імпортування до 500 рядків одночасно.
Ось оновлений код:
Public Function ImportData(sheet As String)
Dim i As Long
Dim strSQL As String
Dim totalRows As Long
totalRows = HowManyRows(sheet)
strInsertHeader = GetInsertHeader()
Dim strIndividualRows As String
strIndividualRows = ""
For i = 2 To totalRows
strIndividualRows = strIndividualRows & getSQLForSingleRow(sheet, i)
' add comma at the end no matter what; remove last one after
strIndividualRows = strIndividualRows & ","
'Worksheets("Instructions").Range("I2").FormulaR1C1 = "Rows read in: " & i
' вставляти в базу даних, поки не стане занадто великий
If (i Mod 500) = 0 Then
strSQL = strInsertHeader & " VALUES " & strIndividualRows
strSQL = RemoveLastCharacterIfComma(strSQL)
Call RunSQL(strDbConn, strSQL)
strIndividualRows = ""
'Debug.Print "в middle of importing " & i
End If
Next
' вставити в останній пакет
strSQL = strInsertHeader & " VALUES " & strIndividualRows
strSQL = RemoveLastCharacterIfComma(strSQL)
Call RunSQL(strDbConn, strSQL)
strIndividualRows = ""
'Debug.Print "last row" & i
Range("A1").Select
' Complete: clear out the status
' Worksheets("Instructions").Range("I1").Formula2R1C1 = ""
' Worksheets("Instructions").Range("I2").Formula2R1C1 = ""
'MsgBox sheet + "data imported"
End Function
Як можна побачити, коли змінна, в якій зберігається значення, що генеруються, досягає 500 символів, в базу даних вставляються накопичені на той час дані. Після завершення циклу вставляється пакет, що залишився.
Я залишив деякий код закоментованим, який повідомляє користувача про те, як рухається процес імпорту.
В остаточному коді є ще одна перевірка для виконання лише останнього пакета коду за потреби. Зараз, якщо ви намагаєтеся імпортувати кількість рядків, кратну 500, ви отримаєте повідомлення про помилку.
Збираємо всі разом
Щоб зробити це кориснішим, нам може знадобитися видаляти існуючі дані.
Хоча ви можете отримати дату останнього оновлення з набору даних, цей приклад коду демонструє додатковий оператор SQL для виконання запиту UPDATE з метою вказати дати імпорту.
- Видаляє наявні дані.
- Викликає функцію, яка імпортує дані.
- Виконує запит UPDATE для визначення дати оновлення даних.
Public Sub autoImport()
' Спочатку видаляємо існуючі дані
Dim strSQL As String
strSQL = "DELETE FROM myTableName" ' Альтернативно можна використовувати TRUNCATE
Call RunSQL(strDbConn, strSQL)
'Імпорт нових даних
Call ImportData("tabWithData") ' Перевірте, чи передали ім'я аркуша, або отримайте його динамічно
' Вказуємо, коли дані оновлювалися; я використовую таблицю "utility"
Dim theDate As String
theDate = InputBox("Enter date that the data for", "Data as of", Format(Now, "m/d/yyyy"))
strSQL = "UPDATE Utility SET value = '" & ReplaceSingleQuote(theDate) & "'
Call RunSQL(strDbConn, strSQL)
Range("A1").Select
MsgBox "Data has been imported"
End Sub