Perché non SQL Server automaticamente-convert DATE per DATETIME ai fini del confronto?
-
19-09-2019 - |
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?
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.