2009-11-18 99 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

相關問題