Sql 将dbtype_dbdate转换为日期时出错
我在MS SQL server 2012中将ODBC数据源设置为链接服务器。在整个数据库中,数据类型为date的大多数(但不是所有)列在我运行查询时都会给我带来麻烦。查询除这些日期类型列以外的任何列都没有问题 以下查询: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
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脚本