2009-11-18 97 views
7

我有一个SQL Server 2005中,有一个“链接服务器”到另一个SQL Server 2005的链接的SQL Server有误差与转换数据类型DBTYPE_DBTIMESTAMP

当我对链接表的一个运行一个简单的查询服务器:

SELECT TOP 10 [Pat_Id] 
FROM [Prod].[PIS].[dbo].[W_PATIENT] 

出现此错误:

Msg 8114, Level 16, State 8, Line 1 
Error converting data type DBTYPE_DBTIMESTAMP to datetime. 
Msg 8114, Level 16, State 8, Line 1 
Error converting data type DBTYPE_DBTIMESTAMP to datetime. 

然而,当我使用OPENQUERY它的工作原理:

SELECT * FROM OPENQUERY([Prod], 'SELECT TOP 10 [Pat_Id] FROM [PIS].[dbo].[W_PATIENT]') 

W_PATIENT表没有任何'TIMESTAMP'类型的字段。它有5个DATETIME字段。

同样值得注意的是,我可以用DATETIME值查询其他表而不会出现问题。问题集中在W_PATIENT表上。

+0

您是否尝试将[Pat_Id]转换为二进制文件(8)?这相当于TIMESTAMP,看看它是否有效很有意思。 – ajdams 2009-11-18 22:50:52

+0

好想法。在您的评论之前,我尝试将DATETIME字段投射到TIMESTAMP,并且如果我本地连接到Prod数据库,则工作正常。我只是使用BINARY(8)的建议,也工作。我希望通过单独投射每个DATETIME,我都能够识别具有不良数据的那个,但是没有运气。 – jacksonakj 2009-11-19 16:47:29

+0

你确定你的链接服务器设置正确吗?这个查询产生了什么:SELECT product,provider FROM sys.servers WHERE name ='Prod'; – 2009-11-19 02:06:02

回答

1

是否有可能这些DATETIME字段中有“错误的条目”,超出范围等。例如,如果其中一个实际上是一个字符串里面有一些“垃圾”? 打开的查询在远程服务器上执行,只返回结果;而在选择时,数据被转移,因此应用数据转换。

我会考虑w_patient表上的一些数据分析。如果您拥有SQL Server 2008,则SSIS中有一个数据分析任务,但您也可以找到其他工具来检查数据质量。

+0

看来你在正确的轨道上。根据您的评论,我试图查询每个DATETIME字段并将该值作为日期进行验证。我使用这个查询:SELECT * FROM [dbo]。[W_PATIENT] WHERE ISDATE((CONVERT(NVARCHAR(25),[DOB],100)))= 0 AND NOT [DOB] IS NULL;我希望我有SQL Server 2008来帮助数据分析。任何其他工具的建议? – jacksonakj 2009-11-19 16:54:50

+0

如果链接的服务器是SQL Server并且也使用DATETIME,那么我不会看到如何存在“错误的条目”,除非有某种错误允许那里的错误数据,或者实际上是“表”另一端是试图从其他类型的数据库中提取数据的视图。 DBTYPE_DBTIMESTAMP引用指示某些驱动程序或某种数据类型*在SQL Server *之外的解释在此处存在干扰。 – 2009-11-19 16:58:56

+1

你可以试试 http://datacleaner.eobjects.org/ 它是java所以你也需要JDBC驱动程序 http://msdn.microsoft.com/en-us/data/aa937724.aspx – 2009-11-19 17:35:26

相关问题