2009-06-19 11 views
4

Einer unserer Benutzer hat eine Insert-Anweisung im Entwicklungsserver ausgeführt. Der Einsatz hat gut funktioniert. Wenn jedoch die gleiche Insert-Anweisung in Produktionsserver ausgeführt wird, begegnet er den Fehler unten:Fehler beim Ausführen der TSQL-Einfügeanweisung

Error:.Net SqlClient Data Provider Error Message: The conversion of char data type to a datetime data type resulted in an out-of-range datetime value. The statement has been terminated.

Die Insert-Anweisung ist unter:

Insert into tbl_SeatWave_customers (Title 
            ,FirstName 
            ,Lastname 
            ,EmailAddress 
            ,HomeTelephone 
            ,Address1 
            ,Address2 
            ,Address3 
            ,Town 
            ,County 
            ,Postcode 
            ,BuyerOrSeller 
            ,OrderID 
            ,ListingID 
            ,BestCallDateTimeFrom 
            ,bestcalldatetimeto 
            ,FAQAsked 
            ,Comments 
            ,CallOutcome 
            ,Spare1 
            ,Spare2 
            ) 
Values('Mr' 
     ,'Darren' 
     ,'Piper' 
     ,'[email protected]' 
     ,'07825758328' 
     ,'7 RUSSELL ROAD' 
     ,'' 
     ,'' 
     ,'' 
     ,'CLWYD' 
     ,'LL18 3BS' 
     ,'Other' 
     ,'' 
     ,'19/06/2009' 
     ,'12:00' 
     ,'' 
     ,'Callers tickets have not yet arrived.' 
     ,'Resolved' 
     ,'Yes' 
     ,'' 
    ) 

Die Tabelle tbl_SeatWave_customers hat die folgende Struktur:

COLUMN_NAME   DATA_TYPE COLUMN_DEFAULT 
NUID     bigint NULL 
CallDateTime   datetime (getdate()) 
Title     nvarchar NULL 
FirstName    nvarchar NULL 
LastName    nvarchar NULL 
EmailAddress   nvarchar NULL 
HomeTelephone   nvarchar NULL 
MobileTelephone  nvarchar NULL 
WorkTelephone   nvarchar NULL 
Address1    nvarchar NULL 
Address2    nvarchar NULL 
Address3    nvarchar NULL 
Address4    nvarchar NULL 
Town     nvarchar NULL 
County    nvarchar NULL 
Postcode    nvarchar NULL 
BuyerOrSeller   nvarchar NULL 
OrderID    nvarchar NULL 
ListingID    nvarchar NULL 
BestCallDateTimeFrom datetime NULL 
BestCallDateTimeTo datetime NULL 
FAQAsked    nvarchar NULL 
Comments    nvarchar NULL 
Spare1    nvarchar NULL 
Spare2    nvarchar NULL 
Spare3    nvarchar NULL 
Spare4    nvarchar NULL 
Spare5    nvarchar NULL 
CallOutcome   nvarchar NULL 

Meine Frage, was ist die Ursache für diesen Fehler und was ist die Lösung, um es zu beheben?

Antwort

0

Ihr Datumsliteral '19/06/2009' als Stil 101, USA, mm/tt/oder Stil 103, British/Französisch, TT/MM/interpretiert werden JJJJ. 19 ist kein gültiger "numerischer Monat", also bin ich der Meinung, dass Ihr Entwicklungsserver auf british/french (19/06/2009 => Fr, 19 Jun 2009) und Ihr Produktionsserver auf u.s. Stile/Formate (19.06.2009 => Fehler).

http://msdn.microsoft.com/en-us/library/ms180878.aspx#UsingDateandTimeFormats sagt:

String literal formats affect the presentation of data in applications to users but not the underlying integer storage format in SQL Server. However, SQL Server might interpret a date value in a string literal format, input by an application or user for storage or to a date function, as different dates. The interpretation depends on the combination of string literal format, data type, and runtime SET DATEFORMAT, SET LANGUAGE and default language option settings.
und
We recommend that you use date-time formats that are not DATEFORMAT dependent and are multilanguage. The ISO 8601 formats, '1998-02-23T14:23:05' and '1998-02-23T14:23:05-08:00' are the only formats that are an international standard. They are not DATEFORMAT or default login language dependent and are multilanguage.

+0

Wir haben die Anmeldungen Standardsprache Englisch in britischem Englisch geändert und nicht mehr die Insert-Anweisung ausgeführt wird wirft einen Fehler. Ihre Antwort/erraten ziemlich genau die Frage. Ihre Antwort/Vermutung wurde durch Ihr Zitat von MSDN, das ein guter Punkte zu folgen ist, noch verstärkt. Vielen Dank. – titanium

3

Meine Vermutung wäre, entweder Internationalisierung (19/06/2009 vs 06/19/2009 vs 2009 06 19 aus der Maschine des Kunden kommen und/oder dem Server konfiguriert anders - Hinweis, ein recht häufiges Layout ‚2009.06.19‘ wäre), oder einfach, dass Sie habe das Datum vielleicht falsch benutzt, und es ist jetzt nach dem 12. - also vorher dachte es war der 6.10., 6.11., 6.12., Boom.

Natürlich, wenn Sie Parameter (statt Strings) verwenden, haben Sie dieses Problem nicht. Dito mit Dezimalzahlen - ist 123,456 das gleiche wie 123456? oder 123 und fast die Hälfte?

2

Das Problem ist mit `` 19/06/2009 'which is specified in DD/MM/JJJJ but your SQL Server instance expects it as MM/DD/YYYY`.