Поделиться через


Импорт данных в SQL Server или базу данных Azure из Excel

Область применения: SQL Server База данных SQL Azure

Импортировать данные из файлов 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), который можно настроить и повторно использовать позже.

  1. В SQL Server Management Studio подключитесь к экземпляру ядро СУБД SQL Server.

  2. Разверните узел Базы данных.

  3. Щелкните базу данных правой кнопкой мыши.

  4. Выберите "Задачи".

  5. Выберите Импортировать данные или Экспортировать данные:

    Снимок экрана: мастер запуска SSMS.

Откроется мастер:

Снимок экрана: подключение к источнику данных Excel.

Дополнительные сведения см. в следующих статьях:

Службы 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 ... из предыдущих примеров.

Для обращения к данным Excel без импорта используйте стандартный синтаксис SELECT ... 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" has not been 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 create an instance of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for 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" cannot be loaded in-process on a 64-bit SQL Server.

Поставщик OLE DB "Microsoft.ACE.OLEDB.12.0" для связанного сервера "(null)" сообщил об ошибке.

Эта ошибка обычно указывает на проблемы с разрешениями между процессом SQL Server и файлом. Убедитесь, что учетная запись, с которой выполняется служба SQL Server, имеет разрешение на полный доступ к файлу. Мы не рекомендуем импортировать файлы с настольного компьютера.

Полный текст ошибки.

Msg 7399, Level 16, State 1, Line 3
The OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" reported an error. The provider did not give any information about 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 data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".