Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
alexxUK Member Откуда: Украина Сообщений: 81 |
День добрый, тема является некоторым продолжением предыдущей, но вопрос немного в другом. Оригинальная тема была вот здесь: https://www.sql.ru/forum/1023241-1/replace-substring-c-pomoshhu-regex-shablona-dlya-mssql Итак, если кратко - есть какие-то данные в таблице пользователя, по ответам. Мне нужно собрать эти данные и правильно из обработать. На выходе должен получиться файл состояший из значений разделенных запятой, в конце каждой автономной записи должна стоять запятая и должен стоять символ перехода строки. запрос выглядит вот так: CREATE FUNCTION [dbo].[getTotalResponsesBySurveyId_FTable] ( @surveyId nvarchar(20) ) RETURNS TABLE AS RETURN ( Select dbo.RegExReplace( (Select ISNULL(ST1.QuestionResponse, '') + ',' AS [text()] From [dbo].[SurveyAnswers] ST1 Where ST1.SysParticipantID = ST2.SysParticipantID AND ST1.SurveyID = @surveyId -- AND ST1.PageNumber <= 7 Order by ST1.QuestionNumber For XML PATH ('') ), 'TRUE', 'FALSE') + ',' + CHAR(10) [Response] From (select distinct SysParticipantID from [dbo].[SurveyAnswers] Where SurveyID=@surveyId) ST2 ) вызов данного запроса select * from dbo.getTotalResponsesBySurveyId_FTable('Test1') Собрали данные - начали результат работы запроса импортировать в csv (в окне вывода выбираю сохранить как ...) - в итоге кое-какие данные показывают глупость = часть данных или пропала (строка прерывается), или шаблон не применился (или данные расположены на нескольких строках, хотя в ответах такого не должно быть, данные должны выводиться на одной строке). Пытаюсь разобраться в чем причина. то есть например: данные собранные след запросом: Select ISNULL(ST1.QuestionResponse, '') + ',' AS [text()] From [dbo].[SurveyAnswers] ST1 Where ST1.SurveyID = 'test1' AND ST1.PageNumber <= 7 AND ST1.SysParticipantID = 90 Order by ST1.QuestionNumber For XML PATH ('') будут давать один ответ респондента -такую строку (сырые данные), (см прикрепленный файл) в которой видно - что после 066-R04-05 разбито на 2 строки - в итоге мое регулярное выражение останавливает работу там и не показывает остальной хвост ответов, или же не применяет шаблон .... то есть аналогичный вызов моей функции в данном случае: Declare @surveyData Nvarchar(max) Declare @surveyId Nvarchar(10) Declare @participantId int Set @surveyId = 'Test1' Set @participantId = 90 -- get current modified text information from database SET @surveyData = (SELECT dbo.RegExReplace( (Select ISNULL(ST1.QuestionResponse, '') + ',' AS [text()] From [dbo].[SurveyAnswers] ST1 Where ST1.SysParticipantID = ST2.SysParticipantID AND ST1.SurveyID = @surveyId Order by ST1.QuestionNumber For XML PATH ('') ), 'TRUE', 'FALSE') + ',' + CHAR(10) [Response] From (select distinct SysParticipantID from [dbo].[SurveyAnswers] Where SurveyID=@surveyId AND SysParticipantID = @participantId) ST2 ) Print @surveyData дает вот такие результаты (строка оканчивается именно частью 066-R0), хотя после нее еще идут данные: Test1 User,Test Collections/Customer Service,Test Services,Indianapolis,IN,USA,5,No,,Female,1900,White,Test Collections,1,Yes,Do not know,Collections,Test and Dark Facility,5,No,,No,,No,,Unsure,Yes,Yes,04,03,No,Yes,02,03,Yes,Yes,04,04,Yes,Yes,04,02,No,Yes,03,02,No,No,04,05,Yes,Yes,04,04,Yes,Yes,05,05,Yes,Yes,05,05,Yes,Yes,05,05,No,No,02,03,Yes,Yes,04,03,Yes,Yes,05,05,Yes,Yes,05,05,No,Yes,03,02,No,No,02,02,Yes,Yes,03,03,No,No,03,03,Yes,No,03,03,No,No,04,04,Yes,Yes,05,05,Yes,No,04,04,Yes,Yes,04,05,Yes,Yes,04,04,Yes,Yes,04,04,Yes,No,04,03,Yes,Yes,05,05,No,Yes,02,02,No,Yes,04,04,No,Yes,04,04,Yes,Yes,05,05,No,Yes,04,04,No,Yes,03,03,No,Yes,03,03,No,Yes,03,02,Yes,Yes,05,05,No,No,02,02,Yes,Yes,05,05,Yes,Yes,05,05,066-R0, Почему происходит такая ситуация - я не могу понять... (ведь если в примере убрать пробелы в сыром выводе стравить результат в функцию - то на выходе получаем абсолютно правильный результат (проверял в консольном приложении)) Мои вопросы - проблемы: 1) не могу понять - это строка ломается при моем сохранении в файл таким способом, или что происходит? 2) Можно ли сделать так - что вывод строки результата будет всегда на одной строке, без разбивок (чтобы результат приходящий в тело функции давай правиольный ответ, без обрезов строк)? 3) что я делаю(сохраняю, или выполняю запрос) не так? 4) Есть ли какие-то ограничения по длине выводимой строки в SQL? К сообщению приложен файл (UAT_Testsamples_FTable_SSPI-90_7pages_forVS.txt - 2Kb) cкачать ![]() |
21 май 13, 12:08 [14325648] Ответить | Цитировать Сообщить модератору |
alexxUK Member Откуда: Украина Сообщений: 81 |
на самом деле - если моя функция так ломает данные - значит на вход ее приходит уже поломанная строка, ведь, как уже говоирил, если в сырых данных поубирать пробелы - и сделать ее одной строкой - то функция вернет то, что от нее ожидается. В чем может быть моя ошибка передачи таких данных? |
21 май 13, 12:12 [14325705] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9646 |
В сиквеле: set textsize. В SSMS: Tools -> Options -> Query Results -> Results to Grid -> Maximum Characters Retrieved. |
||
21 май 13, 12:43 [14326007] Ответить | Цитировать Сообщить модератору |
alexxUK Member Откуда: Украина Сообщений: 81 |
да, спасибо за идею - уже проверил, хотел вот отписаться - на noXml дата стоит = 65536 на xmlData - 2mb у меня пример данных одного кандадита - порядка 2-3кb просмотрел данные для вывода в ворде - каждый ответ имеет в среднем вот такую длину: (без пробелов, с пробелами ): 752/769 741/761 736/753 742/753. то есть в среднем все строки обрезаются и переносятся при определенной длине. Что делать, не пойму никак. Обновил regex функцию для работы с multiline - но она все равно ключит на месте 066-R04 ... - видимо потому что данные разнесены - остальное подхватило. |
||||
21 май 13, 12:52 [14326103] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
Можно в CLR-функции удалять из исходной строки символы переноса, и уже к преобразованной строке применять регулярку. |
||
21 май 13, 12:57 [14326169] Ответить | Цитировать Сообщить модератору |
alexxUK Member Откуда: Украина Сообщений: 81 |
да, именно так придется и поступить - с какого-то не понятного мне перепуга MSSQL ставит CL CR в конце строки (в районе 2000 символа) - можно увидеть в аттаче. Для каждой записи, поскольку ответы разной длины - это деление происходит в разном месте ... - поскольку строка парсится отдельно - то перенесенный ответ не обрабатывается корректно ... Если не получится никак сделать в MSSQL - буду явно удалять уже последствия в С# - но хочется ж вырезать это из процедуры (или понять, почему это так и почему не надо обновлять, а оставить на откуп уже C#) :). |
||||
21 май 13, 13:10 [14326302] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
Ну нет. MSSQL никаких CR LF сам по себе не ставит. Ставит кто-то другой, например, клиентское приложение, которое вставляет данные в эту таблицу. |
||
21 май 13, 13:20 [14326377] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Откуда на Украйне Индианаполис? Вот и фсе неправильно... |
21 май 13, 14:53 [14327109] Ответить | Цитировать Сообщить модератору |
alexxUK Member Откуда: Украина Сообщений: 81 |
да, скорее всего так и было. Обновил функцию С# - вроде работает нормально. Всем спасибо за идеи ). |
||||
21 май 13, 14:53 [14327110] Ответить | Цитировать Сообщить модератору |
Между сообщениями интервал более 1 года. |
Борис А Member Откуда: Сообщений: 2 |
Возможно мой случай кому-то будет полезен. Искал решение аналогичной проблемы. Этот пост натолкнул на мысль, что режет не запрос c указанем for xml path(''), а клиентское приложение. Работаю в SQL Server Managment Studio (SSMS). У меня пользовательская функция dbo.f_function формирует из списка строку: set @Formula = isnull((select CODE+',' from dbo.DBASE_VIEW where ID= @ID and ID_TIPIPARTE=12 for xml path('')), 'НЕТ КОДА') RETURN @Formula А при обращении к этой функции: cast(dbo.f_function(ID) as varchar) результат обрезался к 30 символам. Вопрос решился фиксированием длины типа varchar: cast(dbo.f_function(ID) as varchar(255)) |
||||
3 авг 17, 11:29 [20697353] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
|
||
3 авг 17, 12:33 [20697554] Ответить | Цитировать Сообщить модератору |
WarAnt Member Откуда: Питер Сообщений: 2423 |
Борис А, это не фиксирование длины, а указание, а вот если вы ее не указали, то как раз фиксирована она согласно документации, которую похоже народ совсем читать разучился. |
3 авг 17, 12:50 [20697602] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |