php + mssql SELECT с удаленного сервера (ip адрес) и последующее INTO в локальную таблицу

ELEKTpoHuK
Дата: 05.02.2013 10:14:09
Здравствуйте, прошу помощи. Мозг кипит поиск по инету результатов не дал.

Существует 3 сервера (один из них локальный) с одинаковой структурой таблицы и иногда повторяющимися по ключевому полю ID записями (если они повторяются то это одна и таже запись но на локальном сервере она появляется позднее и соответственно менее актуальная по статусу).
1 сервер
ID STATUS BODY DATE
1 2055 0000144
2 65539 0000145
3 133123 0000146

2 сервер
ID STATUS BODY DATE
4 259 0000244
5 261 0000245
6 7 0000246

3 сервер (локальный)
ID STATUS BODY DATE
1 133123 0000144
4 261 0000244
7 5 0000345
8 7 0000346

Мне необходимо вывести данные из всех таблиц без повторов по ID (приоритет удаленные сервера) между определенными датами с дополнительным фильтром по статусу (статус записан в десятичной системе исчисления а алгоритм расшифровки из 16-ричной)

Работающий но долгий механизм:
Я в цикле (сначала удаленные серверы в конце локальный) делаю SELECT с интервалом по дате затем перебираю каждую строчку таблицы и средствами php конвертирую статус из 10 -> 16 и получаю алгоритмом строчку для записи в финальную таблицу
и записываю INSERT в результирующую таблицу с уникальным полем ID (таким образом записи с одинаковым ID из последней локальной таблицы не вставляются и я получаю то, что мне нужно

после всего получается 1 табличка CLEAR на локальном сервере к которой я применяю фильтр по статусам по полю STATUS_N и вывожу
ID STATUS_N STATUS BODY DATE
1 7 2055 0000144
2 3 65539 0000145
3 3 133123 0000146
4 3 259 0000244
5 5 261 0000245
6 7 7 0000246
7 5 5 0000345
8 7 7 0000346

Все бы ничего, но в рельности полей порядка 15 и они заполнены данными, строк в финальной таблице может быть от 10 до 10 000
следовательно делая примерно 2000 раз INSERT сервер замирает секунд на 20 что не очень то здорово


Собственные мысли по этому поводу.

Сделать Select всех таблиц с удаленного сервера INTO таблица на локальном но я не понимаю как реализовать
дальше добавить еще одно поле с чистым статусом и перебирая таблицу сделать UPDATE этого поля,

SELECT *
INTO CLEAR (на локальном сервере)
FROM TABLE (на удаленном сервере)
WHERE TABLE.DATE between '".$date_start."' and '".$date_end."'

За любые мысли по этому поводу буду благодарен, потому что я застрял.
invm
Дата: 05.02.2013 11:09:55
Если устраивает решение в стиле "работает и ладно", то Linked servers + openquery + на каждом сервере процедура или функция, возвращающая уже отфильтрованный набор + серия merge на локальном сервере в порядке приоритета серверов.
Glory
Дата: 05.02.2013 11:10:48
ELEKTpoHuK
Сделать Select всех таблиц с удаленного сервера INTO таблица на локальном но я не понимаю как реализовать

читать в хелпе про linked server и distributed query
ELEKTpoHuK
Дата: 05.02.2013 11:52:58
Спасибо за подсказку но тогда у меня возникает вопрос о способе применения.
Я пытался разобраться с процедурами вообще и с sp_addlinkedserver в частности.

Для этой цели процедура должна быть на удаленном сервере? и как тогда ее запускать с локального?
я пытался сделать так

$zapros = mssql_query("

EXEC sp_addlinkedserver
@server='имя для дальнейшего обращения',
@srvproduct='',
@provider='SQLNCLI',
@datasrc='192.168.0.3'

EXEC sp_addlinkedsrvlogin 'имя для дальнейшего обращения','false',null,'sa','password'

SELECT *
INTO CLEAR
FROM имя для дальнейшего обращения.TABLE
");

получаю ошибку Heterogeneous queries require the ANSI_NULLS and ANSI_WARNINGS options to be set for the connection. This ensures consistent query semantics. Enable these options and then reissue your query.

Подозреваю, что я неправильно пытаюсь пользоваться инструментом.
Glory
Дата: 05.02.2013 11:55:18
ELEKTpoHuK
Подозреваю, что я неправильно пытаюсь пользоваться инструментом.

Нет, вы просто не читаете сообщения об ошибке
"Heterogeneous queries require the ANSI_NULLS and ANSI_WARNINGS options to be set for the connection"

И не надо каждый раз создавать linked server
ELEKTpoHuK
Дата: 05.02.2013 12:07:03
Glory
ELEKTpoHuK
Подозреваю, что я неправильно пытаюсь пользоваться инструментом.

Нет, вы просто не читаете сообщения об ошибке
"Heterogeneous queries require the ANSI_NULLS and ANSI_WARNINGS options to be set for the connection"


Добавил
SET ANSI_NULLS ON
SET ANSI_WARNINGS ON
но ничего не меняется. та же ошибка.



Glory
И не надо каждый раз создавать linked server

А здесь мне вообще не понятно. То есть я один раз запустил и можно стереть? процедура записана и я могу обращаться к имя для дальнейшего обращения


И еще не понятно, мне эту процедуру нужно написать на локальном сервере или на удаленном? Сейчас я пишу на локальном.
Glory
Дата: 05.02.2013 12:38:51
Не пихайте все в одну строку кода
Есть два подхода
1. Создать один раз linked server. И потом использовать его в запросах
2. Использовать distributed query. В котором параметры коннекта к серверу задаются непосредственно в выполняемой команде.
ELEKTpoHuK
Дата: 05.02.2013 13:20:01
Glory
Не пихайте все в одну строку кода
Есть два подхода
1. Создать один раз linked server. И потом использовать его в запросах
2. Использовать distributed query. В котором параметры коннекта к серверу задаются непосредственно в выполняемой команде.


Я пробовал разбивать разными запросами
а теперь оставляю только select
1. а как понять что линкед сервер создался?
сейчас выдается ошибка Heterogeneous queries require the ANSI_NULLS and ANSI_WARNINGS options to be set for the connection. This ensures consistent query semantics. Enable these options and then reissue your query. все та же.

2. SELECT * FROM OPENROWSET(\"MSDASQL\", \"DRIVER={SQL >Server};SERVER=192.168.0.3;UID=sa;PWD=password\", TABLE)

Если не сложно можете немного поподробнее. Мне эта тема что-то тяжело дается. Я не понимаю логики работы всего этого.
Glory
Дата: 05.02.2013 13:25:59
ELEKTpoHuK
1. а как понять что линкед сервер создался?

Процедура sp_addlinkedserver возвращает код завершения

ELEKTpoHuK
сейчас выдается ошибка Heterogeneous queries require the ANSI_NULLS and ANSI_WARNINGS options to be set for the connection. This ensures consistent query semantics. Enable these options and then reissue your query. все та же.

Читайте текст ошибки. В нем говорится о настройках вашего коннекта.

ELEKTpoHuK
Если не сложно можете немного поподробнее. Мне эта тема что-то тяжело дается. Я не понимаю логики работы всего этого.

Возьмите хелп продукта. И из него синтаксис и примеры использования. Не выдумывайте ни первое ни второе сами.
ELEKTpoHuK
Дата: 05.02.2013 13:46:28
Glory
Возьмите хелп продукта. И из него синтаксис и примеры использования. Не выдумывайте ни первое ни второе сами.


Я кончно извиняюсь, но я поэтому сюда и обратился, что перерыв все и прочитав http://msdn.microsoft.com/ru-ru/library/ms190479.aspx (в частности и кучу другой информации)
так и не смог понять как это работает. Стараюсь находить информацию сам но в крайних случаях обращаюсь к профессионалам.
Конкретно про ошибку - читаю перевод

Гетерогенные запросы требуют ANSI_NULLS и ANSI_WARNINGS вариантов, которые будут установлены для подключения
По советам которые нашел в инете пишут что нужно прописать
SET ANSI_NULLS ON
SET ANSI_WARNINGS ON

мне это ничем не помогло


Glory
Процедура sp_addlinkedserver возвращает код завершения

А как мне посмотреть его средствами php
я например выяснил версии серверов
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64)
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)
Microsoft SQL Server 2005 - 9.00.5000.00 (Intel X86)