Передача переменной через DTEXEC с помощью xp_cmdshell (SQL Server 2008)

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

Имя переменной в моем пакете служб SSIS - & quot; ExcelSource & quot; и он должен представлять полный путь. Я хотел бы в конечном итоге установить это динамически, потому что имя файла содержит дату.

Что такое код T-SQL для запуска этого? Вот что у меня так далеко:

DECLARE @ssisstr VARCHAR(8000)
, @packagename VARCHAR(200)
, @servername VARCHAR(100)

DECLARE @params VARCHAR(8000)
--my package name
SET @packagename = 'MyPackage'
--my server name
SET @servername = 'MYCOMPUTER\MYSERVER'

SET @params = '/set \package.variables[ExcelSource].Value;"\"Y:\excelFile\Test File - June 11 2012.xlsx\""'

SET @ssisstr = 'dtexec /sq ' + @packagename + ' /ser ' + @servername + ' '
SET @ssisstr = @ssisstr + @params

DECLARE @returncode INT
EXEC @returncode = xp_cmdshell @ssisstr
SELECT @returncode

Ответы на вопрос(1)

Решение Вопроса

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

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

Package, know thyself

Этот подход является моим предпочтительным методом. Вы предоставляете интеллект для своей посылки, чтобы решить проблему. Какyou знаете, что такое правильный файл Excel? Вы утверждаете, что в нем есть дата, так откуда вы знаете, что это за дата?

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

Это единственный файл в папке? Затем используйте перечислитель ForEach типа file для идентификации всех файлов .xlsx. Этот вопрос исамый отличный ответ ;) опишите, как использовать SSIS для импорта самых последних CSV. Это будет тривиальное изменение, чтобы найти самый последний файл Excelstring fileMask = "*.xlsx";

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

Tell me what you want

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

  • SQL Server table
  • XML file
  • Environment variable
  • Registry value
  • Parent Package

Последние 3, на мой взгляд, являются особыми случаями использования и не особенно удобны для вашей проблемы, но для полноты я перечислил их. Независимо от того, какой вариант конфигурации вы используете, достаточно просто щелкнуть SSIS, «Конфигурация пакета», проверить кнопку включения конфигурации и использовать мастер для настройки типа вашей конфигурации.

Второй вариант использования внешней конфигурации состоит в том, чтобы делать то, что вы делаете, предоставляя параметры командной строки для управления поведением пакета (никаких изменений пакета не требуется). Вместо этого вы торгуете в xp_commandshell для некоторого пользовательского PowerShell. Я думаю, что PS был только вариантом 2008+, но вы могли бы написать довольно простой скрипт для импорта объектной модели служб SSIS, создания экземпляра приложения, открытия существующего пакета, применения параметров командной строки и запуска приложения. Я мог бы, вероятно, сделать что-то вместе, основываясь на битах $ app и $ package изответь здесь

Edits

1) Причина, по которой вы видите & quot; вариант 12.0, недействительна & quot; происходит из-за того, что xp_cmdshell является жадным и с энтузиазмом разбирает пробелы в параметрах командной строки как отдельные аргументы. Если вы начнете поиск ограничений xp_cmdshell, вы получите множество совпадений, когда пробелы в аргументах вызывают проблемы.

2) Насколько я понимаю, задания агента SQL являются статичными. Было бы замечательно иметь возможность настроить их так, чтобы они вызывали любые шаги (sql, ssis и т. Д.) С переменными значениями параметров (вещи, оцениваемые во время выполнения), но, вообще говоря, я не нашел чистого способа сделать это.

3) Если вы не намерены менять пакет, чтобы определить, что является "правильным" файл, с использованием конфигураций или развертывания вашего собственного метода вызова (PS - это тип шага задания в SQL Agent), вы можете попробовать низкотехнологичное решение с использованием существующей логики для построения вызова dtexec, но иметь все это в .bat файл. Затем xp_cmdshell вызывает командный файл, который не должен иметь проблем с обработкой пространства в имени аргумента.

Ваш ответ на вопрос