Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Почему не появляется сообщение об ошибке?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3149
Есть динамический запрос, выполняется
exec(stmt);


В нем возникает ошибка
Msg 242, Level 16, State 3, Line 11
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.


на одном сервере/базе эта ошибка появляется в SSMS, на другом на восстановленной той же базе - нету
Хотя по результатам я вижу, что ошибка есть.

В чем может быть причина?
7 ноя 19, 17:40    [22011735]     Ответить | Цитировать Сообщить модератору
 Re: Почему не появляется сообщение об ошибке?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6680
форма dmy
7 ноя 19, 17:41    [22011736]     Ответить | Цитировать Сообщить модератору
 Re: Почему не появляется сообщение об ошибке?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3149
TaPaK
форма dmy



Как этот параметр установить для сервера или базы, чтобы не каждый раз устанавливать для сессии?
Такой запрос даёт ошибку на одной базе и не дает на второй

select top 10 * from list where doc_date between '2015-04-01 00:00:00.000' and '2015-05-17 23:59:00.000'
7 ноя 19, 17:55    [22011752]     Ответить | Цитировать Сообщить модератору
 Re: Почему не появляется сообщение об ошибке?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6680
Ролг Хупин
TaPaK
форма dmy



Как этот параметр установить для сервера или базы, чтобы не каждый раз устанавливать для сессии?
Такой запрос даёт ошибку на одной базе и не дает на второй

select top 10 * from list where doc_date between '2015-04-01 00:00:00.000' and '2015-05-17 23:59:00.000'

перестать хранить дату в строках
7 ноя 19, 17:57    [22011757]     Ответить | Цитировать Сообщить модератору
 Re: Почему не появляется сообщение об ошибке?  [new]
komrad
Member

Откуда: Msk -> Utrecht
Сообщений: 5035
select top 10 * from list where doc_date between '20150401 00:00:00.000' and '20150517 23:59:00.000'
7 ноя 19, 17:58    [22011763]     Ответить | Цитировать Сообщить модератору
 Re: Почему не появляется сообщение об ошибке?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29549
Ролг Хупин
Как этот параметр установить для сервера или базы, чтобы не каждый раз устанавливать для сессии?
Ни в коем случае не меняйте параметр базы, просто поправьте ошибку в коде! 22011763
7 ноя 19, 18:04    [22011786]     Ответить | Цитировать Сообщить модератору
 Re: Почему не появляется сообщение об ошибке?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6949
Ролг Хупин,

неправильно пишете.
Надо
'2015-04-01T00:00:00.000'
или
'20150401 00:00:00.000'
7 ноя 19, 18:27    [22011813]     Ответить | Цитировать Сообщить модератору
 Re: Почему не появляется сообщение об ошибке?  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 420
И на всякий случай правильное формирование динамического sql.
Главное правило передавайте параметры, не надо передавать значения как текст.

declare @StartDate datetime = '2015-04-01 00:00:00.000' 
declare @EndDate datetime = '2015-05-17 23:59:00.000'

declare @Sql nvarchar(max) = N'
    select top 10 * 
    from dbo.list 
    where doc_date between @StartDate and @EndDate
';

declare @Params nvarchar(1000) = N'
    @StartDate datetime
  , @EndDate datetime
';    

exec sys.sp_executesql 
        @Sql
      , @Params
      , @StartDate = @StartDate
      , @EndDate = @EndDate;


Можно оформить это в и виде процедуры.
7 ноя 19, 21:52    [22011937]     Ответить | Цитировать Сообщить модератору
 Re: Почему не появляется сообщение об ошибке?  [new]
komrad
Member

Откуда: Msk -> Utrecht
Сообщений: 5035
Владимир Затуливетер,

использовать формат yyyymmdd hh:mm:ss - безпроигрышный вариант
7 ноя 19, 23:08    [22011965]     Ответить | Цитировать Сообщить модератору
 Re: Почему не появляется сообщение об ошибке?  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 420
komrad,

Да, но есть еще sql injections от которых тоже было бы не плохо защититься.
+ экономное кеширование планов в случае использования динамического sql с параметрами (не будет создаваться новый план на каждое новое значение параметров).
Также могут возникнуть проблемы с другими типами, например с числами с плавающей точкой.
Ну и последнее, строки, они тоже могут содержать не пойми что, как их экранировать без параметров...

В общем при использовании параметров проблем значительно меньше. Поэтому я и привел пример как делать правильно специально для людей которые сюда заглянут по схожим проблемам.

PS: Мне если честно сложно представить кто в enterprise коде будет использовать динамический sql без параметров, для поделок студента такое еще пойдет, ну и для мазахистов... Картинка с другого сайта.
8 ноя 19, 09:30    [22012096]     Ответить | Цитировать Сообщить модератору
 Re: Почему не появляется сообщение об ошибке?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29549
Владимир Затуливетер
Мне если честно сложно представить кто в enterprise коде будет использовать динамический sql без параметров,
В энтерпрайзе это как раз легко представить :-)
Куча непонятно кем написанных приложений, с сомнительными исходниками, или вообще без таковых, обслуживаемые по принципу чёрного ящика, "сбойнуло - восстановили из бакапа"...
8 ноя 19, 09:40    [22012106]     Ответить | Цитировать Сообщить модератору
 Re: Почему не появляется сообщение об ошибке?  [new]
komrad
Member

Откуда: Msk -> Utrecht
Сообщений: 5035
Владимир Затуливетер

В общем при использовании параметров проблем значительно меньше. Поэтому я и привел пример как делать правильно специально для людей которые сюда заглянут по схожим проблемам.
Картинка с другого сайта.


я не против параметров, я про формат даты писал
8 ноя 19, 11:01    [22012162]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить