Выполнение 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
Шаги следующие:
Создать пакет с 3 пользовательскими переменными
packageId[INT]
,connectionString[string]
,sourcePath[string]
packageId
какой-то столбецconnectionString
использовать в поисках, источник назначения - определить в выраженииsourcePath
являетсяCSV
файл
Создать процедуру, которая вставляет в таблицу переменную и запускает задание
пример выполнения:(Затронут 1 ряд)
Задание "Пакет" успешно запущено.Создать работу
Мой запрос:
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