Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Вставка данных из связного сервера  [new]
lex452
Member

Откуда:
Сообщений: 548
Существует задача в которой необходимо в заданную таблицу вставлять данные из связного сервера.
Для унификации решено выполнять процедуру вставки на исходном сервере, запрос должен выглядеть примерно так

INSERT INTO dbo.SourceTable
EXEC [linkedServer].[dbName].Scheme.[StoreProcedure]

где хранимка StoreProcedure возвращает 1 набор данных

Запрос в формате

INSERT INTO dbo.SourceTable
SELECT * from [linkedServer].[dbName].Scheme.Table


работает без проблем, а с использование хранимки вываливается ошибка Distributed transaction.
Можете пояснить почему так происходит. И так избавиться от ошибки.
25 фев 18, 16:32    [21216884]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из связного сервера  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33489
Блог
Exec () at server
25 фев 18, 17:31    [21216998]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из связного сервера  [new]
lex452
Member

Откуда:
Сообщений: 548
Критик,

Мне это не подходит, я планирую заворачивать вызов хранимки в EXEC(''), и динамически задавать имя связного сервера, так как заранее не знаю с какого необходимо будет получить данные, насколько мне известно AT SERVER нельзя завернуть в динамический SQL
25 фев 18, 17:35    [21217009]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из связного сервера  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
lex452
работает без проблем, а с использование хранимки вываливается ошибка Distributed transaction.
1. и что это за ошибка?
2. просто вызов процедуры без вставки в табл работает?
25 фев 18, 17:56    [21217057]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из связного сервера  [new]
lex452
Member

Откуда:
Сообщений: 548
Дедушка,

Да, просто вызов работет. А на счет ошибки, если бы я знал что она означает, то на форум бы ни писал. Как я понял, что запрещены распределенные транзакции. Вот мне не понятно, почему процедуру можно выполнить, но нельзя вставить данные в таблицу
25 фев 18, 18:39    [21217126]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из связного сервера  [new]
invm
Member

Откуда: Москва
Сообщений: 9263
lex452
Вот мне не понятно, почему процедуру можно выполнить, но нельзя вставить данные в таблицу
Потому что insert всегда выполняется в транзакции.
Настраивайте DTC.
25 фев 18, 19:58    [21217281]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из связного сервера  [new]
lex452
Member

Откуда:
Сообщений: 548
invm
Настраивайте DTC.

Не всегда есть такая возможность.
Может есть другие варианты решения задачи.

Необходимо реализовать вставку данных из связных серверов в одну общую целевую таблицу (TargetTable).
Сейчас реализовано так, что создается подключение к связному и данные оттуда заносятся в TargetTable, то есть на момент выполнения происходит вставка данных на связный сервер, но это как показали сравнительные тесты медленный способ.
Вот и хочется переделать так чтобы процедура выполнялась на сервере с TargetTable.
Но есть ряд ограничений:
Источники с данными имеют разный формат, то есть для каждого нужно писать индивидуальный запрос на выборку,
поэтому и хочется завернуть его в хранимую процедуру на сервере источнике и обращаться к ним через EXEC('') c подменой имени сервера
25 фев 18, 21:52    [21217466]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из связного сервера  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31326
lex452
с использование хранимки вываливается ошибка Distributed transaction.
Можете пояснить почему так происходит. И так избавиться от ошибки.
Установите для linked server параметр remote proc transaction promotion в FALSE
25 фев 18, 22:04    [21217487]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из связного сервера  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
lex452
А на счет ошибки, если бы я знал что она означает, то на форум бы ни писал.
дело не в знании, логично скопипастить сюда полный текст ошибки, а не пересказывать урезанную версию, чтобы все играли в угадайку.
lex452
Необходимо реализовать вставку данных из связных серверов в одну общую целевую таблицу (TargetTable).
Источники с данными имеют разный формат
и почему не используете специально предназначенный для этого инструмент - SSIS?
25 фев 18, 22:27    [21217524]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из связного сервера  [new]
lex452
Member

Откуда:
Сообщений: 548
Дедушка,

Ssis я в принципе тоже планировал попробовать подцепить, но их сложнее поддерживать и менять, чем хранимые процедуры
25 фев 18, 22:56    [21217567]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из связного сервера  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3653
lex452
Существует задача в которой необходимо в заданную таблицу вставлять данные из связного сервера.
Для унификации решено выполнять процедуру вставки на исходном сервере, запрос должен выглядеть примерно так

INSERT INTO dbo.SourceTable
EXEC [linkedServer].[dbName].Scheme.[StoreProcedure]

где хранимка StoreProcedure возвращает 1 набор данных

Запрос в формате

INSERT INTO dbo.SourceTable
SELECT * from [linkedServer].[dbName].Scheme.Table


работает без проблем, а с использование хранимки вываливается ошибка Distributed transaction.
Можете пояснить почему так происходит. И так избавиться от ошибки.


а так?
declare @sourceTable table ...

INSERT INTO @sourceTable
EXEC [linkedServer].[dbName].Scheme.[StoreProcedure]
26 фев 18, 12:40    [21218557]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из связного сервера  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
lex452,

Обход DTC через
INSERT INTO ... SELECT * FROM OPENQUERY(...'EXEC')
26 фев 18, 12:43    [21218562]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из связного сервера  [new]
lex452
Member

Откуда:
Сообщений: 548
TaPaK
lex452,

Обход DTC через
INSERT INTO ... SELECT * FROM OPENQUERY(...'EXEC')

Openquery не поддерживает параметризация, насколько я помню
26 фев 18, 12:58    [21218613]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из связного сервера  [new]
lex452
Member

Откуда:
Сообщений: 548
Ролг Хупин,

А чем Ваше предложение отличается от того что я написал в самом первом вопросе?
26 фев 18, 13:01    [21218620]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из связного сервера  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
lex452
TaPaK
lex452,

Обход DTC через
INSERT INTO ... SELECT * FROM OPENQUERY(...'EXEC')

Openquery не поддерживает параметризация, насколько я помню

что?
26 фев 18, 13:03    [21218629]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из связного сервера  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7641
invm
lex452
Вот мне не понятно, почему процедуру можно выполнить, но нельзя вставить данные в таблицу
Потому что insert всегда выполняется в транзакции.
Настраивайте DTC.


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

Настройте приложение так, чтобы процедура на удаленном сервере складывала данные в локальную для этого сервера таблицу, а затем забирайте данные при помощи Insert.
26 фев 18, 18:57    [21219941]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из связного сервера  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Владислав Колосов,

а при чём тут фаервол??
26 фев 18, 19:04    [21219973]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из связного сервера  [new]
lex452
Member

Откуда:
Сообщений: 548
alexeyvg
lex452
с использование хранимки вываливается ошибка Distributed transaction.
Можете пояснить почему так происходит. И так избавиться от ошибки.
Установите для linked server параметр remote proc transaction promotion в FALSE

Вот это помогло
26 фев 18, 19:37    [21220042]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из связного сервера  [new]
lex452
Member

Откуда:
Сообщений: 548
TaPaK
lex452
пропущено...

Openquery не поддерживает параметризация, насколько я помню

что?
нельзя переменной задать имя сервера подключения
26 фев 18, 19:39    [21220048]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из связного сервера  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
lex452
TaPaK
пропущено...

что?
нельзя переменной задать имя сервера подключения

dynamic sql? всё обернуть в sp_executesql
26 фев 18, 19:46    [21220064]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из связного сервера  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
TaPaK
lex452,

Обход DTC через
INSERT INTO ... SELECT * FROM OPENQUERY(...'EXEC')

Спасибо, забрал.
26 фев 18, 20:54    [21220205]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из связного сервера  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7641
TaPaK
Владислав Колосов,

а при чём тут фаервол??


Для работы DTC, который использует распределенная транзакция, нужны TCP порты, межсерверный файрвол/прокси их может закрыть.
27 фев 18, 11:33    [21221200]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из связного сервера  [new]
Cristiano_Rivaldo
Member

Откуда:
Сообщений: 323
lex452,

Попробуй объекты связанного сервера обернуть в синонимы.
CREATE SYNONYM FOR [linkedServer].[dbName].Scheme.[StoreProcedure]


Запросы с OPENQUERY сложно параметризировать, а с синонимами ты можешь существенно сократить объем траффика по сети так как работает фильтр на данные.
27 фев 18, 11:58    [21221293]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из связного сервера  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Cristiano_Rivaldo
lex452,

Попробуй объекты связанного сервера обернуть в синонимы.
CREATE SYNONYM FOR [linkedServer].[dbName].Scheme.[StoreProcedure]


Запросы с OPENQUERY сложно параметризировать, а с синонимами ты можешь существенно сократить объем траффика по сети так как работает фильтр на данные.

и снионим избавит от DTC? и какой филтр на данные



автор
Для работы DTC, который использует распределенная транзакция, нужны TCP порты, межсерверный файрвол/прокси их может закрыть.

тут вы немного правы, ибо ТС не привёл полный текст ошибки, но ввиду того что он даже не настраивал DTC для сервера, то это очень сильно мимо
27 фев 18, 12:01    [21221307]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из связного сервера  [new]
Cristiano_Rivaldo
Member

Откуда:
Сообщений: 323
TaPaK,

Хотел сказать что в большинстве случаев синонимы удобннее , чем OPENQUERY. Можно указывать фильтры в блоке where без дрочева в динамическом sql - е.
27 фев 18, 12:04    [21221319]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить