Domanda

Mi piace il nuovo tipo di dati DATE in SQL Server 2008, ma quando ho confrontare un campo data per un campo datetime in un server collegato (SQL 2005, in questo caso), in questo modo:

DECLARE @MyDate DATE
SET @MyDate = CONVERT(DATE, GETDATE())

SELECT *
  FROM MySQL2005LinkedServer.SomeDB.dbo.SomeTable
 WHERE SomeDatetimeField < @MyDate

ottengo questo errore:

OLE DB provider "SQLNCLI10" returned message "Unspecified error".
OLE DB provider "SQLNCLI10" returned message "The scale is invalid.".

"La scala non è valido" è, ovviamente, perché il cliente nativo sta passando il tipo di dati risalgono al server collegato, e dal momento che è SQL 2005, che non sa cosa fare con esso. L'esecuzione di questo stesso query su un assistente 2008 funziona bene -. SQL Server è in grado di confrontare la data e DATETIME tipi di dati senza un problema

Ecco la mia domanda - c'è una ragione che il Native Client non converte automaticamente il valore della data di '2009-11-09' a un DATETIME di '2009-11-09 00: 00: 00.000' in modo che la versione precedente di SQL Server non soffocare su di esso?

È stato utile?

Soluzione

La struttura interna per datetime (2005) e data / ora / datetime2 datetimeoffset (2008) sono molto diversi tra loro, e, come con altri confronti dei dati deve essere posizionato nello stesso tipo quando si confrontano. Quindi il client nativo sarebbe costretto a fare una tale conversione.

Il client nativo potrebbe essere generosi e fare la conversione implicita per voi, ma ugualmente l' 'elemento di minima sorpresa' che i prodotti tendono a lavorare a dovrebbe suggerire che lanciando un tipo a SQL 2005 che non nativamente capire dovrebbe essere respinta . Ci sono una serie di errori sottili che può scivolare in da quella di sicuro.

stesso dovrebbe valere di gettare una datetime2 (7) a SQL 2005, ci aspettiamo che possa arrotondare la precisione 100ns indietro ai 3.33ms o gettare ed errori - preferisco l'errore ed effettuare / accettare un esplicito cast.

Altri suggerimenti

Posso solo immaginare che questo è perché non è 2009-11-09 00:00:00.000 fuso orario neutro e sarebbe causa di bug più sottili. Si prega di correggermi se sbaglio.

È possibile raggiunto questo utilizzando ALTER SESSION SET NLS_DATE_FORMAT = 'MM / DD / YYYY HH: MI: SS AM'; Questa è la soluzione temproray, se yu stanno lavorando su UNIX allora queste impostazioni potrebbe essere fatto in modo permanente in .profile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top