Как предотвратить включение запроса Insert в Распределенную транзакцию?
-
09-06-2019 - |
Вопрос
У меня есть SQL-запрос Insert внутри сохраненной процедуры для вставки строк в связанный сервер таблица.
Поскольку сохраненный процесс вызывается внутри родительской транзакции, этот оператор Insert пытается использовать DTC для вставки строк на связанный сервер.
Я бы хотел избегать DTC воздержался от участия.
Есть ли какой-либо способ, которым я могу это сделать (например, подсказка), чтобы оператор Insert SQL игнорировал область действия транзакции?
Решение
Мое предложение заключается в том, что вы сохраняете все, что хотите вставить, в промежуточную таблицу, и после завершения процедуры запустите межсерверную вставку.Насколько мне известно, нет никакого способа игнорировать транзакцию, в которой вы участвуете, как только вы находитесь в процессе выполнения SProc.
Напротив, если вы используете пространство имен System.Transaction .NET 2.0, вы можете указать определенным операторам не участвовать ни в одной транзакции родительской области.Это потребовало бы, чтобы вы написали часть своей логики в коде, а не в хранимых процедурах, но сработало бы.
Вот такой соответствующая ссылка.
Удачи, Алан.
Другие советы
Попробуйте использовать openquery для вызова связанного запроса сервера / sp вместо прямого вызова У меня это сработало
поэтому вместо вставьте в ...выберите * из mylinkedserver.pubs.dbo.authors
например ,ОБЪЯВИТЬ переменную @TSQL (8000), переменную @VAR char(2) ВЫБРАТЬ @VAR = 'CA' SELECT @TSQL = 'ВЫБРАТЬ * ИЗ OPENQUERY(MyLinkedServer,"ВЫБРАТЬ * ИЗ pubs.dbo.authors, ГДЕ state = ""' + @VAR + """')'
ВСТАВИТЬ ВНУТРЬ .....EXEC (@TSQL)