Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вставка данных из связного сервера / 25 сообщений из 29, страница 1 из 2
25.02.2018, 16:32
    #39606981
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка данных из связного сервера
Существует задача в которой необходимо в заданную таблицу вставлять данные из связного сервера.
Для унификации решено выполнять процедуру вставки на исходном сервере, запрос должен выглядеть примерно так

Код: sql
1.
2.
INSERT INTO dbo.SourceTable
EXEC [linkedServer].[dbName].Scheme.[StoreProcedure]


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

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

Код: sql
1.
2.
INSERT INTO dbo.SourceTable
SELECT * from [linkedServer].[dbName].Scheme.Table



работает без проблем, а с использование хранимки вываливается ошибка Distributed transaction.
Можете пояснить почему так происходит. И так избавиться от ошибки.
...
Рейтинг: 0 / 0
25.02.2018, 17:31
    #39606996
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка данных из связного сервера
Exec () at server
...
Рейтинг: 0 / 0
25.02.2018, 17:35
    #39606998
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка данных из связного сервера
Критик,

Мне это не подходит, я планирую заворачивать вызов хранимки в EXEC(''), и динамически задавать имя связного сервера, так как заранее не знаю с какого необходимо будет получить данные, насколько мне известно AT SERVER нельзя завернуть в динамический SQL
...
Рейтинг: 0 / 0
25.02.2018, 17:56
    #39607004
Дедушка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка данных из связного сервера
lex452работает без проблем, а с использование хранимки вываливается ошибка Distributed transaction.1. и что это за ошибка?
2. просто вызов процедуры без вставки в табл работает?
...
Рейтинг: 0 / 0
25.02.2018, 18:39
    #39607008
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка данных из связного сервера
Дедушка,

Да, просто вызов работет. А на счет ошибки, если бы я знал что она означает, то на форум бы ни писал. Как я понял, что запрещены распределенные транзакции. Вот мне не понятно, почему процедуру можно выполнить, но нельзя вставить данные в таблицу
...
Рейтинг: 0 / 0
25.02.2018, 19:58
    #39607020
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка данных из связного сервера
lex452Вот мне не понятно, почему процедуру можно выполнить, но нельзя вставить данные в таблицуПотому что insert всегда выполняется в транзакции.
Настраивайте DTC.
...
Рейтинг: 0 / 0
25.02.2018, 21:52
    #39607036
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка данных из связного сервера
invmНастраивайте DTC.
Не всегда есть такая возможность.
Может есть другие варианты решения задачи.

Необходимо реализовать вставку данных из связных серверов в одну общую целевую таблицу (TargetTable).
Сейчас реализовано так, что создается подключение к связному и данные оттуда заносятся в TargetTable, то есть на момент выполнения происходит вставка данных на связный сервер, но это как показали сравнительные тесты медленный способ.
Вот и хочется переделать так чтобы процедура выполнялась на сервере с TargetTable.
Но есть ряд ограничений:
Источники с данными имеют разный формат, то есть для каждого нужно писать индивидуальный запрос на выборку,
поэтому и хочется завернуть его в хранимую процедуру на сервере источнике и обращаться к ним через EXEC('') c подменой имени сервера
...
Рейтинг: 0 / 0
25.02.2018, 22:04
    #39607042
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка данных из связного сервера
lex452с использование хранимки вываливается ошибка Distributed transaction.
Можете пояснить почему так происходит. И так избавиться от ошибки.Установите для linked server параметр remote proc transaction promotion в FALSE
...
Рейтинг: 0 / 0
25.02.2018, 22:27
    #39607046
Дедушка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка данных из связного сервера
lex452А на счет ошибки, если бы я знал что она означает, то на форум бы ни писал.дело не в знании, логично скопипастить сюда полный текст ошибки, а не пересказывать урезанную версию, чтобы все играли в угадайку.
lex452Необходимо реализовать вставку данных из связных серверов в одну общую целевую таблицу (TargetTable).
Источники с данными имеют разный формати почему не используете специально предназначенный для этого инструмент - SSIS?
...
Рейтинг: 0 / 0
25.02.2018, 22:56
    #39607050
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка данных из связного сервера
Дедушка,

Ssis я в принципе тоже планировал попробовать подцепить, но их сложнее поддерживать и менять, чем хранимые процедуры
...
Рейтинг: 0 / 0
26.02.2018, 12:40
    #39607258
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка данных из связного сервера
lex452Существует задача в которой необходимо в заданную таблицу вставлять данные из связного сервера.
Для унификации решено выполнять процедуру вставки на исходном сервере, запрос должен выглядеть примерно так

Код: sql
1.
2.
INSERT INTO dbo.SourceTable
EXEC [linkedServer].[dbName].Scheme.[StoreProcedure]


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

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

Код: sql
1.
2.
INSERT INTO dbo.SourceTable
SELECT * from [linkedServer].[dbName].Scheme.Table



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

а так?
Код: sql
1.
2.
3.
4.
declare @sourceTable table ...

INSERT INTO @sourceTable
EXEC [linkedServer].[dbName].Scheme.[StoreProcedure]
...
Рейтинг: 0 / 0
26.02.2018, 12:43
    #39607259
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка данных из связного сервера
lex452,

Обход DTC через
Код: sql
1.
INSERT INTO ... SELECT * FROM OPENQUERY(...'EXEC')
...
Рейтинг: 0 / 0
26.02.2018, 12:58
    #39607267
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка данных из связного сервера
TaPaKlex452,

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


Openquery не поддерживает параметризация, насколько я помню
...
Рейтинг: 0 / 0
26.02.2018, 13:01
    #39607270
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка данных из связного сервера
Ролг Хупин,

А чем Ваше предложение отличается от того что я написал в самом первом вопросе?
...
Рейтинг: 0 / 0
26.02.2018, 13:03
    #39607272
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка данных из связного сервера
lex452TaPaKlex452,

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


Openquery не поддерживает параметризация, насколько я помню
что?
...
Рейтинг: 0 / 0
26.02.2018, 18:57
    #39607491
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка данных из связного сервера
invmlex452Вот мне не понятно, почему процедуру можно выполнить, но нельзя вставить данные в таблицуПотому что insert всегда выполняется в транзакции.
Настраивайте DTC.

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

Настройте приложение так, чтобы процедура на удаленном сервере складывала данные в локальную для этого сервера таблицу, а затем забирайте данные при помощи Insert.
...
Рейтинг: 0 / 0
26.02.2018, 19:04
    #39607497
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка данных из связного сервера
Владислав Колосов,

а при чём тут фаервол??
...
Рейтинг: 0 / 0
26.02.2018, 19:37
    #39607510
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка данных из связного сервера
alexeyvglex452с использование хранимки вываливается ошибка Distributed transaction.
Можете пояснить почему так происходит. И так избавиться от ошибки.Установите для linked server параметр remote proc transaction promotion в FALSE
Вот это помогло
...
Рейтинг: 0 / 0
26.02.2018, 19:39
    #39607511
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка данных из связного сервера
TaPaKlex452пропущено...

Openquery не поддерживает параметризация, насколько я помню
что?нельзя переменной задать имя сервера подключения
...
Рейтинг: 0 / 0
26.02.2018, 19:46
    #39607514
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка данных из связного сервера
lex452TaPaKпропущено...

что?нельзя переменной задать имя сервера подключения
dynamic sql? всё обернуть в sp_executesql
...
Рейтинг: 0 / 0
26.02.2018, 20:54
    #39607534
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка данных из связного сервера
TaPaKlex452,

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


Спасибо, забрал.
...
Рейтинг: 0 / 0
27.02.2018, 11:33
    #39607735
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка данных из связного сервера
TaPaKВладислав Колосов,

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

Для работы DTC, который использует распределенная транзакция, нужны TCP порты, межсерверный файрвол/прокси их может закрыть.
...
Рейтинг: 0 / 0
27.02.2018, 11:58
    #39607754
Cristiano_Rivaldo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка данных из связного сервера
lex452,

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



Запросы с OPENQUERY сложно параметризировать, а с синонимами ты можешь существенно сократить объем траффика по сети так как работает фильтр на данные.
...
Рейтинг: 0 / 0
27.02.2018, 12:01
    #39607756
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка данных из связного сервера
Cristiano_Rivaldolex452,

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



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



авторДля работы DTC, который использует распределенная транзакция, нужны TCP порты, межсерверный файрвол/прокси их может закрыть.
тут вы немного правы, ибо ТС не привёл полный текст ошибки, но ввиду того что он даже не настраивал DTC для сервера, то это очень сильно мимо
...
Рейтинг: 0 / 0
27.02.2018, 12:04
    #39607759
Cristiano_Rivaldo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка данных из связного сервера
TaPaK,

Хотел сказать что в большинстве случаев синонимы удобннее , чем OPENQUERY. Можно указывать фильтры в блоке where без дрочева в динамическом sql - е.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вставка данных из связного сервера / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]