Pergunta

Eu amo o novo tipo de dados DATE no SQL Server 2008, mas quando eu comparar um campo de data para um campo DATETIME em um servidor vinculado (SQL 2005, neste caso), como este:

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

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

Eu recebo este erro:

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

"A escala é inválido" é, obviamente, porque o cliente nativo está passando o tipo de dados de volta data para o servidor ligado, e uma vez que o SQL 2005, ele não sabe o que fazer com ele. Correndo essa mesma consulta contra um server 2008 funciona muito bem -. SQL Server é capaz de comparar a data ea tipos de dados DATETIME sem problemas

Aqui está a minha pergunta - há uma razão que o Native Client não converte automaticamente o valor da data de '2009-11-09' para uma data e hora de '2009-11-09 00: 00: 00.000' de modo que a versão anterior do SQL Server não irá sufocá-lo?

Foi útil?

Solução

A estrutura interna de data e hora (2005) e a data / hora / datetime2 datetimeoffset (2008) são muito diferentes uns dos outros, e como com outras comparações dos dados deve ser colocado no mesmo tipo quando se comparam. Assim, o cliente nativo seria forçado a fazer uma tal conversão.

O cliente nativo poderia ser generoso e fazer a conversão implícita para você, mas igualmente o 'elemento da menor surpresa' que os produtos tendem a trabalho a deve sugerir que jogando um tipo de SQL 2005 que não nativamente entender deve ser rejeitado . Há uma série de erros sutis que podem deslizar em de que uma certeza.

O mesmo deve ser verdade de jogar uma datetime2 (7) no SQL 2005, que esperamos que ele vai terminar a volta 100ns precisão aos 3.33ms ou jogar e erro - Eu prefiro o erro e marca / aceitar um conversão explícita.

Outras dicas

Eu posso apenas imaginar que isso é porque 2009-11-09 00:00:00.000 não é tempo-zona neutra e seria motivo de bugs mais sutis. Por favor me corrijam se eu estiver errado.

Você pode conseguido isso usando ALTER SESSÃO SET NLS_DATE_FORMAT = 'MM / DD / AAAA HH: MI: SS AM'; Esta é a solução temproray, se yu estão trabalhando em UNIX, então estes ajuste poderia ser feito permanentemente no .profile.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top