Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 перенос большого кол-ва информации на прилинкованный сервер  [new]
Максим78
Member

Откуда:
Сообщений: 8
Здравствуйте, помогите разобраться с проблемой:
есть mssql сервер "local" и база base1
есть удаленный прилинкованный mysql "remote" сервер и база на нем base2
периодически (с помощью job) нужно выборки из mssql базы base1 заносить в mysql базу base2

В связи с этим несколько вопросов

1. на base2 таблицы должны содержать только последние данные.
Для этого нужно каждый раз truncate table table2
Но команда
select * from openquery(REMOTE,'truncate table table2') не работает скорее всего потому что я не знаю как правильно эту команду написать ) Как очистить таблицу на прилинкованном сервере?

Поэтому приходится делать
delete from openquery(REMOTE,'select * from table2' where id>0) where id>0
где id автоинкримент в таблице
а потом уже insert
Строк довольно много и я могу в клиенте наблюдать как при удалении количество строк в таблице плавно сокращается. Очень плавно и долго. Можно ли как то ускорить процесс?
Что бы таблица на удаленном linked сервере или мгновенно очищалась или дропалась и создавалась новая с тем же именем и данные писались бы уже в новую. Если можно подскажите как это все сделать через openquery .

2. Теперь по поводу процесса собственно переноса данных на linked сервер. Выборка по базе mssql имеет формат 1 поле "ширина" и десятки тысяч срок "высота". Фактически одномерный массив с боольшим количеством элементов.
Данные вставляются конструкцией

delete from openquery(REMOTE,'select * from table2') where id>0
insert into openquery(REMOTE,'select * from table2')
SELECT field1 from table1 -- здесь десятки тысяч строк

Этот запрос у меня может часами выполняться, как я понимаю из за того что каждую строку он отдельно вгоняет. Я хочу узнать как перевести полученный одномерный массив в строковую переменную с разделитлем и потом как большое содержимое но содержимое 1 строки перенести на linked сервер

попробую нарисовать
вот как выглядит выборка щас

data 1
data 2
data 3
...
data n

а я хочу узнать как средствами sql перевести ее в вид
data 1, data 2, data 3,...,data n
а потом одной строкой перенести на удаленный сервер.

Спасибо
21 авг 09, 16:43    [7568140]     Ответить | Цитировать Сообщить модератору
 Re: перенос большого кол-ва информации на прилинкованный сервер  [new]
Glory
Member

Откуда:
Сообщений: 104760
Максим78


1. на base2 таблицы должны содержать только последние данные.
Для этого нужно каждый раз truncate table table2
Но команда
select * from openquery(REMOTE,'truncate table table2') не работает скорее всего потому что я не знаю как правильно эту команду написать ) Как очистить таблицу на прилинкованном сервере?

А в MySQL разве есть команда truncate table ?


Максим78

Данные вставляются конструкцией

delete from openquery(REMOTE,'select * from table2') where id>0
insert into openquery(REMOTE,'select * from table2')
SELECT field1 from table1 -- здесь десятки тысяч строк

Этот запрос у меня может часами выполняться, как я понимаю из за того что каждую строку он отдельно вгоняет. Я хочу узнать как перевести полученный одномерный массив в строковую переменную с разделитлем и потом как большое содержимое но содержимое 1 строки перенести на linked сервер


insert into openquery(REMOTE,'select * from table2 WHERE 1=0')
SELECT field1 from table1 -- здесь десятки тысяч строк
21 авг 09, 16:46    [7568157]     Ответить | Цитировать Сообщить модератору
 Re: перенос большого кол-ва информации на прилинкованный сервер  [new]
Максим78
Member

Откуда:
Сообщений: 8
Glory

insert into openquery(REMOTE,'select * from table2 WHERE 1=0')
SELECT field1 from table1 -- здесь десятки тысяч строк

Просто добавляет новые записи к старым, а мне нужно предварительно очистить таблицу а потом уже дописывать новые

Glory

А в MySQL разве есть команда truncate table ?


вообще если я напрямую подключаюсь к mysql серверу то truncate table table2 отлично работает. Вопрос как провернуть это на linked сервере через openquery или еще как то
21 авг 09, 17:20    [7568383]     Ответить | Цитировать Сообщить модератору
 Re: перенос большого кол-ва информации на прилинкованный сервер  [new]
Glory
Member

Откуда:
Сообщений: 104760
Максим78


Glory

А в MySQL разве есть команда truncate table ?


вообще если я напрямую подключаюсь к mysql серверу то truncate table table2 отлично работает. Вопрос как провернуть это на linked сервере через openquery или еще как то

А openquery вам ошибку возвращает или что ?
21 авг 09, 17:21    [7568396]     Ответить | Цитировать Сообщить модератору
 Re: перенос большого кол-ва информации на прилинкованный сервер  [new]
Glory
Member

Откуда:
Сообщений: 104760
Максим78
Glory

insert into openquery(REMOTE,'select * from table2 WHERE 1=0')
SELECT field1 from table1 -- здесь десятки тысяч строк

Просто добавляет новые записи к старым, а мне нужно предварительно очистить таблицу а потом уже дописывать новые

Вы читайте внимательно ответ. Очистка тут непричем
21 авг 09, 17:22    [7568401]     Ответить | Цитировать Сообщить модератору
 Re: перенос большого кол-ва информации на прилинкованный сервер  [new]
Максим78
Member

Откуда:
Сообщений: 8
Glory
Максим78
Glory

insert into openquery(REMOTE,'select * from table2 WHERE 1=0')
SELECT field1 from table1 -- здесь десятки тысяч строк

Просто добавляет новые записи к старым, а мне нужно предварительно очистить таблицу а потом уже дописывать новые

Вы читайте внимательно ответ. Очистка тут непричем
ваш вариант просто добавляет новые строки к уже существующим
было 30 000 строк после выполнения запроса стало 60 000 к старым 30 000 добавились новые 30 000. А нужно только 30 000 новых

Запрос
select * from openquery(REMOTE,'truncate table table2')
Glory

А openquery вам ошибку возвращает или что ?


Cannot process the object "truncate table table2". The OLE DB provider "MSDASQL" for linked server "REMOE" indicates that either the object has no columns or the current user does not have permissions on that object.
21 авг 09, 17:36    [7568489]     Ответить | Цитировать Сообщить модератору
 Re: перенос большого кол-ва информации на прилинкованный сервер  [new]
Максим78
Member

Откуда:
Сообщений: 8
delete from openquery(REMOTE,'select * from table2') where id>0
insert into openquery(REMOTE,'select * from table2')
SELECT field1 from table1 -- здесь десятки тысяч строк

Этот запрос у меня может часами выполняться, как я понимаю из за того что каждую строку он отдельно вгоняет. Я хочу узнать как перевести полученный одномерный массив в строковую переменную с разделитлем и потом как большое содержимое но содержимое 1 строки перенести на linked сервер

попробую нарисовать
вот как выглядит выборка щас

data 1
data 2
data 3
...
data n

а я хочу узнать как средствами sql перевести ее в вид
data 1, data 2, data 3,...,data n
а потом одной строкой перенести на удаленный сервер.


подскажите это возможно средствами mssql?
21 авг 09, 17:54    [7568557]     Ответить | Цитировать Сообщить модератору
 Re: перенос большого кол-ва информации на прилинкованный сервер  [new]
Glory
Member

Откуда:
Сообщений: 104760
Максим78
ваш вариант просто добавляет новые строки к уже существующим
было 30 000 строк после выполнения запроса стало 60 000 к старым 30 000 добавились новые 30 000. А нужно только 30 000 новых

Мой вариант и касался только части добавления. И вовсе не касался части удаления
21 авг 09, 19:55    [7568889]     Ответить | Цитировать Сообщить модератору
 Re: перенос большого кол-ва информации на прилинкованный сервер  [new]
Andret
Member

Откуда: Киев
Сообщений: 84
Кстати, у
EXECUTE
есть вполне подходящая для вас конструкция:
 exec (@sql) at LinkedServer 
И выполняйте там delete, truncate, или любой другой произвольный SQL код на удалённом сервере. Лишь бы прав хватило :-) Вот только за редакцию не скажу, в 2008 есть, в 2005 не знаю, а в 2000 не работает. Естественно, прилинкованный сервер может быть любой редакции.
И ещё совет, - лучше затягивать данные, чем выталкивать.
24 авг 09, 22:57    [7575126]     Ответить | Цитировать Сообщить модератору
 Re: перенос большого кол-ва информации на прилинкованный сервер  [new]
petsa
Member

Откуда:
Сообщений: 1708
В 2005- м работает.
25 авг 09, 08:59    [7575528]     Ответить | Цитировать Сообщить модератору
 Re: перенос большого кол-ва информации на прилинкованный сервер  [new]
Максим78
Member

Откуда:
Сообщений: 8
Andret,petsa Большое вам спасибо, заработало, но только после прочтения https://www.sql.ru/forum/actualthread.aspx?tid=421578#4056176 за что спасибо Glory )


теперь осталось решить проблему как выдачу вида

data 1
data 2
data 3
...
data n

заменить на 1 сроку data 1, data 2, data 3,...,data n

средствами SQL
26 авг 09, 12:13    [7581130]     Ответить | Цитировать Сообщить модератору
 Re: перенос большого кол-ва информации на прилинкованный сервер  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
PIVOT ?
-------------------------------------
Jedem Das Seine
26 авг 09, 12:44    [7581390]     Ответить | Цитировать Сообщить модератору
 Re: перенос большого кол-ва информации на прилинкованный сервер  [new]
petsa
Member

Откуда:
Сообщений: 1708
Ну может как-то так
SELECT RTRIM (data1 + ',' + Data2 + ',' + data3) AS STRING FROM dbo.Table;
Если по простому.
26 авг 09, 13:24    [7581706]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить