Может ли пакет служб SSIS вызываться с использованием xp_cmdshell enlist в транзакции SQL Server? - PullRequest
1 голос
/ 20 октября 2011

У меня есть очень простой пакет служб SSIS с одной задачей потока данных (из источника OLE DB в плоский файл).

Control Flow

Data Flow

Для свойства TransactionOption установлено значение Required, и я попытался установить для параметра IsolationLevel значение ReadCommitted, ReadUncommitted и Serializable.

Пакет экспортирует все строки из таблицы [TestTable] в плоский файл.

У меня есть следующий сценарий SQL (который я сейчас запускаю в Management Studio):

BEGIN TRANSACTION

DELETE FROM [dbo].[TestTable]

DECLARE @SsisString VARCHAR(8000)
DECLARE @PackageName VARCHAR(200)
DECLARE @ServerName VARCHAR(100)
DECLARE @ReturnCode INT

SET @PackageName = 'TransactionalTestPackage'
SET @ServerName = 'SERVERNAME'
SET @SsisString = 'dtexec /sq ' + @PackageName + ' /ser ' + @ServerName + ' '

EXEC @ReturnCode = xp_cmdshell @SsisString

SELECT @ReturnCode

--COMMIT TRANSACTION
ROLLBACK TRANSACTION

Обратите внимание, что я удаляю все строки из таблицы перед запуском пакета, поэтому теоретически пакет должен экспортировать нулевые строки в файл, но в действительности происходит зависание пакета (я думаю, что из-за незафиксированного удалить на TestTable). Вопрос заключается в следующем: действительно ли вызываемый таким образом пакет служб SSIS подключается к транзакции, запущенной в верхней части блока SQL, и если нет, то может ли это быть?

1 Ответ

0 голосов
/ 20 октября 2011

Действия в xp_cmdshell будут выполняться вне транзакции, не имеет значения, SSIS или другой запрос. Вы также можете легко заменить @ssisstring на 'sqlcmd -S myserver -d mydatabase -Q "SELECT TOP 1 FROM dbo.TestTable"

Если вам нужны транзакции, делайте это в SSIS. Поместите оператор DELETE в качестве задачи «Выполнение SQL». Подключите это к вашей задаче потока данных. На уровне пакета (щелкните правой кнопкой мыши на фоне потока управления и выберите свойства) измените уровень транзакции пакета с Поддерживается на Требуется. Это начнет транзакцию. Все содержащиеся в нем элементы будут включены в родительскую транзакцию, если вы явно не откажетесь от транзакции, изменив уровень транзакции по умолчанию с Поддерживается на Не поддерживается.

...