Недавно нам пришлось поработать с базой данных OpenEdge, которую использует сторонний продукт, и сегодня (после долгих потрясений) мы наконец-то определили, почему представление не дает результатов.
Это представление объединяет около 100 отдельных таблиц, а затем запрашивается (у нас ограничены права на эту базу данных). Одно из полей, возвращаемых этим представлением, является жестко закодированным строковым литералом, следующим по
'John Smith' AS TheName
У нас были проблемы с выполнением запросов, которые включали эту строку, которую мы пытались RTrim (представление возвращало много конечных пробелов), а затем объединяли с другим полем.
Однако, если мы использовали RTrim в этом поле, то вместо того, чтобы возвращать сообщение об ошибке, или ноль или что-то подобное, строка просто не возвращалась. Мы не пытались использовать его в предложении WHERE или JOIN, это было просто частью SELECT ... FROM VIEWNAME. После просмотра представления казалось, что представление ошибочно определило длину строки как 9 символов (длина не была указана в определении), и RTrim просто не работал.
Теперь я могу понять, почему это может привести к сообщению об ошибке или к значению NULL в SELECT, но почему строка просто не будет возвращена вообще ? Это не похоже на хорошее поведение SQL, и я никогда не видел, чтобы это происходило с любой другой СУБД.
Прочая информация: мы тестируем запросы через ODBC и WinSQL, чтобы включить их в существующее приложение ASP.NET. У нас нет доступа к бэкэнду, кроме как через это, хотя у нас есть права на создание представлений.
Обновление: в качестве причудливого продолжения мы обнаружили, что если мы попытаемся запросить это представление без какого-либо предложения WHERE, никакие записи не будут возвращены. Это может иметь ту же причину.