2009-11-18 5 views
7

J'ai un SQL Server 2005 qui a un « serveur lié » à un autre SQL Server 2005.lié SQL Server a erreur à la conversion type de données DBTYPE_DBTIMESTAMP

Quand je lance une requête simple sur l'une des tables contre le lien serveur:

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

Cette erreur se produit:

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. 

Cependant, quand je l'utilise OPENQUERY cela fonctionne:

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

La table W_PATIENT ne comporte aucun champ typé 'TIMESTAMP'. Il a 5 champs DATETIME.

Il est également important de noter que je peux interroger d'autres tables avec des valeurs DATETIME sans problème. Le problème est concentré sur la table W_PATIENT.

+0

Avez-vous essayé de lancer [Pat_Id] en binaire (8)? C'est équivalent à TIMESTAMP et il serait intéressant de voir si cela a fonctionné. – ajdams

+0

Bonne pensée. Avant votre commentaire, j'ai essayé de convertir les champs DATETIME en TIMESTAMP et cela fonctionnait si j'étais connecté localement à la base de données Prod. Je viens d'utiliser BINARY (8) comme suggéré qui a également fonctionné. J'espérais qu'en jetant chacune des DATETIME individuellement je serais capable d'identifier celui avec de mauvaises données, mais pas de chance. – jacksonakj

+0

Etes-vous sûr que votre serveur lié est configuré correctement? Quelle est l'utilité de cette requête: SELECT produit, fournisseur FROM sys.servers WHERE name = 'Prod'; –

Répondre

1

Est-il possible que certains de ces champs DATETIME aient des "mauvaises entrées", hors de portée, etc. Par exemple si l'un de ceux-ci est en fait une chaîne avec quelques "ordures" à l'intérieur? La requête ouverte est exécutée sur le serveur distant et seuls les résultats sont renvoyés; tandis qu'avec select, les données sont transférées afin que la conversion de données soit appliquée.

Je considérerais un profilage de données sur la table w_patient. Si vous avez SQL Server 2008, il existe une tâche de profilage de données dans SSIS, mais vous pouvez également trouver d'autres outils pour vérifier la qualité des données.

+0

Il semble que vous êtes sur la bonne voie. En fonction de votre commentaire, j'ai essayé d'interroger chaque champ DATETIME et de valider la valeur comme une date. J'ai utilisé cette requête: SELECT * FROM [dbo]. [W_PATIENT] WHERE ISDATE ((CONVERT (NVARCHAR (25), [DOB], 100))) = 0 ET NON [DOB] EST NULL; Je souhaite avoir SQL Server 2008 pour aider avec le profilage de données. Des suggestions pour un autre outil? – jacksonakj

+0

Si le serveur lié est SQL Server et utilise DATETIME alors je ne vois pas comment il peut y avoir de "mauvaises entrées" à moins qu'il y ait une sorte de bug qui a permis les mauvaises données, ou si en fait la "table" sur l'autre extrémité est une vue qui essaie d'extraire des données d'un autre type de base de données. La référence DBTYPE_DBTIMESTAMP indique qu'un pilote ou une interprétation du type de données * en dehors de SQL Server * interfère ici. –

+1

Vous pouvez essayer http://datacleaner.eobjects.org/ il est Java donc vous aurez besoin de pilote JDBC aussi http://msdn.microsoft.com/fr-fr/data/aa937724.aspx –

Questions connexes