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

Откуда: Msk
Сообщений: 582
Из-за этой ошибки не выполняется запрос.
Сообщение 8115, уровень 16, состояние 2, строка 1
Ошибка арифметического переполнения при преобразовании expression к типу данных datetime.

Как скорректировать CONVERT(VARCHAR, @date_trn, 112) чтобы всё было ок?

declare @date_trn datetime
set @date_trn='23.01.2012'

DECLARE @SQL varchar(8000)--, @table_name varchar(10)
SET @SQL = 'SELECT d.ID_DOC,
       d.KINDDOC,
       d.NUM_DOC,
       d.DATE_DOC,
       d.STRACCOUNT_DB,
       d.STRACCOUNT_CR,
       d.DATE_TRN,
       d.OBOROT_DB,
       CASE
          WHEN d.paym_locate = 0 THEN ''Внутренний''
          WHEN d.paym_locate = 1 THEN ''Исходящий''
          ELSE ''Входящий''
       END
          AS paym_locate,
       svn.get_oi_account (d.ID_ACCOUNT_db) AS oi_db,
       svn.get_oi_account (d.ID_ACCOUNT_cr) AS oi_cr
  FROM OD_DOC_0 d WHERE d.DATE_TRN = ' + CONVERT(VARCHAR, @date_trn, 112)  + 'AND d.exec_trn = 1 AND d.paym_locate = 2'

exec(@SQL)
30 мар 12, 09:04    [12337755]     Ответить | Цитировать Сообщить модератору
 Re: Арифметическое переполнение портит всю картину  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
NewIvanovec,

set dateformat mdy
declare @date_trn datetime
set @date_trn='23.01.2012'
print @date_trn
set dateformat dmy
set @date_trn='23.01.2012'
print @date_trn

-- ипользуйте формат, который не зависит от установленного формата:
set @date_trn='20120123'
30 мар 12, 09:10    [12337781]     Ответить | Цитировать Сообщить модератору
 Re: Арифметическое переполнение портит всю картину  [new]
NewIvanovec
Member

Откуда: Msk
Сообщений: 582
SomewhereSomehow,
осталась ошибка.

Сообщение 242, уровень 16, состояние 3, строка 3
Преобразование типа данных char в тип данных datetime привело к значению datetime за пределами диапазона.

янв 23 2012 12:00AM
Сообщение 241, уровень 16, состояние 1, строка 13
Ошибка преобразования datetime из символьной строки.

set dateformat mdy
declare @date_trn datetime
set @date_trn='23.01.2012'
print @date_trn
set dateformat dmy
set @date_trn='23.01.2012'
print @date_trn

-- ипользуйте формат, который не зависит от установленного формата:
set @date_trn='20120123'

DECLARE @SQL varchar(8000)--, @table_name varchar(10)
SET @SQL = 'SELECT d.ID_DOC,
       d.KINDDOC,
       d.NUM_DOC,
       d.DATE_DOC,
       d.STRACCOUNT_DB,
       d.STRACCOUNT_CR,
       d.DATE_TRN,
       d.OBOROT_DB,
       CASE
          WHEN d.paym_locate = 0 THEN ''Внутренний''
          WHEN d.paym_locate = 1 THEN ''Исходящий''
          ELSE ''Входящий''
       END
          AS paym_locate,
       svn.get_oi_account (d.ID_ACCOUNT_db) AS oi_db,
       svn.get_oi_account (d.ID_ACCOUNT_cr) AS oi_cr
  FROM OD_DOC_0 d WHERE d.DATE_TRN = ' + @date_trn  + 'AND d.exec_trn = 1 AND d.paym_locate = 2'

exec(@SQL)
30 мар 12, 09:20    [12337824]     Ответить | Цитировать Сообщить модератору
 Re: Арифметическое переполнение портит всю картину  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
NewIvanovec,

Ну, продолжайте бездумно копипастить...
кроме того, перед выполнением, рекомендую exec заменить на print и посмотреть, чтож вы в итоге собрали.
30 мар 12, 09:24    [12337852]     Ответить | Цитировать Сообщить модератору
 Re: Арифметическое переполнение портит всю картину  [new]
Referee
Member

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

подозреваю что не хватает кавычек
30 мар 12, 09:42    [12337947]     Ответить | Цитировать Сообщить модератору
 Re: Арифметическое переполнение портит всю картину  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
Да и dsql там не нужен, а если уж хочется то sp_executesql с типизированными параметрами.
30 мар 12, 09:49    [12338001]     Ответить | Цитировать Сообщить модератору
 Re: Арифметическое переполнение портит всю картину  [new]
NewIvanovec
Member

Откуда: Msk
Сообщений: 582
DECLARE @SQL varchar(8000)
SET @SQL = 'SELECT d.ID_DOC,
       d.KINDDOC,
       d.NUM_DOC,
       d.DATE_DOC,
       d.STRACCOUNT_DB,
       d.STRACCOUNT_CR,
       d.DATE_TRN,
       d.OBOROT_DB,
       CASE
          WHEN d.paym_locate = 0 THEN ''Внутренний''
          WHEN d.paym_locate = 1 THEN ''Исходящий''
          ELSE ''Входящий''
       END
          AS paym_locate,
       svn.get_oi_account (d.ID_ACCOUNT_db) AS oi_db,
       svn.get_oi_account (d.ID_ACCOUNT_cr) AS oi_cr
  FROM OD_DOC_0 d WHERE d.DATE_TRN = ' +  '20122301'  + ' AND d.exec_trn = 1 AND d.paym_locate = 2'

--exec(@SQL)

print(@SQL)


Сообщение 8115, уровень 16, состояние 2, строка 1
Ошибка арифметического переполнения при преобразовании expression к типу данных datetime.
30 мар 12, 09:55    [12338045]     Ответить | Цитировать Сообщить модератору
 Re: Арифметическое переполнение портит всю картину  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
NewIvanovec,

Ну, и что вам вывел принт, скопируйте запрос, в окно студии и посмотрите внимательно, нигде ничего не забыли поставить?
30 мар 12, 10:04    [12338117]     Ответить | Цитировать Сообщить модератору
 Re: Арифметическое переполнение портит всю картину  [new]
NewIvanovec
Member

Откуда: Msk
Сообщений: 582
Ken@t,
Спасибо за идею. Воспользовался sp_executesql

DECLARE @date_trn   DATETIME;
DECLARE @SQLString   NVARCHAR (500);
DECLARE @ParmDefinition   NVARCHAR (500);
/* Build the SQL string one time.*/
SET @SQLString =
       N'SELECT d.ID_DOC,
       d.KINDDOC,
       d.NUM_DOC,
       d.DATE_DOC,
       d.STRACCOUNT_DB,
       d.STRACCOUNT_CR,
       d.DATE_TRN,
       d.OBOROT_DB,
       CASE
          WHEN d.paym_locate = 0 THEN ''Внутренний''
          WHEN d.paym_locate = 1 THEN ''Исходящий''
          ELSE ''Входящий''
       END
          AS paym_locate,
       svn.get_oi_account (d.ID_ACCOUNT_db) AS oi_db,
       svn.get_oi_account (d.ID_ACCOUNT_cr) AS oi_cr
  FROM OD_DOC_0 d WHERE d.DATE_TRN = @date  AND d.exec_trn = 1 AND d.paym_locate = 2';
PRINT @sqlstring

SET @ParmDefinition = N'@date datetime';
SET @date_trn = '23.01.2012';
EXECUTE sp_executesql @SQLString, @ParmDefinition, @date = @date_trn ;
30 мар 12, 10:10    [12338166]     Ответить | Цитировать Сообщить модератору
 Re: Арифметическое переполнение портит всю картину  [new]
NewIvanovec
Member

Откуда: Msk
Сообщений: 582
SomewhereSomehow
NewIvanovec,

Ну, и что вам вывел принт, скопируйте запрос, в окно студии и посмотрите внимательно, нигде ничего не забыли поставить?


! Большое спасибо за инструмент принт!
30 мар 12, 10:14    [12338192]     Ответить | Цитировать Сообщить модератору
 Re: Арифметическое переполнение портит всю картину  [new]
NewIvanovec
Member

Откуда: Msk
Сообщений: 582
Referee
NewIvanovec,

подозреваю что не хватает кавычек

Так и было. Спасибо.
30 мар 12, 10:15    [12338198]     Ответить | Цитировать Сообщить модератору
 Re: Арифметическое переполнение портит всю картину  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
NewIvanovec,

А динамический sql у вас накой ?
30 мар 12, 11:17    [12338771]     Ответить | Цитировать Сообщить модератору
 Re: Арифметическое переполнение портит всю картину  [new]
NewIvanovec
Member

Откуда: Msk
Сообщений: 582
Ken@t
NewIvanovec,

А динамический sql у вас накой ?


В примере потребность динамического запроса не видна.
А вот в БД у меня есть процедура. В зависимости от входного параметра выполняется свой запрос.
Все запросы на 80% похожи. Чтобы не городить кучу одинакового кода я пошел по пути динамического запроса.
2 апр 12, 07:57    [12348764]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить