Этот пошаговый пример предназначен для тех, кто может наткнуться на этот вопрос. В этом примере используется 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
# 2: New_Connection_Data_Source
# 3: Select_Data_Source
# 4: New_Connection
# 5: Add_SSIS_Connection_Manager
# 6: Excel_Connection_Manager
# 7: Connection_Manager
# 8: Переменные
# 9: Stored_Procedure_Output
# 10: Control_Flow
# 11: OLE_DB_Source_Connections_Manager
# 12: OLE_DB_Source_Columns
# 13: Excel_Destination_Editor_New
# 14: Excel_Destination_Create_Table
# 15: Excel_Destination_Edito
# 16: Excel_Destination_Mappings
# 17: Data_Flow
# 18: Successful_Package_Execution_Control
# 19: Successful_Package_Execution_Data_Flow
# 20: C_Temp_File_Created
# 21: Данные заполнены
# 22: File_On_Server
# 23: SQL_Server_Version
# 24: Execute_Package_Utility_General
# 25: Execute_Package_Utility_Connection_Managers
# 26: Execute_Package_Utility_Command_Line
# 27: Job_New_Job
# 28: New_Job_General
# 29: New_Job_Step
# 30: New_Job_Step_General
# 31: New_Job_Steps_Added
# 32: Job_Start_Job_at_Step
# 33: SQL_Job_Execution_Failure
# 34: View_History
# 35: SQL_Job_Error_Message
# 36: SQL_Job_Execution_Success
# 37: SQL_Job_Success_Message
# 38: Excel_File_Generated
# 39: Сравнение команд