Как получить доступ к источнику данных Excel из пакета служб SSIS, развернутого на 64-разрядном сервере? - PullRequest
7 голосов
/ 22 августа 2008

У меня есть пакет служб SSIS, который экспортирует данные в пару файлов Excel для передачи третьей стороне. Чтобы запустить это как запланированное задание на 64-битном сервере, я понимаю, что мне нужно установить шаг как тип CmdExec и вызвать 32-битную версию DTExec. Но мне кажется, что я не могу заставить команду передать строку подключения для файлов Excel.

Пока у меня есть это:

DTExec.exe /SQL \PackageName /SERVER OUR2005SQLSERVER /CONNECTION 
LETTER_Excel_File;\""Provider=Microsoft.Jet.OLEDB.4.0";"Data 
Source=""C:\Temp\BaseFiles\LETTER.xls";"Extended Properties=
""Excel 8.0;HDR=Yes"" /MAXCONCURRENT " -1 " /CHECKPOINTING OFF /REPORTING E

Это дает мне ошибку: Option "Properties=Excel 8.0;HDR=Yes" is not valid.

Я пробовал несколько вариантов с кавычками, но пока не смог сделать это правильно.

Кто-нибудь знает, как это исправить?

UPDATE:

Спасибо за вашу помощь, но я решил пока что использовать файлы CSV, так как они, похоже, работают только на 64-битной версии.

Ответы [ 5 ]

8 голосов
/ 24 июля 2011

Этот пошаговый пример предназначен для тех, кто может наткнуться на этот вопрос. В этом примере используется SSIS 2005 и сервер 64-разрядной версии SQL Server 2005 для запуска задания.

Ответ здесь сконцентрирован только на исправлении сообщения об ошибке, упомянутого в вопросе. В этом примере будут продемонстрированы шаги по воссозданию проблемы, а также причина проблемы, а также способы ее устранения.

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

Давайте продолжим с примером. Я также написал в блоге об этом ответе, который можно найти в по этой ссылке . Это тот же ответ.

Создание пакета служб SSIS ( Шаги по созданию пакета служб SSIS ). В этом примере используется BIDS 2005. В начале я назвал пакет в формате YYYYMMDD_hhmm, после чего SO означает «переполнение стека», затем идентификатор вопроса SO и, наконец, описание. Я не говорю, что вы должны назвать свою посылку вот так. Это для меня, чтобы легко отослать это позже. Обратите внимание, что у меня также есть источники данных под названием Adventure Works. Я буду использовать источник данных Adventure Works, который указывает на базу данных AdventureWorks, загруженную с по этой ссылке . В примере используется база данных SQL Server 2008 R2. Смотрите скриншот # 1 .

В базе данных AdventureWorks создайте хранимую процедуру с именем dbo.GetCurrency , используя приведенный ниже скрипт.

CREATE PROCEDURE [dbo].[GetCurrency]
AS
BEGIN
    SET NOCOUNT ON;
    SELECT 
    TOP 10      CurrencyCode
            ,   Name
            ,   ModifiedDate 
    FROM        Sales.Currency
    ORDER BY    CurrencyCode
END
GO

В разделе диспетчера подключений пакета щелкните правой кнопкой мыши и выберите Новое подключение из источника данных . В диалоговом окне Выбор источника данных выберите Adventure Works и нажмите OK. Теперь вы должны увидеть источник данных Adventure Works в разделе Менеджеры соединений .

В разделе «Диспетчеры соединений» снова щелкните правой кнопкой мыши, но на этот раз выберите Новое соединение… . Это для создания подключения к Excel. В диспетчере подключений SSIS выберите EXCEL . В диспетчере соединений Excel введите путь C: \ Temp \ Template.xls . Когда мы развернем его на сервере, мы изменим этот путь. Я выбрал версию Excel Microsoft Excel 97-2005 и решил оставить флажок В первой строке отмечены имена столбцов , чтобы при создании файла Excel создавались заголовки столбцов. Нажмите OK . Переименуйте соединение Excel в Excel , просто для простоты. Смотрите скриншоты # 2 - # 7 .

В пакете создайте следующую переменную. Смотрите скриншот # 8 .

  • SQLGetData : эта переменная имеет тип String. Это будет содержать оператор выполнения хранимой процедуры. В этом примере используется значение EXEC dbo.GetCurrency

Снимок экрана # 9 показывает выходные данные оператора выполнения хранимой процедуры EXEC dbo.GetCurrency

На вкладке Flow Control пакета поместите Data Flow task и назовите его «Экспорт в Excel». Смотрите скриншот # 10 .

Дважды щелкните по Задаче потока данных, чтобы переключиться на вкладку Поток данных.

на тНа вкладке «Поток данных» поместите OLE DB Source для подключения к данным SQL Server для извлечения данных из хранимой процедуры и назовите их как SQL. Дважды щелкните источник OLE DB, чтобы открыть редактор источников OLE DB. В разделе диспетчера подключений выберите Adventure Works в диспетчере соединений OLE DB, выберите команду SQL из переменной в режиме доступа к данным и выберите переменную User :: SQLGetData из раскрывающегося списка переменных. вниз. В разделе «Столбцы» убедитесь, что имена столбцов отображаются правильно. Нажмите кнопку ОК, чтобы закрыть редактор источников OLE DB. Смотрите скриншоты # 11 и # 12 .

На вкладке «Поток данных» поместите Excel Destination, чтобы вставить данные в файл Excel, и назовите его как Excel. Дважды щелкните пункт назначения Excel, чтобы открыть редактор мест назначения Excel. В разделе «Диспетчер соединений» выберите «Excel» в диспетчере соединений OLE DB и выберите «Таблица» или «Представление» в режиме доступа к данным. На данный момент у нас нет Excel, потому что при создании диспетчера соединений Excel мы просто указали путь, но никогда не создавали файл. Следовательно, в выпадающем названии листа Excel не будет никаких значений. Итак, нажмите кнопку New… (вторая New), чтобы создать новый лист Excel. В окне Создать таблицу BIDS автоматически предоставляет лист создания на основе источника входных данных. Вы можете изменить значения в соответствии с вашими предпочтениями. Я просто нажму OK, сохранив значение по умолчанию. Имя листа будет заполнено в раскрывающемся списке Имя листа Excel. Название листа берется из имени задачи, в данном случае это пункт назначения Excel, который мы назвали Excel. В разделе Mappings убедитесь, что имена столбцов сопоставлены правильно. Нажмите кнопку ОК, чтобы закрыть редактор мест назначения Excel. Смотрите скриншоты # 13 - # 16 .

После настройки задачи потока данных она должна выглядеть, как показано на скриншоте # 17 .

Выполните пакет, нажав F5. Снимки экрана # 18 - # 21 показывают успешное выполнение пакета как в Потоке управления, так и в Задаче потока данных. Кроме того, файл создается по пути C: \ Temp \ Template.xls , указанному в соединении Excel, и данные, отображаемые в выходных данных выполнения хранимой процедуры, совпадают с данными, записанными в файл.

Пакет, разработанный на моей локальной машине в пути к папке C: \ Learn \ Learn.VS2005 \ Learn.SSIS . Теперь нам нужно развернуть файлы на сервере, на котором размещена 64-разрядная версия SQL Server, чтобы запланировать задание. Таким образом, папка на сервере будет D: \ SSIS \ Practice . Скопируйте файл пакета ( .dtsx ) с локального компьютера и вставьте его в папку сервера. Кроме того, для правильной работы пакета нам необходимо иметь электронную таблицу Excel, представленную на сервере. В противном случае проверка не удастся. Обычно я создаю папку «Шаблон», которая будет содержать пустой файл электронной таблицы Excel, соответствующий выходным данным. Позже, во время выполнения, я изменю путь вывода Excel в другое место, используя конфигурацию пакета. Для этого примера я собираюсь сделать это простым. Итак, давайте скопируем файл Excel, сгенерированный на локальном компьютере, по пути C: \ Temp \ Template.xls в расположение сервера D: \ SSIS \ Practice . Я хочу, чтобы задание SQL генерировало файл с именем Currencies.xls. Итак, переименуйте файл Template.xls в Currencies.xls . Смотрите скриншот # 22 * ​​1131 *.

Чтобы показать, что я действительно собираюсь запустить задание на сервере в 64-разрядной версии SQL Server, я выполнил команду SELECT @@ version на SQL Server, и на снимке экрана # 23 показано результаты.

Мыбудет использовать Execute Package Utility (dtexec.exe) для генерации параметров командной строки. Войдите на сервер, который запустит пакет служб SSIS в задании SQL. Дважды щелкните файл пакета, чтобы открыть утилиту выполнения пакета. В разделе Общие выберите Файловая система из источника пакета. Нажмите на многоточие и перейдите к пути пакета. В разделе «Диспетчеры соединений» выберите «Excel» и измените путь в файле Excel с C: \ Temp \ Template.xls на D: \ SSIS \ Practice \ Currencies.xls. Изменения, сделанные в Утилите, сгенерируют командную строку соответственно в разделе Командная строка. В разделе «Командная строка» скопируйте командную строку, содержащую все необходимые параметры. Мы не собираемся выполнять пакет отсюда. Нажмите Закрыть . Смотрите скриншоты # 24 - # 26 .

Далее нам нужно настроить задание для запуска пакета служб SSIS. Мы не можем выбрать тип пакета служб интеграции с SQL Server, поскольку он будет работать под 64-разрядной версией и не найдет поставщика соединений Excel. Итак, мы должны запустить его как Operating System (CmdExec) тип задания. Перейдите в SQL Server Management Studio и подключитесь к компоненту Database Engine. Разверните агент SQL Server и щелкните правой кнопкой мыши узел Jobs. Выберите «Новая работа». В разделе «Общие» окна «Свойства задания» укажите имя задания как 01_SSIS_Export_To_Excel. Владелец будет пользователем, создающим задание. У меня есть категория с именем SSIS, поэтому я выберу ее, но категория по умолчанию - [Uncategorized (Local)] и предоставлю краткое описание. В разделе «Шаги» нажмите кнопку New… . Это принесет свойства Job Step. В разделе «Общие» свойств шага задания укажите имя шага в виде «Экспорт в Excel», выберите тип Operating system (CmdExec), оставьте учетную запись запуска от имени по умолчанию в качестве учетной записи службы агента SQL Server и введите следующую команду. Нажмите ОК. В окне «Новое задание» нажмите «ОК». Смотрите скриншоты # 27 - # 31 .

C:\Program Files (x86)\Microsoft SQL Server\90\DTS\Binn\DTExec.exe /FILE 
"D:\SSIS\Practice\20110723_1015_SO_21448_Excel_64_bit_Error.dtsx" 
/CONNECTION Excel;"\"Provider=Microsoft.Jet.OLEDB.4.0;Data 
Source=D:\SSIS\Practice\Currencies.xls;Extended Properties=""EXCEL 8.0;HDR=YES"";\""  
/MAXCONCURRENT " -1 " /CHECKPOINTING OFF  /REPORTING EWCDI

Новое задание должно появиться в узле Агент SQL Server -> Задания. Щелкните правой кнопкой мыши по вновь созданному заданию 01_SSIS_Export_To_Excel и выберите Начать задание на шаге ... , это начнет выполнение задания. Задание не выполнится, как ожидалось, потому что это контекст этой проблемы. Нажмите кнопку «Закрыть», чтобы закрыть диалоговое окно «Запуск заданий». Смотрите скриншоты # 32 и # 33 .

Давайте посмотрим, что случилось. Перейдите на узел агента и сервера SQL Server. Щелкните правой кнопкой мыши на задании 01_SSIS_Export_To_Excel и выберите Просмотр истории. Откроется окно просмотра файлов журнала. Вы можете заметить, что работа не удалась. Разверните узел рядом с красным крестом и щелкните по строке, значение шага которой равно 1. В нижней части вы увидите сообщение об ошибке Option “8.0;HDR=YES’;” is not valid. Нажмите кнопку Закрыть, чтобы закрыть окно средства просмотра файлов журнала. Смотрите скриншоты # 34 и # 35 .

Теперь гщелкните правой кнопкой мыши на задании и выберите «Свойства», чтобы открыть свойства задания. Вы также можете дважды щелкнуть по заданию, чтобы открыть окно свойств задания. Нажмите на Шаги в левой части. и нажмите Редактировать. Замените команду следующей командой и нажмите OK. Нажмите кнопку ОК в окне «Свойства задания», чтобы закрыть окно. Щелкните правой кнопкой мыши на задании 01_SSIS_Export_To_Excel и выберите «Начать задание на шаге…», это начнет выполнение задания. Задание не выполнится успешно. Нажмите кнопку «Закрыть», чтобы закрыть диалоговое окно «Запуск заданий». Давайте посмотрим на историю. Щелкните правой кнопкой мыши на задании 01_SSIS_Export_To_Excel и выберите Просмотр истории. Откроется окно просмотра файлов журнала. Вы можете заметить, что задание выполнено успешно во время второго запуска. Разверните узел рядом с зеленым крестиком и щелкните по строке со значением шага ID, равным 1. В нижней части вы увидите сообщение Опция Шаг успешно выполнен. Нажмите Закрыть, чтобы закрыть окно просмотра файлов журнала. Файл D: \ SSIS \ Practice \ Currencies.xls будет успешно заполнен данными. Если вы успешно выполнили задание несколько раз, данные будут добавлены в файл, и вы найдете больше данных. Как я упоминал ранее, это не правильный способ создания файлов. Этот пример был создан, чтобы продемонстрировать исправление этой проблемы. Смотрите скриншоты # 36 - # 38 .

Снимок экрана # 39 показывает различия между рабочим и нерабочим аргументами командной строки. Справа находится рабочая командная строка, а слева - неверная. Для исправления ошибки потребовались еще две двойные кавычки с escape-последовательностью обратной косой черты. Могут быть и другие способы исправить это, но эта опция, похоже, работает.

Таким образом, в примере продемонстрирован способ решения проблемы аргументов командной строки при доступе к источнику данных Excel из пакета служб SSIS, развернутого на 64-разрядном сервере.

Надеюсь, это кому-нибудь поможет.

Скриншоты:

# 1: Solution_Explorer

Solution_Explorer

# 2: New_Connection_Data_Source

New_Connection_Data_Source

# 3: Select_Data_Source

Select_Data_Source

# 4: New_Connection

New_Connection

# 5: Add_SSIS_Connection_Manager

Add_SSIS_Connection_Manager

# 6: Excel_Connection_Manager

Excel_Connection_Manager

# 7: Connection_Manager

Connection_Managers

# 8: Переменные

Variables

# 9: Stored_Procedure_Output

Stored_Procedure_Output

# 10: Control_Flow

enter image description here

# 11: OLE_DB_Source_Connections_Manager

OLE_DB_Source_Connections_Manager

# 12: OLE_DB_Source_Columns

OLE_DB_Source_Columns

# 13: Excel_Destination_Editor_New

Excel_Destination_Editor_New

# 14: Excel_Destination_Create_Table

Excel_Destination_Create_Table

# 15: Excel_Destination_Edito

Excel_Destination_Edito

# 16: Excel_Destination_Mappings

Excel_Destination_Mappings

# 17: Data_Flow

Data_Flow

# 18: Successful_Package_Execution_Control

Successful_Package_Execution_Control

# 19: Successful_Package_Execution_Data_Flow

Successful_Package_Execution_Data_Flow

# 20: C_Temp_File_Created

C_Temp_File_Created

# 21: Данные заполнены

Data_Populated

# 22: File_On_Server

File_On_Server

# 23: SQL_Server_Version

SQL_Server_Version

# 24: Execute_Package_Utility_General

Execute_Package_Utility_General

# 25: Execute_Package_Utility_Connection_Managers

Execute_Package_Utility_Connection_Managers

# 26: Execute_Package_Utility_Command_Line

Execute_Package_Utility_Command_Line

# 27: Job_New_Job

Job_New_Job

# 28: New_Job_General

New_Job_General

# 29: New_Job_Step

New_Job_Step

# 30: New_Job_Step_General

New_Job_Step_General

# 31: New_Job_Steps_Added

New_Job_Steps_Added

# 32: Job_Start_Job_at_Step

Job_Start_Job_at_Step

# 33: SQL_Job_Execution_Failure

SQL_Job_Execution_Failure

# 34: View_History

View_History

# 35: SQL_Job_Error_Message

SQL_Job_Error_Message

# 36: SQL_Job_Execution_Success

SQL_Job_Execution_Success

# 37: SQL_Job_Success_Message

SQL_Job_Success_Message

# 38: Excel_File_Generated

Excel_File_Generated

# 39: Сравнение команд

39_Command_Comparison

4 голосов
/ 18 декабря 2008

Вы можете использовать подключение к Excel в 64-битной среде. Перейдите в свойства конфигурации пакета.

Отладка -> Параметры отладки -> Run64BtRuntime -> изменить на False Кроме того, если вы используете агент SQL, перейдите в свойства шага задания и затем проверьте 32-разрядную среду выполнения.

примечание: это относится только к отладке в Visual Studio ...

2 голосов
/ 21 сентября 2008

64-битный поставщик Jet OLEDB отсутствует, поэтому вы не можете получить доступ к файлам Excel из 64-битной SSIS.

Однако вы можете использовать 32-битный SSIS даже на 64-битном сервере. Он уже установлен, когда вы установили 64-битную версию, и все, что вам нужно сделать, это запустить 32-битный DTEXEC.EXE - тот, который установлен Program Files (x86)\Microsoft Sql Server\90\Dts\Binn (заменить 90 на 100 если вы используете SSIS 2008).

2 голосов
/ 22 августа 2008

Если это не является бизнес-требованием, я предлагаю вам переместить строку подключения из командной строки в пакет и использовать конфигурацию пакета для определения пути к файлу Excel (чтобы не вводить его в жестком коде). Это облегчит обслуживание.

  1. Определить переменную @ExcelPath.
  2. Используйте свойство подключения Выражение для создания строки подключения - пример: "Data Source=" + @[User::FilePath] + ";Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=dBASE IV;"
  3. Присвойте значение @ ExcelPath в конфигурации пакета.

Присмотритесь к строке подключения выше. Это взято из рабочего пакета. Я не уверен в этом, но, возможно, вам вообще не нужны никакие кавычки (те, что приведены выше, существуют только потому, что они нужны редактору выражений).


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

0 голосов
/ 22 апреля 2009

Я вроде сделал то, что сделал доктор Зим, но я скопировал файл DTExec C:\Program Files (x86)\Microsoft SQL Server\90\DTS\Binn\DTExec.exe в C:\Program Files\Microsoft SQL Server\90\DTS\Binn\ папку, но назвал 32-битный файл в DTExec32.exe

тогда я смог запустить скрипт SSIS через сохраненный процесс:

set @params = '/set \package.variables[ImportFilename].Value;"\"' + @FileName + '\"" '
set @cmd =  'dtexec32 /SQ "' + @packagename + ' ' + @params + '"'
--DECLARE @returncode int
exec master..xp_cmdshell @cmd
--exec @returncode = master..xp_cmdshell @cmd
--select @returncode
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...