Если я выберу более 15 полей, я получу катастрофический сбой

Используя SQL Server 2012 я подключаюсь к связанному серверу с Pervasive SQL на нем.

Когда я делаю select * или же select field1,field2,field3....field15 Я получаю эту ошибку:

Msg 7399, Level 16, State 1, Line 1
The OLE DB provider "MSDASQL" for linked server "KSLAP208" reported an error. The provider reported an unexpected catastrophic failure.
Msg 7330, Level 16, State 2, Line 1
Cannot fetch a row from OLE DB provider "MSDASQL" for linked server "KSLAP208".

Я чувствую, что есть какая-то проблема с памятью? Это не позволит мне выбрать более определенного количества данных?

тогда как, если я выберу небольшое количество данных select field1,field2 это работает без проблем.

Что я делаю неправильно?

3 ответа

В публикации на веб-сайте Microsoft говорится, что вы можете обойти эту проблему, отключив предварительную выборку запросов для связанного сервера.

В панели "Администратор источника данных ODBC" на сервере настройте связанный сервер из системного уведомления о доставке. На вкладке "Производительность" снимите флажок "Включить предварительную выборку данных для запросов". ХОРОШО-ХОРОШО. Удалите и заново создайте связанный сервер в SQL Management Studio.

Вы можете отключить предварительную выборку, сняв флажок "Включить предварительную выборку данных для запросов" на вкладке "Производительность" при создании DSN или добавив "PREFETCH=0" в строку подключения при создании подключения без DSN.

Так как у меня нет доступа к области загрузки Pervasive (и соединение ODBC с SQL Server выглядит совершенно иначе при моей установке Server 2012), я не смог проверить это. Это все равно может помочь тебе в любом случае...

Работает ли это: ВЫБЕРИТЕ ТОП 1 field1,field2,field3....field15.
Если да, как насчет SELECT TOP 10 field1,field2,field3....field15.
Если да, как насчет SELECT TOP 100 field1,field2,field3....field15.
Повторите и т. Д.

Предполагая, что он в какой-то момент обрывается, добавьте предложение ORDER BY для столбца (или набора столбцов), которые являются уникальными. Повторите и отрегулируйте количество строк, пока вы не определите виновника. Например, SELECT TOP 12345 работает, а SELECT TOP 12346 - нет. (Хороший ORDER BY здесь важен, чтобы убедиться, что он каждый раз возвращает один и тот же набор данных.) Теперь используйте диапазон предложения WHERE, чтобы получить только небольшой объем данных, который появляется в нижней части ваших "хороших" данных, затем немного увеличьте диапазон WHERE, чтобы включить плохую строку. Если это работает сейчас, то это указывает на объем данных, который, по крайней мере, подтверждает ваше первоначальное предположение, и если он все еще дает ошибку, посмотрите на строку, которая будет 12346 в этом запросе, и посмотрите, есть ли что-нибудь смешное с этим.

Я могу уточнить, если получится, что это куда-то приведет вас.

Я знаю, этот вопрос задавался давно, но для людей гугл-ин и наткнулся на этот пост...

Я предполагаю, что запрос золотой, когда вы запускаете его на сервере, с которым вы связаны?

Какой ваш точный запрос?

Вы делаете:

Select * from "the linked server"

-или же-

Select * from openquery("the linked server",'Select * from "the table"')

Есть разница:

  1. Сначала получает ВСЕ записи с удаленного сервера, а затем выполняет запрос на вашем локальном сервере.
  2. Второй сначала выполняет запрос на удаленном сервере. Удаленный сервер только отправляет обратно набор результатов.

Существует возможность тайм-аута, но я не думаю, что это проблема, с которой вы столкнулись.

Я столкнулся с проблемой, делающей связанный сервер с mysql, Я попробовал #1 выше, и я, кажется, помню ту же самую бесполезную ошибку. Оказалось, что выполнение #1 работает (или работает лучше всего) с другими серверами SQL. При подключении к серверу, отличному от SQL, вы должны использовать #2 (openquery).

Другие вопросы по тегам