Вопрос

Недавно нам пришлось поработать с базой данных OpenEdge, которую использует сторонний продукт, и сегодня (после долгих потрясений) мы наконец-то определили, почему представление не дает результатов. Это представление объединяет около 100 отдельных таблиц, а затем запрашивается (у нас ограничены права на эту базу данных). Одно из полей, возвращаемых этим представлением, является жестко закодированным строковым литералом, следующим по строкам

'John Smith' AS TheName

У нас были проблемы с выполнением запросов, включающих эту строку, которые мы пытались RTrim (представление возвращало много конечных пробелов), а затем объединяли с другим полем. Однако, если мы использовали RTrim в этом поле, то вместо того, чтобы возвращать сообщение об ошибке, или ноль или что-то подобное, строка просто не возвращалась. Мы не пытались использовать его в предложении WHERE или JOIN, это было просто частью SELECT ... FROM VIEWNAME. После просмотра представления казалось, что представление ошибочно определило длину строки как 9 символов (длина не была указана в определении), и RTrim просто не работал. Теперь я могу понять, почему это может привести к сообщению об ошибке или к значению NULL в SELECT, но почему строка просто не будет возвращена вообще ? Это не похоже на хорошее поведение SQL, и я никогда не видел, чтобы это происходило с любой другой СУБД.

Другая информация: мы тестируем запросы через ODBC и WinSQL, чтобы включить их в существующее приложение ASP.NET. У нас нет доступа к бэкэнду, кроме как через это, хотя у нас есть права на создание представлений.

Обновление: в качестве причудливого продолжения мы обнаружили, что если мы попытаемся запросить это представление без какого-либо предложения WHERE, никакие записи не будут возвращены. Это может иметь ту же причину.

Это было полезно?

Решение

Похоже, это может быть связано с SQL-WIDTH в базе данных хода выполнения. Одна из проблем с Progress состоит в том, что если содержимое поля превышает SQL-WIDTH, вы получите странное поведение SQL (иногда драйвер может завершиться с ошибкой, а иногда нет результатов).

Чтобы определить это, вам нужно использовать команду dbtool , чтобы проверить наличие SQL-WIDTH, которые могут быть превышены.

Другие советы

Убедитесь, что у вас нет пробелов. Обрезка не удаляет пробелы, только пробелы. Пробелы также не равны нулю. Существует разница в наборе символов, хотя в вашем редакторе он не заметно отличается. Я столкнулся с этим с несколькими базами данных, DBII, Oracle, PostGreSQL. Проверьте набор символов вашего редактора и попробуйте просмотреть таблицы, вы можете ничего не видеть или большие прямоугольники.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top