#sql-server #oracle #linked-server
#sql-сервер #Oracle #связанный сервер
Вопрос:
Я использую связанный сервер на своем SQL-сервере для запроса базы данных Oracle.
На стороне Oracle есть представление: article_test, имеющее простое условие where creationdate < ‘01.01.2019’
К сожалению, в запросе SQL-сервера нет результата
select * from [LINKDB]..[SCHEMA].[ARTICLE_TEST]
Установка условия where на большее, чем creationdate > ‘01.01.2019’
все в порядке, и есть результат.
должна быть проблема, связанная с условием «меньше, чем».
Комментарии:
1. Попробуйте то же самое непосредственно на сервере Oracle. SQL Server никак не интерпретирует и не выполняет представление (он оставляет это на удаленной стороне), поэтому тот факт, что вы имеете дело со связанным сервером, должен быть неактуальным. Если это действительно имеет значение, это было бы интересно, но в противном случае нет оснований предполагать, что проблема не только в ваших данных или вашем запросе. С другой стороны, если
WHERE
предложение находится на стороне SQL Server , что в вашем вопросе неясно, используйте формат даты, который не зависит от locale (20190101
).2. Выполняется тот же запрос на сервере Oracle напрямую. Есть результат с меньшим, чем. Вот почему я в замешательстве.
3. Тогда вам, вероятно, следует проверить тип,
creationdate
как это видит SQL Server:SELECT TOP(1) SQL_VARIANT_PROPERTY(creationdate, 'BaseType') FROM ...article_test
. Если это не тип даты / времени, то сравнение происходит посредством сравнения строк, и это, очевидно, не будет работать ни для чего, кромеYYYYMMdd
форматов. Если это тип даты / времени на стороне Oracle, проблема может быть связана с преобразованиями в драйвере.4. Кроме того, SQL Server имеет ограниченную поддержку литералов даты / времени, но вы можете попробовать их, чтобы узнать, нравятся ли они драйверу больше для целей удаленного доступа:
{ts '2019-01-01 00:00:00'}
(также подойдет явныйCAST('20190101' AS DATETIME)
). В противном случае это может быть отправка строки в Oracle, которую Oracle затем неправильно преобразует.5. Если
CREATIONDATE
это столбец даты, почему вы сравниваете дату с символьной строкой? ЕслиCREATIONDATE
это не столбец даты, почему вы сохраняете даты в виде строк? ???