Ошибка преобразования dbtype_dbdate в дату

У меня есть источник данных ODBC, настроенный как связанный сервер в MS SQL Server 2012. В этой базе данных большинство (но не все) столбцов, тип данных которых — дата, доставляют мне проблемы всякий раз, когда я запускаю запросы. У меня нет проблем с запросом любых столбцов, кроме этих столбцов типа даты.

Следующий запрос:

SELECT *
FROM   OPENQUERY(LINKEDSERVERNAME, 'SELECT Product, 
                                           DateLastReceipt
                                    FROM   ProductTable')

Выдает следующее сообщение об ошибке в SQL Server Management Studio (2012):

Сообщение 8114, уровень 16, состояние 10, строка 1. Ошибка преобразования типа данных DBTYPE_DBDATE в дату.

Я безуспешно пытался использовать CONVERT для преобразования типа данных в varchar в соответствии со следующим обсуждением (то же сообщение об ошибке): http://social.technet.microsoft.com/Forums/en-US/transactsql/thread/3a7d94ee-46a0-40ce-ae95-127ec462fbff

Теперь есть несколько столбцов с одним и тем же типом данных (дата), которые не доставляют мне никаких проблем. Например, в моей ProductTable есть столбец AddedToFile, в котором указана дата создания записи. Эта колонка не доставляет мне никаких хлопот.

Любая помощь, которую кто-то может предложить, будет ОЧЕНЬ оценена.

Спасибо.


person Kyle    schedule 14.07.2012    source источник


Ответы (1)


надеюсь, что это поможет (я не использую SQL Server 2012).
если ваш ODBC ссылается на db2, для диапазона дат не поддерживается, например. «0001-01-01», вам нужно произнести. Обычно это работает.

SELECT * 
FROM   OPENQUERY(LINKEDSERVERNAME, 'SELECT Product, 
                                       CAST(DateLastReceipt AS CHAR(10))
                                FROM   ProductTable')

Если вы все еще хотите, чтобы результат был датой, просто используйте CASE и замените недопустимую дату на дату по умолчанию, например.

SELECT *
FROM   OPENQUERY(LINKEDSERVERNAME, 'SELECT Product, 
                               ,CASE WHEN DateLastReceipt AS CHAR(10)) = ''0001-01-01''
                                       THEN CURRENT_DATE
                                     ELSE DateLastReceipt 
                                     END
                                FROM   ProductTable')

Возможно, вам придется изменить CURRENT_DATE на CURRENT_TIMESTAMP, а состав CASE зависит от вашего сервера базы данных и ваших требований.

person lamLam    schedule 16.07.2012
comment
Спасибо @lamLam. Ваш первый предложенный запрос вызывает у меня следующую ошибку: поставщик OLE DB MSDASQL для связанного сервера LINKEDSERVERNAME вернул сообщение [Transoft][TSODBC][usqlsd] «FROM», ожидаемое здесь ((). Используя второй запрос, я получаю следующую ошибку: Поставщик OLE DB MSDASQL для связанного сервера LINKEDSERVERNAME вернул сообщение [Transoft][TSODBC][usqlsd]Ожидается имя (,). Мой синтаксис не работает с обоими этими сообщениями? Эти сообщения не кажутся наиболее информативными. Спасибо за ваше сообщение. Помогите, я новичок в этом. - person Kyle; 16.07.2012
comment
извините, я никогда раньше не пользовался продукцией Transoft. Вы можете попробовать... Запустите оператор select непосредственно с помощью клиентов Transoft (если есть) или напрямую на сервер SELECT Product, CAST(DateLastReceipt AS CHAR(10)) FROM ProductTable. Найдите руководство Transoft sql по преобразованию даты в символ. Вероятно, Transoft не поддерживает CAST, или использует CHARACTER(10) вместо CHAR, или использует другие функции. После работы просто скопируйте все это обратно в скрипт SQL-сервера. - person lamLam; 17.07.2012