Frage

Ich liebe den neuen Datentyp DATE in SQL Server 2008, aber wenn ich ein Datumsfeld auf einem Verbindungsserver zu einem DATETIME- Feld vergleichen (SQL 2005, in diesem Fall), wie folgt aus:

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

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

Ich bekomme diese Fehlermeldung:

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

„Die Skala ist ungültig“ ist offensichtlich, weil die Mutter Client den Datentyp DATE zurück an den Verbindungsserver ist vorbei, und da es SQL 2005 ist, ist es nicht weiß, was mit ihm zu tun. Das Ausführen dieses gleiche Abfrage für eine 2008-Server funktioniert gut -. SQL Server ist in der Lage das Datum und die DATETIME- Datentypen ohne ein Problem vergleichen

Hier ist meine Frage - gibt es einen Grund, dass die Native Client nicht automatisch den DATE-Wert von ‚2009-11-09‘ konvertieren zu einem DATETIME- von ‚2009-11-09 00: 00: 00.000‘ so dass die frühere Version von SQL Server nicht daran ersticken?

War es hilfreich?

Lösung

Die interne Struktur für Datetime (2005) und Datum / Zeit / datetime2 Datetime (2008) sind sehr unterschiedlich zueinander sind, und wie bei anderen Vergleiche müssen die Daten in der gleichen Art angeordnet werden beim Vergleich. So ist der native Client, eine solche Umwandlung zu machen gezwungen werden würde.

Die native Client konnte großzügig sein und tun, um die implizite Konvertierung für Sie, sondern ebenso das ‚Element der geringsten Überraschung‘, dass die Produkte zu arbeiten neigen sollte darauf hin, dass eine Art in SQL 2005 zu werfen, dass er nicht versteht, nativ abgelehnt werden sollte . Es gibt eine Reihe von subtilen Fehler, die von diesem einen sicher einschleichen können.

Same sollte eine datetime2 werfen (7) in SQL 2005 wahr sein, erwarten wir, dass sie die 100 ns Genauigkeit abrunden wird wieder auf die 3.33ms oder werfen und Fehler - ich würde den Fehler bevorzugen und machen / akzeptieren ein explizite Umwandlung.

Andere Tipps

kann ich nur vermuten, dass dies, weil 2009-11-09 00:00:00.000 nicht zeitzonen neutral und würde Ursache für subtilere Fehler sein. Bitte korrigieren Sie mich, wenn ich falsch bin.

Sie können erreicht dies durch den Einsatz ALTE SESSION SET NLS_DATE_FORMAT = 'MM / DD / YYYY HH: MI: SS AM'; Dies ist die temproray Lösung, wenn yu arbeitet an UNIX dann könnte diese Einstellung dauerhaft in .profile erfolgen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top