Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 разбивка данных на несколько строк For Xml Path - не могу понять, что происходит  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: разбивка данных на несколько строк For Xml Path - не могу понять, что происходит  [new]
alexxUK
Member

Откуда: Украина
Сообщений: 81
на самом деле - если моя функция так ломает данные - значит на вход ее приходит уже поломанная строка, ведь, как уже говоирил, если в сырых данных поубирать пробелы - и сделать ее одной строкой - то функция вернет то, что от нее ожидается.
В чем может быть моя ошибка передачи таких данных?
21 май 13, 12:12    [14325705]     Ответить | Цитировать Сообщить модератору
 Re: разбивка данных на несколько строк For Xml Path - не могу понять, что происходит  [new]
invm
Member

Откуда: Москва
Сообщений: 9287
alexxUK
Есть ли какие-то ограничения по длине выводимой строки в SQL?
Есть.
В сиквеле: set textsize.
В SSMS: Tools -> Options -> Query Results -> Results to Grid -> Maximum Characters Retrieved.
21 май 13, 12:43    [14326007]     Ответить | Цитировать Сообщить модератору
 Re: разбивка данных на несколько строк For Xml Path - не могу понять, что происходит  [new]
alexxUK
Member

Откуда: Украина
Сообщений: 81
invm
alexxUK
Есть ли какие-то ограничения по длине выводимой строки в SQL?
Есть.
В сиквеле: set textsize.
В SSMS: Tools -> Options -> Query Results -> Results to Grid -> Maximum Characters Retrieved.


да, спасибо за идею - уже проверил, хотел вот отписаться -
на noXml дата стоит = 65536
на xmlData - 2mb

у меня пример данных одного кандадита - порядка 2-3кb
просмотрел данные для вывода в ворде - каждый ответ имеет в среднем вот такую длину: (без пробелов, с пробелами ):

752/769 741/761 736/753 742/753. то есть в среднем все строки обрезаются и переносятся при определенной длине. Что делать, не пойму никак. Обновил regex функцию для работы с multiline - но она все равно ключит на месте 066-R04 ... - видимо потому что данные разнесены - остальное подхватило.
21 май 13, 12:52    [14326103]     Ответить | Цитировать Сообщить модератору
 Re: разбивка данных на несколько строк For Xml Path - не могу понять, что происходит  [new]
Гость333
Member

Откуда:
Сообщений: 3683
alexxUK
Обновил regex функцию для работы с multiline - но она все равно ключит на месте 066-R04 ... - видимо потому что данные разнесены - остальное подхватило.

Можно в CLR-функции удалять из исходной строки символы переноса, и уже к преобразованной строке применять регулярку.
21 май 13, 12:57    [14326169]     Ответить | Цитировать Сообщить модератору
 Re: разбивка данных на несколько строк For Xml Path - не могу понять, что происходит  [new]
alexxUK
Member

Откуда: Украина
Сообщений: 81
Гость333
alexxUK
Обновил regex функцию для работы с multiline - но она все равно ключит на месте 066-R04 ... - видимо потому что данные разнесены - остальное подхватило.

Можно в CLR-функции удалять из исходной строки символы переноса, и уже к преобразованной строке применять регулярку.


да, именно так придется и поступить - с какого-то не понятного мне перепуга MSSQL ставит CL CR в конце строки (в районе 2000 символа) - можно увидеть в аттаче. Для каждой записи, поскольку ответы разной длины - это деление происходит в разном месте ... - поскольку строка парсится отдельно - то перенесенный ответ не обрабатывается корректно ...

Если не получится никак сделать в MSSQL - буду явно удалять уже последствия в С# - но хочется ж вырезать это из процедуры (или понять, почему это так и почему не надо обновлять, а оставить на откуп уже C#) :).
21 май 13, 13:10    [14326302]     Ответить | Цитировать Сообщить модератору
 Re: разбивка данных на несколько строк For Xml Path - не могу понять, что происходит  [new]
Гость333
Member

Откуда:
Сообщений: 3683
alexxUK
с какого-то не понятного мне перепуга MSSQL ставит CL CR в конце строки (в районе 2000 символа) - можно увидеть в аттаче

Ну нет. MSSQL никаких CR LF сам по себе не ставит. Ставит кто-то другой, например, клиентское приложение, которое вставляет данные в эту таблицу.
21 май 13, 13:20    [14326377]     Ответить | Цитировать Сообщить модератору
 Re: разбивка данных на несколько строк For Xml Path - не могу понять, что происходит  [new]
aleks2
Guest
Откуда на Украйне Индианаполис?
Вот и фсе неправильно...
21 май 13, 14:53    [14327109]     Ответить | Цитировать Сообщить модератору
 Re: разбивка данных на несколько строк For Xml Path - не могу понять, что происходит  [new]
alexxUK
Member

Откуда: Украина
Сообщений: 81
Гость333
alexxUK
с какого-то не понятного мне перепуга MSSQL ставит CL CR в конце строки (в районе 2000 символа) - можно увидеть в аттаче

Ну нет. MSSQL никаких CR LF сам по себе не ставит. Ставит кто-то другой, например, клиентское приложение, которое вставляет данные в эту таблицу.


да, скорее всего так и было. Обновил функцию С# - вроде работает нормально.
Всем спасибо за идеи ).
21 май 13, 14:53    [14327110]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: разбивка данных на несколько строк For Xml Path - не могу понять, что происходит  [new]
Борис А
Member

Откуда:
Сообщений: 2
Гость333
alexxUK
с какого-то не понятного мне перепуга MSSQL ставит CL CR в конце строки (в районе 2000 символа) - можно увидеть в аттаче

Ну нет. MSSQL никаких CR LF сам по себе не ставит. Ставит кто-то другой, например, клиентское приложение, которое вставляет данные в эту таблицу.

Возможно мой случай кому-то будет полезен.
Искал решение аналогичной проблемы. Этот пост натолкнул на мысль, что режет не запрос 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]     Ответить | Цитировать Сообщить модератору
 Re: разбивка данных на несколько строк For Xml Path - не могу понять, что происходит  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36926
Борис А
А при обращении к этой функции: cast(dbo.f_function(ID) as varchar) результат обрезался к 30 символам.

Вопрос решился фиксированием длины типа varchar: cast(dbo.f_function(ID) as varchar(255))
Вы не поверите, но такое поведение даже в документации описано.
3 авг 17, 12:33    [20697554]     Ответить | Цитировать Сообщить модератору
 Re: разбивка данных на несколько строк For Xml Path - не могу понять, что происходит  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
Борис А,

это не фиксирование длины, а указание, а вот если вы ее не указали, то как раз фиксирована она согласно документации, которую похоже народ совсем читать разучился.
3 авг 17, 12:50    [20697602]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить