#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)
должно дать результат, которого вы ожидаете..
Если у вас есть возможность изменить это поле, чтобы в нем не было разделенных данных, было бы безопаснее; разделение иногда может привести к непригодным результатам, если позиции изменятся