Question

J'adore la nouvelle date dans SQL Server datatype 2008, mais quand je compare un champ à un champ DATE DATETIME sur un serveur lié (SQL 2005, dans ce cas), comme ceci:

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

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

Je reçois cette erreur:

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

« L'échelle est non valide » est évidemment parce que le client natif passe le type de données DATE sur le serveur lié, et comme il est SQL 2005, il ne sait pas quoi faire avec elle. L'exécution de cette même requête sur un serveur 2008 fonctionne très bien -. Serveur SQL est capable de comparer la date et DATETIME sans problème des types de données

Voici ma question - est-il une raison que le Native Client ne convertit pas automatiquement la valeur de DATE « 2009-11-09 » à un DATETIME de « 2009-11-09 00: 00: 00.000 » de sorte que la version précédente de SQL Server ne s'étouffer?

Était-ce utile?

La solution

La structure interne pour datetime (2005) et la date / heure / datetime2 datetimeoffset (2008) sont très différents les uns des autres, et comme d'autres comparaisons les données doivent être placées dans le même type lorsque l'on compare. Ainsi, le client natif serait forcé de faire une telle conversion.

pourrait être généreux et faire la conversion implicite pour vous, mais aussi « l'élément de moindre surprise » que les produits ont tendance à travailler à devrait suggérer que jeter un type à SQL 2005 qu'il ne comprend pas nativement doit être rejeté le client natif . Il y a un certain nombre d'erreurs subtiles qui peuvent glisser de celui-là pour vous.

Il devrait en être vrai de jeter un datetime2 (7) à SQL 2005, nous ne prévoyons qu'il complètera la précision de 100ns retour aux 3.33ms ou jeter et erreur - je préférerais l'erreur et faire / accepter une transtypage explicite.

Autres conseils

Je ne peux que deviner que ce soit parce que 2009-11-09 00:00:00.000 est pas le temps zone neutre et serait la cause de bugs plus subtils. S'il vous plaît me corriger si je me trompe.

Vous pouvez atteindre cela en utilisant SESSION SET ALTER NLS_DATE_FORMAT = 'JJ / MM / AAAA HH: MI: SS AM'; Ceci est la solution temproray Si yu travaillent sous UNIX alors ces paramètres pourrait être fait en permanence dans .profile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top