Передача одной и той же функции, но выходные данные разные

#sql #sql-server

Вопрос:

Столкнувшись с проблемой @Detail при передаче значения в функции через строку ‘ABC’, получаем правильный вывод, но при передаче через переменную получаем неправильный вывод. Что я делаю не так.

  DECLARE @Detail varchar(4000)

 SELECT @Detail = detail FROM table1
 select @Detail
 
select * from dbo.SDF_SplitString(@Detail,' ',88)
 

НЕВЕРНЫЙ ВЫВОД

введите описание изображения здесь

 select * from dbo.SDF_SplitString(' 11/13/2019 12:15:0 11/13/2019 12:15:0 11/13/2019 14:30:0 BOM GOP SG  438   24A MR Kamleshwar  Prasad  4',' ',88)
 
 

ПРАВИЛЬНЫЙ ВЫВОД

введите описание изображения здесь

Комментарии:

1. Как вам удалось вставить строковый литерал в запрос 2? если вы, например, скопировали его из таблицы результатов SSMS, это могло бы изменить некоторые символы

2. Я получаю строку через select, которую я вставил во 2-й запрос, который дает правильные результаты, но при передаче ее через переменную/ или, например, выберите деталь из таблицы1, а затем получите неправильные значения

3. @AaronBertrand Мне нужен идентификатор бронирования вместе с ценностями, которые позже нам понадобятся в других вещах..

4. Пожалуйста, просто сделай, как я просил.. Запустите этот запрос вместо вашего первого и поместите вывод в вопрос: select *, ASCII(REPLACE(part, '12:15:0', '')) from dbo.SDF_SplitString(@Detail,' ',88) — я хочу посмотреть, что это за вывод

5. @AaronBertrand действительно, но когда кому-то нужна помощь такого уважаемого и уважаемого специалиста по БД, как вы (или относительно неизвестного любителя БД, как я), который занят и готов предложить помощь, разумно вежливо быстро и напрямую выполнить запрос на дополнительную информацию, чтобы помочь решить проблему.. Я просто пытался замкнуть чрезмерное «обход домов» 😀

Ответ №1:

Итак, запрос, который я вам задал, показывает, что символ между 12:15:0 11/13/2019 ними-это вкладка (символ ascii 9), а не пробел (символ ascii 32).

Вот почему вы получаете результат, который вы делаете; возможно, вам следует подумать о замене вкладок пробелами перед разделением или обновить функцию разделения, чтобы вы могли передать ей несколько символов для разделения (я предполагаю, что ' ' для этого и предназначен параметр).

Когда вы скопировали свое значение из таблицы результатов SSMS, оно уже поменяло вкладки местами (SSMS преобразовала вкладки в пробелы), поэтому, когда вы запустили его, он «выглядел правильно» при использовании жестко закодированного значения, содержащего только пробелы..

..но данные в таблице БД определенно имеют вкладки! Всегда будьте осторожны при копировании материалов из таблицы результатов SSMS; в ней удаляются символы, изменяются символы и в конце удаляются более длинные данные, поэтому нельзя гарантировать, что они будут точно отражать то, что содержится в таблице.

 select * from dbo.SDF_SplitString(REPLACE(@Detail, CHAR(9), ' '),' ',88)
 

должно дать результат, которого вы ожидаете..

Если у вас есть возможность изменить это поле, чтобы в нем не было разделенных данных, было бы безопаснее; разделение иногда может привести к непригодным результатам, если позиции изменятся