Ошибка преобразования при преобразовании значения varchar '28, 29,30,31,32 'в тип данных smallint - PullRequest
0 голосов
/ 24 октября 2019

Попытка сделать несколько пользовательских дампов в CSV-файлы для системы контроля доступа клиента, возникла проблема с назначением строки переменной.

Каждый бейдж-ридер будет чем-то похожим на машину 1-20 и ридер1-20, так что, по сути, я мог бы делать все это с помощью или утверждений, но мне нужно было бы 1 для каждого читателя.

Я думаю, что я знаю проблемы, и у меня возникают проблемы с распознаванием различных чисел через запятую и попыткойперерабатывать. Он отлично работает, когда я изменяю его на отдельные переменные.

Declare @Panels as varchar;
Declare @Readers as varchar;

Set @Panels = ('28,39,30,31,32')
Set @Readers = ('1,2,3,4,5,6')

SELECT READER.READERDESC, EVENTS.CARDNUM, EVENT.EVDESCR, EVENTS.EVENT_TIME_UTC
FROM EMP
INNER JOIN EVENTS ON EMP.ID = EVENTS.EMPID 
INNER JOIN EVENT
   ON EVENTS.EVENTTYPE = EVENT.EVTYPEID 
   AND EVENTS.EVENTID = EVENT.EVID 
INNER JOIN READER
   ON EVENTS.MACHINE = READER.PANELID 
   AND EVENTS.DEVID = READER.READERID
WHERE EVENT_TIME_UTC >= DATEADD (DAY, -1, (CONVERT (date, GETDATE())))
   AND EVENT_TIME_UTC <= CONVERT (date, GETDATE())
   AND (MACHINE = @Panels AND DEVID = @Readers)

Сообщение 245, Уровень 16, Состояние 1, Строка 4 Преобразование не удалось при преобразовании значения varchar '1,2,3,4,5,6 'для типа данных int.

1 Ответ

0 голосов
/ 24 октября 2019

Во-первых, в SQL Server ваш код не будет генерировать эту ошибку.

Этот код:

Declare @Panels as varchar;
Declare @Readers as varchar;

Set @Panels = ('28,39,30,31,32')
Set @Readers = ('1,2,3,4,5,6')

присваивает значения '2' и '1' переменным соответственно. Почему? Поскольку при объявлении строки вам нужна длина .

Во-вторых, строки - это строки, и они сравниваются во всей их полноте. Этот код:

MACHINE = @Panels

говорит: «Я сравниваю целое число со строкой. Они не одного типа, поэтому я бы лучше преобразовал. Позвольте мне проверить. О, правила говорят, чтобы преобразовать строкув целое число. Ой, не могу этого сделать. ОШИБКА! ".

Вы, похоже, хотите разбить строку. Вы бы сделали это следующим образом:

MACHINE IN (SELECT * FROM SPLIT(@Panels, ',') s)

Это все еще имеет неявное преобразование типов, но обычно это будет работать. В производственном коде я был бы более педантичным:

MACHINE IN (SELECT TRY_CONVERT(INT, VALUE) FROM SPLIT(@Panels, ',') s)
...