Выполнение dtsx из хранимой процедуры

У меня проблема с выполнением пакета из хранимой процедуры. Когда работа заканчивается, я получаю сообщение об ошибке:

Microsoft (R) SQL Server Execute Package Utility Версия 11.0.2100.60 для 64-разрядных продуктов. Copyright (C) Microsoft Corporation. Все права защищены. NULL запущен: 09:47:51 Ошибка: 2014-06-11 09:47:51.34 Код: 0xC0011007 Источник: {4B0EFACA-9BE8-4E0B-AEF7-A1453AF75271}
Описание: невозможно загрузить пакет как XML, так как пакет не имеет допустимого формата XML. Будет опубликована конкретная ошибка парсера XML. Ошибка завершения: 2014-06-11 09:47:51.34 Код: 0xC0011002
Источник: {4B0EFACA-9BE8-4E0B-AEF7-A1453AF75271} Описание: Не удалось открыть файл пакета "\server\path\Package.dtsx" из-за ошибки 0x80070005 "Доступ запрещен". Это происходит при загрузке пакета, и файл не может быть открыт или правильно загружен в документ XML. Это может быть результатом указания неправильного имени файла при вызове LoadPackage, или указанный XML-файл имеет неправильный формат. Ошибка завершения Не удалось загрузить пакет "\server\path\Package.dtsx" из-за ошибки 0xC0011002. Описание: Не удалось открыть файл пакета "\server\Package.dtsx" из-за ошибки 0x80070005 "Доступ запрещен". Это происходит при загрузке пакета, и файл не может быть открыт или правильно загружен в документ XML. Это может быть результатом указания неверного имени файла при вызове LoadPackage, или указанный XML-файл имеет неправильный формат. Источник: {4B0EFACA-9BE8-4E0B-AEF7-A1453AF75271} Начато: 09:47:51 Завершено: 09:47:51 Прошло: 0,047 секунд NULL

Шаги следующие:

  1. Создать пакет с 3 пользовательскими переменными packageId[INT], connectionString[string], sourcePath[string]

    • packageId какой-то столбец
    • connectionString использовать в поисках, источник назначения - определить в выражении
    • sourcePath является CSV файл
  2. Создать процедуру, которая вставляет в таблицу переменную и запускает задание
    пример выполнения:

    (Затронут 1 ряд)
    Задание "Пакет" успешно запущено.

  3. Создать работу

Мой запрос:

DECLARE @ConnectionString VARCHAR(1000)
DECLARE @PackageId INT
DECLARE @DataName NVARCHAR(2000)
DECLARE @DtsxName NVARCHAR(200)
DECLARE @PackagePath NVARCHAR(200)
DECLARE @DataPath NVARCHAR(200)
SELECT @DtsxName = 'TemporaryPackage'
SELECT @PackagePath = '\\server\path\'
SELECT @DataPath = '\\server\path\Data\'

IF EXISTS (SELECT * FROM PackageImport p WHERE p.dtsxName = @DtsxName AND p.startImport IS NULL)
BEGIN
SELECT @ConnectionString = p.connectionString, @PackageId = p.packageId, @DataName = p.sourcePath
FROM PackageImport p WHERE p.dtsxName = @DtsxName AND p.startImport IS NULL
END

DECLARE @SQLQuery AS VARCHAR(2000)
SET @SQLQuery = 'DTExec.exe /FILE "\"' + @PackagePath + @DtsxName + '.dtsx\""'
 + ' /SET \Package.Variables[User::ConnectionString].Properties[Value];"\"'+ @ConnectionString + '\""'
 + ' /SET \Package.Variables[User::PackageId].Properties[Value];"\"'+ CAST(@PackageId as varchar(10)) + '\""'
 + ' /SET \Package.Variables[User::SourcePath].Properties[Value];"\"'+ @DataPath + @DataName + '\""'

UPDATE dbo.PackageImport 
SET [startImport]=GETDATE() 
WHERE [packageId]=@PackageId AND [dtsxName] = @DtsxName AND [startImport] IS NULL

-- import 
DECLARE @result INT
DECLARE @output TABLE( [ssisOutput] varchar(max) )
INSERT INTO @output

EXEC @result = master..xp_cmdshell @SQLQuery

INSERT INTO PackageHistory(packageId, history)
SELECT @PackageId, ssisOutput FROM @output o 
UPDATE dbo.PackageImport 
SET [stopImport]=GETDATE() 
WHERE [packageId]=@PackageId AND [dtsxName] = @DtsxName AND [stopImport] IS NULL
GO

Задание владельца - SQLSERVERAGENT, и у него есть разрешение на чтение / запись в \ server \ path

Кто-нибудь знает в чем проблема и может мне помочь?

3 ответа

Я нашел другое решение, лучшее для меня. В папке C:\Program Files\Microsoft SQL Server\110\DTS\Packages создайте папку для моих заданных пакетов и файлов данных и измените разрешение для группы Users на READ и находится работа.

Я нашел просто решение. Я изменяю переменную SELECT @PackagePath = '\server\path\' SELECT @DataPath = '\server\path\Data\'

в

SELECT @PackagePath = 'C:\' SELECT @DataPath = 'C:\'

Я знаю, что это не лучшее решение, но я пытаюсь изменить разрешение для sql_serveragent, но проблема все еще возникает.

Если этот пакет: \server\path\Package.dtsx, хранится на сервере, отличном от того, с которого вы выполняете его в агенте SQL, вы можете столкнуться с проблемой двойного прыжка. В любом случае, стоит попробовать прокси. Вот некоторая информация об этом: http://technet.microsoft.com/en-us/library/dd440761%28v=sql.100%29.aspx

Другие вопросы по тегам