2016-10-17 2 views
0

Я написал запрос на SQL-сервере, который работает нормально.Копирование запроса с SQL-сервера на MS Acess

Мне нужно запустить этот запрос в Access, так как есть больше данных, которые мне нужно найти в запросе.

Однако, когда я копирую SQL в Access, это не работает, я получаю синтаксическую ошибку, отсутствующий оператор в выражении запроса.

SELECT main.Tbl_ServiceOrder.ServiceOrder 
, main.Tbl_Serviceorder.BusinessPartnerNumber 
, main.Tbl_ServiceOrder.ExternalPointofDeliverynumber 
, main.Tbl_ServiceOrder.ServiceProduct 
, main.Tbl_ServiceOrder.SOCreatedOn 
, main.Tbl_ServiceOrder.MainUserStatus 
, main.Tbl_ServiceOrder.MainUserStatusDesc 
, main.Tbl_ServiceOrder.ReasonCode 
, main.Tbl_ServiceOrder.ReasonCodeDesc 
, main.Tbl_ServiceOrder.SOActualFinishDate 
, main.Tbl_ServiceOrder.BasicStartDate 
,CAST(CASE WHEN reasoncode <> 'CMPL' THEN 'Pre Install' 
WHEN reasoncode = 'CMPL' and SOActualFinishDate < (getdate()-182) THEN 'SMART BAU' 
ELSE 'Post Install' END as Varchar) as SMRTPot 
FROM main.Tbl_ServiceOrder 
WHERE main.Tbl_ServiceOrder.ServiceProduct ='SMINSTALL' 
OR main.Tbl_ServiceOrder.ServiceProduct ='SMEXCHANGE' 

The WHEN на первой линии CAST подсвечивается доступа в качестве точки ошибки.

Что я делаю неправильно?

Я попытался изменить оттенок ИИФ ниже

, IIF (reasoncode <> 'CMPL','Pre Install',(IIF SOActualFinishDate < (getdate()-182),'SMART BAU','Post Install')) as SMRTPot 

выше, дает синтаксическую ошибку (запятая) в выражении запроса

IIF (reasoncode <> 'CMPL','Pre Install',(IIF SOActualFinishDate < (getdate()-182),'SMART BAU','Post Install')) as SMRTPot 

выше дает синтаксическую ошибку в выражении запроса.

Хорошо, так это то, что я использую сейчас:

SELECT main.Tbl_ServiceOrder.ServiceOrder 
, main.Tbl_Serviceorder.BusinessPartnerNumber 
, main.Tbl_ServiceOrder.ExternalPointofDeliverynumber 
, main.Tbl_ServiceOrder.ServiceProduct 
, main.Tbl_ServiceOrder.SOCreatedOn 
, main.Tbl_ServiceOrder.MainUserStatus 
, main.Tbl_ServiceOrder.MainUserStatusDesc 
, main.Tbl_ServiceOrder.ReasonCode 
, main.Tbl_ServiceOrder.ReasonCodeDesc 
, main.Tbl_ServiceOrder.SOActualFinishDate 
, main.Tbl_ServiceOrder.BasicStartDate 
,Switch(reasoncode <> 'CMPL', 'Pre Install', 
     reasoncode = 'CMPL' AND SOActualFinishDate < (Getdate() - 182), 'SMART BAU', 
     True, 'Post Install') as SMRTPot 
FROM main.Tbl_ServiceOrder 
WHERE main.Tbl_ServiceOrder.ServiceProduct ='SMINSTALL' OR main.Tbl_ServiceOrder.ServiceProduct ='SMEXCHANGE' 

Сообщение об ошибке теперь не может найти файл «путь к файлу \ main.mdb

+0

http://stackoverflow.com/questions/14920116/does-ms-access-support-case-when-clause-if-connect-with-odbc –

+0

Вы просмотрели синтаксис CASE для Access и сравнили его с ваш? – GuidoG

ответ

1

Слишком много вопросов и слишком длинные для комментария ,

Используется синтаксис SQL Server, а не синтаксис MS Access SQL.

WHEN...CASE не действует в MS Access SQL, вы должны использовать IIF или SWITCH вместо

CAST также не действует. Вы можете конвертировать в строку с использованием CStr

GetDate также недействителен, вы должны использовать DATE().

Если вы хотите вычитать 182 дней, то вы должны сделать DATEADD('d', DATE() , -182)

Но самый удобный способ справиться с этим, вероятно, сделать транзитное запрос, который будет выполняться на SQL Server, а не MS Access (таким образом, не на связанные таблицы), поэтому вы можете сохранить синтаксис SQL Server. Найдите этот путь.

+0

Пройти через то, что я искал - Спасибо –

Смежные вопросы