This is topic Невозможно получить данные по ODBC от ТМ через Linked Servers в MSSQLServer и RemoteView в VisualFoxPro in forum Работа в MS Windows (ODBC/DDE/OPC/NET) / Working under MS Windows at Форум TRACE MODE: техническая поддержка.
Наша цель - создать сервер, который будет собирать данные по ODBC со многих МРВ.
Попытались использовать для этого MSSQLServer. В MSSQLServer попробовали использовать процедуру импорта данных из внешней базы через ODBC - получилось, но сам способ не годится. Решили подключить МРВ как связанный сервер (Linked Server) - он подключился, но в ответ на запрос выдает пустую таблицу (т.е. структура есть, а данных нет). При этом успешно выдает свои системные таблицы. Несколько раз удалось получить данные, когда МРВ и MSSQLServer были запущены на одной машине, но результат нестабильный.
Еще хуже с VisualFoxPro. Connection создается, но при попытке создать RemoteView (даже для МРВ на той же машине) при добавлении таблицы ARCHIVE возникает ошибка "Connectiviti error: Unable to retrieve specific error information. Driver is probably out of resources".
Приложения EXCEL и ACCESS успешно принимают данные через тот же DSN.
Кроме того, MSSQLServer невозможно выполнить запрос к связанному серверу используя временнЫе границы, т.к. в запросе --SELECT * FROM OPENQUERY(TMDSN, 'SELECT * FROM ARCHIVE WHERE TIME>{d '2004-02-12'}')-- одинарные кавычки в структуре TIME воспринимаются как закрывающие, а структура #12.06.2004# вообще не воспринимается (вызывает ошибку ODBC).
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Относительно MSSQLServer и VisualFoxPro сразу сказать, в чем причина, будет трудно. Нужно анализировать лог ODBC-транзакций в системе. Для этого Вам необходимо включить в системе ODBC трассировку всех транзакций в лог-файл и после воспроизведения описанных Вами ошибок проанализировать, что конкретно их вызывает. Также рекомендую обратить внимание в запросах на форматы времени. Дело в том, что формат времени и даты в разных СУБД разный (на него просто нет стандарта в ODBC, потому как при передаче - это всего лишь строка текста). Из-за этого зачастую и возникают проблемы с обменом по ODBC в разнородных системах. И еще одно - наш ODBC-драйвер не понимает вложенных запросов, типа: SELECT * FROM OPENQUERY(TMDSN, 'SELECT * FROM ARCHIVE WHERE TIME>{d '2004-02-12'}'), только односложные.
Posted by Kramarenko Stanislav (Участник № / Member № 119) on :
В запросе типа: SELECT * FROM OPENQUERY(TMDSN, 'SELECT * FROM ARCHIVE WHERE TIME>{d '2004-02-12'}') вашему драйверу должна посылаться только строка внутри кавычек (т.е. /SELECT * FROM ARCHIVE WHERE TIME>{d '2004-02-12'}/) - остальное обрабатывает MSSQLServer, но он не может выполнить такой запрос, т.к. внутри его кавычек вставлены ваши, и первую вашу он воспринимает как вторую свою и выдает ошибку синтаксиса!!!
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
А здесь уже ничего не поделаешь, можно только попробовать не одинарные кавычки, а двойные как во внутреннем запросе, так и во внешнем.
Posted by HI-TIGER (Участник № / Member № 1045) on :
Занимаюсь решением подобной задачи могу поделиться опытом, как пишутся такие запросы Дело в том, что через линкованный сервер чтение данных из СПАД проходит хорошо только для количества параметров <= 100. Возможно дело в настройках самого SQL сервера. Я не докоался. Если читать значение текущее, по конретному индексу таким запросом, все работает хорошо. А вообще, мое мнение, делать надо по другому... Если проблема еще актуальна пиши на KuznetsovDS@kolatom.murmansk.ru