2009-11-18 8 views
7

Ho uno SQL Server 2005 che dispone di un 'server collegato' a un altro SQL Server 2005.collegato SQL Server ha errore con la conversione di tipo di dati DBTYPE_DBTIMESTAMP

Quando eseguo una semplice query su uno dei tavoli contro il collegato server:

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

Questo errore si verifica:

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. 

Tuttavia, quando uso OPENQUERY funziona:

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

Nella tabella W_PATIENT non sono presenti campi digitati "TIMESTAMP". Ha 5 campi DATETIME.

È anche importante notare che è possibile interrogare altre tabelle con valori DATETIME senza problemi. Il problema è focalizzato sulla tabella W_PATIENT.

+0

Hai provato a trasmettere [Pat_Id] a binario (8)? Questo è equivalente a TIMESTAMP e sarebbe interessante vedere se funzionasse. – ajdams

+0

Buona idea. Prima del tuo commento ho provato a trasmettere i campi DATETIME a TIMESTAMP e questo funzionava se ero collegato localmente al database Prod. Ho appena usato BINARY (8) come suggerito che ha funzionato. Speravo che colando ognuno dei DATETIME individualmente sarei stato in grado di identificare quello con dati errati, ma senza fortuna. – jacksonakj

+0

Sei sicuro che il tuo server collegato sia configurato correttamente? Cosa offre questa query: SELECT prodotto, provider FROM sys.servers WHERE name = 'Prod'; –

risposta

1

È possibile che alcuni di questi campi DATETIME presentino "voci errate", fuori intervallo ecc. Ad esempio, se uno di questi è effettivamente una stringa con un po 'di "spazzatura" all'interno? La query aperta viene eseguita sul server remoto e vengono restituiti solo i risultati; mentre con select, i dati vengono trasferiti in modo da applicare la conversione dei dati.

Vorrei prendere in considerazione alcuni dati di profilazione sulla tabella w_patient. Se si dispone di SQL Server 2008, in SSIS è presente un'attività di analisi dei dati, ma è possibile trovare anche altri strumenti per verificare la qualità dei dati.

+0

Sembra che tu sia sulla strada giusta. Sulla base del tuo commento ho provato a interrogare ogni campo DATETIME e convalidare il valore come una data. Ho usato questa query: SELECT * FROM [dbo]. [W_PATIENT] WHERE ISDATE ((CONVERT (NVARCHAR (25), [DOB], 100))) = 0 AND NOT [DOB] È NULL; Vorrei avere SQL Server 2008 per aiutare con la profilazione dei dati. Qualche suggerimento per un altro strumento? – jacksonakj

+0

Se il server collegato è SQL Server e utilizza anche DATETIME, non vedo come possano esserci "voci errate" a meno che non ci sia un qualche tipo di errore che permetta di inserire i dati non validi, o se in effetti la "tabella" su l'altra estremità è una vista che tenta di estrarre dati da un altro tipo di database. Il riferimento DBTYPE_DBTIMESTAMP indica che alcuni driver o alcune interpretazioni del tipo di dati * al di fuori di SQL Server * interferiscono qui. –

+1

Puoi provare http://datacleaner.eobjects.org/ è java quindi avrai bisogno anche del driver JDBC http://msdn.microsoft.com/en-us/data/aa937724.aspx –

Problemi correlati