Sql 将dbtype_dbdate转换为日期时出错

Sql 将dbtype_dbdate转换为日期时出错,sql,database,odbc,sql-server-2012,Sql,Database,Odbc,Sql Server 2012,我在MS SQL server 2012中将ODBC数据源设置为链接服务器。在整个数据库中,数据类型为date的大多数(但不是所有)列在我运行查询时都会给我带来麻烦。查询除这些日期类型列以外的任何列都没有问题 以下查询: SELECT * FROM OPENQUERY(LINKEDSERVERNAME, 'SELECT Product, DateLastReceipt

我在MS SQL server 2012中将ODBC数据源设置为链接服务器。在整个数据库中,数据类型为date的大多数(但不是所有)列在我运行查询时都会给我带来麻烦。查询除这些日期类型列以外的任何列都没有问题

以下查询:

SELECT *
FROM   OPENQUERY(LINKEDSERVERNAME, 'SELECT Product, 
                                           DateLastReceipt
                                    FROM   ProductTable')
在SQL Server Management Studio(2012)中提供以下错误消息:

消息8114,16级,状态10,第1行。将数据类型DBTYPE_DBDATE转换为日期时出错

在下面的讨论中,我尝试使用CONVERT将数据类型转换为varchar,但没有任何运气(相同的错误消息):

现在,有一些数据类型(日期)完全相同的列根本不会给我带来任何麻烦。例如,在我的ProductTable中,有一个名为AddedToFile的列,显示了创建记录的日期。这篇专栏文章一点也不给我添麻烦

如果有人能提供任何帮助,我们将不胜感激

谢谢。

希望这有帮助(我没有使用SQL Server 2012)。
如果ODBC链接到db2,对于不支持的日期范围,例如“0001-01-01”,则需要强制转换。 通常情况下,这是可行的

SELECT * 
FROM   OPENQUERY(LINKEDSERVERNAME, 'SELECT Product, 
                                       CAST(DateLastReceipt AS CHAR(10))
                                FROM   ProductTable')
如果您仍然希望结果为日期,只需使用用例并将无效日期替换为默认日期即可

SELECT *
FROM   OPENQUERY(LINKEDSERVERNAME, 'SELECT Product, 
                               ,CASE WHEN DateLastReceipt AS CHAR(10)) = ''0001-01-01''
                                       THEN CURRENT_DATE
                                     ELSE DateLastReceipt 
                                     END
                                FROM   ProductTable')
您可能需要将当前日期更改为当前时间戳,案例组成取决于您的db服务器和您的要求

希望这有帮助(我不使用SQL server 2012)。
如果ODBC链接到db2,对于不支持的日期范围,例如“0001-01-01”,则需要强制转换。 通常情况下,这是可行的

SELECT * 
FROM   OPENQUERY(LINKEDSERVERNAME, 'SELECT Product, 
                                       CAST(DateLastReceipt AS CHAR(10))
                                FROM   ProductTable')
如果您仍然希望结果为日期,只需使用用例并将无效日期替换为默认日期即可

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

您可能需要将当前\u日期更改为当前\u时间戳,案例组成取决于您的db服务器和您的要求

谢谢@lam。您建议的第一个查询为我抛出以下错误:链接服务器“LINKEDSERVERNAME”的OLE DB提供程序“MSDASQL”返回消息“[Transoft][TSODBC][usqlsd]”此处应为(()”。使用第二个查询,我得到以下错误:链接服务器“LINKEDSERVERNAME”的OLE DB提供程序“MSDASQL”返回消息“[Transoft][TSODBC][usqlsd]名称应为(,)”。我的语法是否与这两个都不符?这些似乎不是最具描述性的错误消息。感谢您的帮助。我是这方面的新手。很抱歉,我以前从未使用过Transoft Stuff。您可以尝试…直接使用Transoft客户端(如果有)运行select语句,或直接向服务器选择产品CAST运行select语句(DateLastReceive作为字符(10))来自ProductTable。在将日期转换为字符时搜索Transoft sql手册。Transoft可能不支持强制转换或使用字符(10)而不是CHAR或它使用不同的函数。一旦工作,只需将整个内容复制回SQL server ScriptThank@lam。您建议的第一个查询为我抛出以下错误:链接服务器的OLE DB提供程序“MSDASQL”LINKEDSERVERNAME“返回消息”[Transoft][TSODBC][usqlsd]“FROM”,此处应为(())。使用第二个查询,我得到以下错误:链接服务器“LINKEDSERVERNAME”的OLE DB提供程序“MSDASQL”返回消息“[Transoft][TSODBC][usqlsd]应为名称(,)”。我的语法与这两个都不符吗?这些似乎不是最具描述性的错误消息。感谢您的帮助。我是这方面的新手。很抱歉,我以前从未使用过Transoft Stuff。您可以尝试…直接使用Transoft客户端(如果有)运行select语句,或直接运行到服务器select产品CAST(DateLastReceiveas CHAR(10))从ProductTable.Search Transoft sql手册将日期转换为字符。Transoft可能不支持强制转换,或者使用字符(10)而不是字符,或者使用不同的函数。一旦成功,只需将整个过程复制回sql server脚本