Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Не складываются строки в переменную  [new]
Bryk_Alien
Guest
Доброй ночи, уважаемые
То ли усталость сказывается, то ли я такой дурак...
Сразу к сути:
Написал запрос, который должен записать в переменную типа nvarchar(max) результаты выборки.
+ Убрал в спойлер, а то большой
DECLARE @Points AS varchar(max) = ''
SELECT @Points = @Points + '
	GeoCol.add( new ymaps.Placemark([' + CAST(POS.PosX + POS.Shift AS nvarchar) + ', ' + CAST(POS.PosY + POS.Shift AS nvarchar) + '],
			{	
				balloonContentFooter: ''Посещение: ' + ISNULL(VS.VisitStr,  '') + '''
			} )	);'
FROM
	(	SELECT	
			POS.*
			,(ROW_NUMBER() OVER (PARTITION BY POS.PosX, POS.PosY ORDER BY CSH.VisitDate0) - 1) * 0.0001 AS Shift
			,COUNT(TC.ParentID) OVER (PARTITION BY  POS.PosX, POS.PosY, TC.ParentID) AS Dupls
		FROM
			dbo.tblCustomers AS TC
			INNER JOIN
			dbo.tblCustomersAddressPosXY AS POS ON POS.RecordID = TC.RecordID
			LEFT OUTER JOIN
			dbo.tblCustomersSchedule AS CSH ON CSH.RecordID = TC.RecordID
		WHERE
			TC.EmployeeID = @EmployeeID
			AND POS.PosX IS NOT NULL 
			AND POS.PosY IS NOT NULL 
	) AS POS 
	INNER JOIN
	dbo.tblCustomers AS TC ON TC.RecordID = POS.RecordID
	LEFT OUTER JOIN
	dbo.tblCustomersSchedule AS CSH ON CSH.RecordID = TC.RecordID
	LEFT OUTER JOIN
	dbo.tblEmployees AS TE ON TE.EmployeeID = TC.EmployeeID
	LEFT OUTER JOIN
	dbo.tblEmployees AS TS ON TS.EmployeeID = TE.SupervisorID
	LEFT OUTER JOIN
	(	SELECT 
			ParentID
			,(	SELECT	Visit + ',' 'data()'
				FROM	@DPL
				WHERE 	PosX = DPL.PosX
					AND PosY = DPL.PosY
					AND ParentID = DPL.ParentID
				ORDER BY
					Visit
				FOR XML PATH ('')) AS VisitStr
		FROM 
			@DPL AS DPL
		GROUP BY 
			PosX, PosY, ParentID
	) AS VS ON VS.ParentID = TC.ParentID
WHERE
	POS.Dupls <= 1
	OR POS.Shift = 0
ORDER BY
	CSH.VisitDate0

PRINT @Points



В выделенной жёлтым строке есть поле VS.VisitStr которое представляет из себя строку, принимающую значения NULL или что-то вроде: 'Ср 13:00, Ср 16:00, Ср 16:30, Ср 16:30, Ср 17:00, Ср 17:30,'
Так же на скриншоте видно, какие оно принимает значения. Я привел его для того чтобы вы могли видеть, что данные выбираются.


Так вот, если убрать это поле (я взял в кавычки), то выводимые строки успешно складываются, и запрос выводит что-то вроде:

			GeoCol.add( new ymaps.Placemark([55.828100, 37.529016],
{
balloonContentFooter: 'Посещение: VS.VisitStr'
} ) );
GeoCol.add( new ymaps.Placemark([55.864250, 37.499938],
{
balloonContentFooter: 'Посещение: VS.VisitStr'
} ) );
GeoCol.add( new ymaps.Placemark([55.921020, 37.812426],
{
balloonContentFooter: 'Посещение: VS.VisitStr'
} ) );
GeoCol.add( new ymaps.Placemark([55.818170, 37.505588],
{
balloonContentFooter: 'Посещение: VS.VisitStr'
} ) );
GeoCol.add( new ymaps.Placemark([55.704420, 37.533733],
{
balloonContentFooter: 'Посещение: VS.VisitStr'
} ) );

Но если это поле оставить, то в переменную попадает только ПОСЛЕДНЯЯ строка... Если брать из верхних, то выведет только:

			GeoCol.add( new ymaps.Placemark([55.704420, 37.533733],
{
balloonContentFooter: 'Посещение: VS.VisitStr'
} ) );

2 часа голову ломаю, и пол часа сообщение сочинял... Где ошибка? :(

К сообщению приложен файл. Размер - 127Kb
19 сен 15, 00:41    [18169026]     Ответить | Цитировать Сообщить модератору
 Re: Не складываются строки в переменную  [new]
Bryk_Alien
Guest
Всё бл?*:!!!
Нашёл!!

Выше использовал в запросе функцию, которой было необходимо объявить OPTION (MAXRECURSION 0)

Спокойной ночи
19 сен 15, 00:46    [18169035]     Ответить | Цитировать Сообщить модератору
 Re: Не складываются строки в переменную  [new]
Bryk_Alien
Guest
А нет... нихера...
19 сен 15, 00:51    [18169045]     Ответить | Цитировать Сообщить модератору
 Re: Не складываются строки в переменную  [new]
aleks2
Guest
Bryk_Alien
Где ошибка? :(

В генетическом коде.

SELECT @Points = @Points + '
не документировано и со "сложными" запросами просто не работает. И не пожалуешься.

Варианты
1) for xml. Это правильнее.
2) Результат запроса в табличную переменную, затем SELECT @Points = @Points + ' ... from @Table
19 сен 15, 05:36    [18169217]     Ответить | Цитировать Сообщить модератору
 Re: Не складываются строки в переменную  [new]
Bryk_Alien
Guest
aleks2,

Дело в том, что этот селект (с @points) я скопировал из другого своего запроса, где он отлично работает (и ещё в паре мест)
Скопирован без изменения, символ в символ. Различается только значением @EmployeeID в первом подселекте.
19 сен 15, 08:09    [18169239]     Ответить | Цитировать Сообщить модератору
 Re: Не складываются строки в переменную  [new]
aleks2
Guest
Bryk_Alien
aleks2,

Дело в том, что этот селект (с @points) я скопировал из другого своего запроса, где он отлично работает (и ещё в паре мест)
Скопирован без изменения, символ в символ. Различается только значением @EmployeeID в первом подселекте.


Ну и что? Ты думаешь, что кого-то удивил?
Это все давно известно.

Тебе ж сказали: могет работать - могет не работать. Воля оптимизатора.
19 сен 15, 08:13    [18169242]     Ответить | Цитировать Сообщить модератору
 Re: Не складываются строки в переменную  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
У нас с select top 1000 всегда работает. Но оно крайне медленное
19 сен 15, 13:26    [18169541]     Ответить | Цитировать Сообщить модератору
 Re: Не складываются строки в переменную  [new]
Bryk_Alien
Guest
Были проблемы с интернетом
Mike_za
У нас с select top 1000 всегда работает. Но оно крайне медленное

Действительно, работает! :)
В моём случае, падение производительности не критичное, т.к. строк порядка несколько сотен а частота запуска запроса - несколько раз в день

Возьму этот способ, т.к. сроки...
22 сен 15, 14:49    [18180709]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить