ошибка транспортного уровня при указании SELECT * - PullRequest
2 голосов
/ 04 октября 2010

Следующий запрос не работает и выдает ошибку:

Произошла ошибка транспортного уровня при получении результатов с сервера

SELECT 
    * 
FROM 
    table1 a, 
    table2 b, 
    table3 c 
WHERE 
    a.location = b.location AND 
    b.location = c.location AND 
    a.id = c.id AND 
    a.entry = ''34690''

Хотяэтот запрос работает:

SELECT 
    a.location, 
    a.id, 
    a.entry, 
    c.desc, 
    b.name 
FROM 
    table1 a, 
    table2 b, 
    table3 c 
WHERE 
    a.location = b.location AND 
    b.location = c.location AND 
    a.id = c.id AND 
    a.entry = ''34690''

Мне нужно выбрать практически все из всех таблиц (около 100 элементов), но мне действительно нужно указывать каждый столбец, который мне нужен в наборе результатов?

Ответы [ 4 ]

5 голосов
/ 04 октября 2010

Несмотря на то, что, как правило, рекомендуется избегать использования спецификатора * при написании клиентских запросов SELECT, может быть несколько причин, по которым он может не работать:

  • продукт SQL-сервера, который вы используете, или драйвер, который вы используете, не поддерживает получение такого количества (100) столбцов в одном запросе.
  • общий размер всех столбцов, которые вы пытаетесь вернуть, больше максимально поддерживаемого максимума (скорее всего, драйвером) - это может произойти, если некоторые из столбцов имеют большие типы данных и содержат много данных например, много столбцов VARCHAR (MAX) или TEXT
  • или может быть на самом деле плохое сетевое соединение между вашим сервером и клиентом - вы должны проверить это, выполнив запрос локально на сервере.

EDIT

ОК, поэтому проблема в том, что в одном из столбцов содержится текст длиной около 1000 символов. Есть ли способ обойти это?

Вы пытались запустить запрос, чтобы вернуть только один столбец, который вызывает проблему? Если у вас есть, и это сработало само по себе, но приводит к сбою полного запроса, вы можете попробовать выполнить два запроса. Один, чтобы получить остальные столбцы, и один, чтобы получить оставшиеся один столбец. Затем в вашем клиенте соберите информацию. Если вы пойдете по этому пути, вам нужно будет убедиться, что вы включили любой уникальный идентификатор, который вы используете для идентификации каждой записи в обоих запросах, чтобы вы могли отобразить обратно длинный текст -колонка с остальной информацией для каждой записи.

3 голосов
/ 04 октября 2010

Полученная ошибка связана с сетевым подключением, а не с выполняемым оператором.

Пожалуйста, обновите вопрос сообщением об ошибке FULL . Это поможет отследить корень проблемы.

Можете ли вы подтвердить, что сервер не был выключен в то время? Является ли ошибка предсказуемой в 100% случаев при использовании синтаксиса SELECT *?

2 голосов
/ 04 октября 2010

Да, вы всегда должны указывать нужные столбцы в производственном коде (это нормально в специальных запросах, запускаемых один раз).Чтобы не сделать это антипаттерн SQL.В вашем случае у вас есть объединения, что означает, что минимум поля повторяются, что является пустой тратой ресурсов сервера и базы данных.Нетрудно указать поля, вы можете перетащить все столбцы из браузера объектов, поэтому нет никаких оснований этого не делать.Вы можете сломать много вещей и сделать обслуживание намного хуже, используя select *.Никогда не используйте его в рабочем коде.

Кстати, вы не должны использовать неявные объединения.Они подвержены случайным перекрестным объединениям, их сложнее поддерживать (особенно, когда вам нужно добавить левое объединение позже), они НЕ работают правильно, если вы используете синтаксис для левого или правого объединений (что также не рекомендуется)заменил 18 лет назад с лучшим синтаксисом.

Я бы ожидал, что SQL Server сможет отправлять 100 полей, одно из которых больше 1000 символов, без проблем.Не уверен, что является причиной транспортной ошибки, но сообщение об ошибке обычно появляется при разрыве соединения с базой данных.

1 голос
/ 04 октября 2010

Попробуйте запрос ниже

ВЫБРАТЬ a.* б.* c. * ИЗ таблицы1 a, таблицы2 b, таблицы3 c ГДЕ a.location = b.location AND b.location = c.location AND a.id = c.id AND a.entry = '34690'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...