2009-06-19 2 views
4

Один из наших пользователей сделал инструкцию insert в сервере разработки. Вставка работала нормально. Однако, когда тот же оператор вставки выполняется в производственном сервере, он столкнулся с ошибкой ниже:Ошибка при выполнении инструкции TSQL insert

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.

Оператор вставки ниже:

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' 
     ,'' 
    ) 

В tbl_SeatWave_customers таблица имеет следующую структуру:

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 

На мой вопрос, в чем причина этой ошибки и каково разрешение ее исправить?

ответ

0

Вашей дату буквальный '19/06/2009' может быть истолкована как стиль 101, США, мм/дд/гггг или стиль 103, британские/французским, дд/мм/гггг. 19 не является допустимым «числовым месяцем», поэтому я предполагаю, что ваш сервер разработки настроен на британский/французский (19/06/2009 => Fri, 19 июня 2009 г.) и ваш производственный сервер на u.s. стилей/форматов (19/06/2009 => ошибка).

http://msdn.microsoft.com/en-us/library/ms180878.aspx#UsingDateandTimeFormats говорит:

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.
и
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

Мы изменили язык логины по умолчанию с английского на британском английском и работает оператор вставки больше не выдает сообщение об ошибке. Ваш ответ или предположение в значительной степени отвечают на вопрос. Ваш ответ/предположение еще больше подкреплялось вашей цитатой из MSDN, что является хорошим моментом для следования. Благодарю. – titanium

3

Мое предположение было бы либо интернационализация (19/06/2009 против 06/19/2009 против 2009 06 19 идет от машины клиента и/или сервера настроены по-разному - намек, довольно распространенный макет будет «2009/06/19»), или просто, что вы возможно, использовали дату неправильно, и сейчас прошло 12-е - т.е. ранее считалось, что это был 6 октября, 6 ноября, 6 декабря, бум.

Конечно, если вы используете параметры (вместо строк), у вас нет этой проблемы. То же с десятичными знаками - это 123,456 так же, как 123456? или 123 и почти половину?

2

Проблема с `` 19/06/2009 'which is specified in DD/MM/YYYY but your SQL Server instance expects it as MM/DD/YYYY`.

2

DateFormats mm/dd/yyyy versus dd/mm/yyyy зависит от настроек языка для входа в систему, который используется для подключения к серверу. Читайте здесь больше:

Setting a standard Date Format for SQL Server

Смежные вопросы