2016-12-06 12 views
0

Я пытаюсь динамически передавать функцию даты в openquery на SQL Server. Мой SQL Server подключен к базе данных Oracle OLEDB.Что такое синтаксис для функций даты в openquery - OleDB через SQL Server

Когда я запускаю мой запрос с использованием на основе Oracle функции дат, работает мой запрос, но не возвращает данных:

SELECT * 
FROM OPENQUERY([SMA], 'SELECT B.SQL_DATE 
         FROM DIM_DATE B 
         WHERE B.SQL_DATE = current_DATE'); 

Когда я запускаю этот запрос с помощью функции даты на основе SQL Server, я получаю следующее сообщение об ошибке :

SELECT * 
FROM OPENQUERY([SMA], 'SELECT B.SQL_DATE 
         FROM DIM_DATE B 
         WHERE B.SQL_DATE = ''GETDATE()'''); 

OLE DB провайдер "OraOLEDB.Oracle" для связанного сервера "SMA" возвращается сообщение "ORA-01841: (полный) год должен быть между -4713 и +9999, а не быть 0".

Я думаю, что я должен использовать синтаксис на основе SQL Server (в отличие от синтаксиса Oracle), но не уверен, как может работать оператор current_DATE?

Любая помощь была бы высоко оценена!

+0

«GETDATE()» заменяется представлением даты синтаксического анализатора SQL Server, поскольку оценка не находится в строковом литерале, тогда как current_DATE отправляется по проводке к подключенному серверу и анализируется как sql. Проверьте свой язык и убедитесь, что значения даты выровнены. Вы можете заставить определенное значение даты, и это звучит так, вот что вам нужно сделать здесь. –

+0

Таким образом, часть проблемы - это поле даты, на которое я ссылаюсь, является меткой времени. Если я запрашиваю базу данных за пределами открытого запроса, я получаю это: SELECT B.SQL_DATE FROM [SMA] .. [SMA]. [DIM_DATE] B WHERE B.SQL_DATE = Преобразование (дата, GETDATE()); Однако я не могу понять, какой набор тиков мне нужно использовать, или если можно передать эту функцию через openquery. –

ответ

2

Вы используете синтаксис, который поддерживает ваша целевая база данных, поэтому в этом случае вы используете синтаксис Oracle.

Эквивалент GetDate() SYSDATE. Это содержит время, поэтому вы можете удалить время, указав TRUNC (SYSDATE). Для литератур даты вам нужно указать функцию TO_DATE(), например. TO_DATE ('31 -DEC-2016 ',' DD-MON-YYYY ')

При использовании OpenQuery становится бесполезным, поскольку литераторы даты должны иметь двойные одинарные кавычки, то есть TO_DATE (' '31-DEC-2016' ',' DD-MON-YYYY '')

+0

BOOM! Ты лучший! это и сделал трюк. Это также помогло мне философски понять, как лучше понять, какие функции использовать с помощью открытого запроса. Я должен переполнять некоторые ответы на некоторые вопросы, когда я получаю минута! –

+0

@BobbyJobsite - Вы также можете [принять] (http://meta.stackexchange.com/a/5235/238021) этот ответ. –