FM ExecuteSQL возвращает результаты, отличные от прямого запроса к базе данных

Мне интересно, может ли кто-нибудь объяснить, почему я получаю разные результаты для одной и той же строки запроса между использованием функции ExecuteSQL в FM и запросом базы данных через браузер базы данных (я использую DBVisualizer).

В частности, если я запускаю

SELECT COUNT(DISTINCT IMV_ItemID) FROM IMV

в DBVis я получаю 2802. В FileMaker, если я оцениваю выражение

ExecuteSQL ( "SELECT COUNT(DISTINCT IMV_ItemID) FROM IMV"; ""; "")

затем я получаю 2898. Это заставляет меня не доверять функции ExecuteSQL. Внутри FM таблица IMV является тенью ODBC, подключенной к центральной базе данных MSSQL. В DBVis приложение подключается через JDBC. Впрочем, я не думаю, что это должно что-то изменить.

Любые идеи, почему я получаю разные значения для каждого метода?


person eljefejb    schedule 23.08.2013    source источник


Ответы (2)


На самом деле оказывается, что когда FM выполняет SQL, он учитывает пробелы, тогда как DBVisualizer (не уверен в других приложениях для просмотра баз данных, но я предполагаю, что это то же самое) нет. Кроме того, поскольку функция TRIM() не поддерживается MSSQL (по крайней мере, из того, что я видел), необходимо сделать запрос внутри оператора ExecuteSQL примерно таким:

SELECT COUNT(DISTINCT(LTRIM(RTRIM(IMV_ItemID)))) FROM IMV

Странно, но это работает!

person eljefejb    schedule 26.08.2013

FM хранит в кэше записи теневой таблицы (для внутреннего сопоставления идентификаторов полей). Я не уверен, вызывает ли функция ExecuteSQL() повторное создание кеша. Другими словами: возможно, теневая таблица ESS не синхронизирована. Попробуйте удалить кеш, закрыв и перезапустив FM-клиент, или сначала выполните собственный поиск.

Вы также можете попробовать повторно подключиться к серверу базы данных с помощью шага сценария Open File.

ХТН

person user1683766    schedule 23.08.2013