powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с запросом, пожалуйста
24 сообщений из 24, страница 1 из 1
Помогите с запросом, пожалуйста
    #39579007
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть две таблицы: письма и тесты заголовков писем.
Если в таблице с тестами, скажем, 3 строки, то при добавлении 9 строк в таблицу писем необходимо, чтобы результат был таким:
Заголовок письма Текст письмаТест заголовка 1 Текст письмаТест заголовка 1 Текст письмаТест заголовка 1 Текст письмаТест заголовка 2 Текст письмаТест заголовка 2 Текст письмаТест заголовка 2 Текст письмаТест заголовка 3 Текст письмаТест заголовка 3 Текст письмаТест заголовка 3 Текст письма
Подскажите, пожалуйста, как эту задачу можно решить с помощью select или update, если это возможно. Я пока кроме курсора выходов не вижу.
...
Рейтинг: 0 / 0
Помогите с запросом, пожалуйста
    #39579009
xenix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vsevolod V,
авторSELECT L.*, H.*
FROM LETTERS L
CROSS JOIN HEADERS H

так?
...
Рейтинг: 0 / 0
Помогите с запросом, пожалуйста
    #39579022
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xenix,

Спасибо. Нет, не так. В вашем варианте будет 1 получателю отправлено 3 письма с разными заголовками. И в общей сложности будет 27 писем, а не 9

Заголовок письмаТекст письмаEmailТест заголовка 1Текст письмаburkov@mail.ruТест заголовка 1Текст письмаfoma@yandex.ruТест заголовка 1Текст письмаgurch@mail.ruТест заголовка 2Текст письмаborya@gmail.comТест заголовка 2Текст письмаs.krupko@mail.ruТест заголовка 2Текст письмаmashhod@yandex.ruТест заголовка 3Текст письмаvorobeva.2017@gmail.comТест заголовка 3Текст письмаvershinin@uralsibstal.comТест заголовка 3Текст письмаganediy@yandex.ru
...
Рейтинг: 0 / 0
Помогите с запросом, пожалуйста
    #39579025
ntile,
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
declare @z table (id int identity, txt varchar(100))
declare @t table (id int identity, txt varchar(100))

insert into @z (txt)
values ('Тест заголовка 1'), ('Тест заголовка 2'), ('Тест заголовка 3')

insert into @t (txt)
values ('Текст письма 1'), ('Текст письма 2'), ('Текст письма 3'),('Текст письма 4'), ('Текст письма 5'), ('Текст письма 6'),('Текст письма 7') --, ('Текст письма 8'), ('Текст письма 9')

declare @cnt int = (select count(*) from @z)

--	
;with b as
	(select *, row_number()over(order by id) as n from @z),
c as
	(select *, ntile(@cnt)over(order by id) as n from @t)		 

select
	b.n
	,b.txt 
	,c.txt
from b inner join c on b.n=c.n



ntxttxt1Тест заголовка 1Текст письма 11Тест заголовка 1Текст письма 21Тест заголовка 1Текст письма 32Тест заголовка 2Текст письма 42Тест заголовка 2Текст письма 53Тест заголовка 3Текст письма 63Тест заголовка 3Текст письма 7
...
Рейтинг: 0 / 0
Помогите с запросом, пожалуйста
    #39579027
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ntile,

Спасибо! Похоже на то что надо. Буду проверять
...
Рейтинг: 0 / 0
Помогите с запросом, пожалуйста
    #39579042
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ntile,

В предложенном вами решении используется переменная @cnt, которая вроде как становится прецедентом для появления курсора. Дело в том, что задача усложнена тем, что в таблице писем разные рассылки с разными наборами тестируемых значений. То есть количество тестируемых значений необходимо рассчитывать в запросе, а не выводить в переменную.

Я попробовал это сделать, но столкнулся с ошибкой: "Ссылка на столбец "mt_id" недопустима в аргументе для функции NTILE. Допускаются только ссылки на столбцы внешней области или изолированные выражения и вложенные запросы."


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
;with 
b as (select *, row_number()over(order by mtv_id, mt_id) as n from tMailTestValues), 
mails as (select *, ntile((select count(*) from tMailTestValues where mt_id = mt.mt_id))over(order by mt_id) as n from v_A_TasksMail tm join 
tMailTest mt on tm.m_id_template = mt.m_id)		 

select
	b.n,
	mails.n
from b inner join mails on b.n = mails.n
...
Рейтинг: 0 / 0
Помогите с запросом, пожалуйста
    #39579046
ntile,
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vsevolod Vntile,

В предложенном вами решении используется переменная @cnt, которая вроде как становится прецедентом для появления курсора. Дело в том, что задача усложнена тем, что в таблице писем разные рассылки с разными наборами тестируемых значений. То есть количество тестируемых значений необходимо рассчитывать в запросе, а не выводить в переменную.

Я попробовал это сделать, но столкнулся с ошибкой: "Ссылка на столбец "mt_id" недопустима в аргументе для функции NTILE. Допускаются только ссылки на столбцы внешней области или изолированные выражения и вложенные запросы."


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
;with 
b as (select *, row_number()over(order by mtv_id, mt_id) as n from tMailTestValues), 
mails as (select *, ntile((select count(*) from tMailTestValues where mt_id = mt.mt_id))over(order by mt_id) as n from v_A_TasksMail tm join 
tMailTest mt on tm.m_id_template = mt.m_id)		 

select
	b.n,
	mails.n
from b inner join mails on b.n = mails.n

Зачем это where в подзапросе ?
Вот так "работает"

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
;with b as
	(select *, row_number()over(order by id) as n from @z),
c as
	(select *, ntile((select count(*) from @z))over(order by id) as n from @t)		 

select
	b.n
	,b.txt 
	,c.txt
from b inner join c on b.n=c.n
...
Рейтинг: 0 / 0
Помогите с запросом, пожалуйста
    #39579075
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте лучше заново более полно сформулирую задачу со своей структурой данных.

Таблицы:
1. v_A_TasksMail - таблица писем, каждое письмо относится к той или иной рассылке, все тесты проводятся в рамках рассылки так, что тесты одной рассылки не пересекаются с тестами другой.

m_id_parent - идентификатор рассылки

m_id m_addressFrom m_addressTo m_subject m_text m_nameFrom m_id_parent1 'vova@yandex.ru''vasya@mail.ru''Поздравляем Вас с Новым Годом!''Добрый день! Примите наши теплый поздравления''Всеволод Гаврилов'222 'vova@yandex.ru''ivan@mail.ru''Поздравляем Вас с Новым Годом!''Добрый день! Примите наши теплый поздравления''Всеволод Гаврилов'223 'vova@yandex.ru''petr@mail.ru''Поздравляем Вас с Новым Годом!''Добрый день! Примите наши теплый поздравления''Всеволод Гаврилов'224 'gena@yandex.ru''masha@mail.ru''Услуги клининга в Санкт-Петербурге''Добрый день! Заказывайте клининг только у нас!''Всеволод Гаврилов'235 'gena@yandex.ru''dasha@mail.ru''Услуги клининга в Санкт-Петербурге''Добрый день! Заказывайте клининг только у нас!''Всеволод Гаврилов'236 'gena@yandex.ru''zinaida@mail.ru''Услуги клининга в Санкт-Петербурге''Добрый день! Заказывайте клининг только у нас!''Всеволод Гаврилов'237 'olga@yandex.ru''stepan@mail.ru''Фильтры воды для дома и дачи''Добрый день! Заказывайте фильтры воды только у нас!''Всеволод Гаврилов'24

2. tMailTest - Таблица тестов для рассылки, например, тест темы письма, тест имени отправителя и т.п. Одна рассылка может содержать несколько тестов

mt_id mt_name m_id_parent1 'Тест заголовка письма' 222 'Тест заголовка письма' 23


3. tMailTestValues
mtv_id mt_id mtv_value11'С Новым 2018 Годом!'21'Поздравляем от всей души с Новым Годом'31'От всей души поздравляем с Новым Годом'42'Профессиональные услуги клининга!'52'Позаботьтесь о чистоте в вашем доме'

Моя задача в том, чтобы в результирующем наборе данных получить подмененные в зависимости от теста значения. А если теста нет, то ничего не подменять. Результат должен быть таким:

m_id m_addressFrom m_addressTo m_subject m_text m_nameFrom m_id_parent1 'vova@yandex.ru''vasya@mail.ru''С Новым 2018 Годом!''Добрый день! Примите наши теплый поздравления''Всеволод Гаврилов'222 'vova@yandex.ru''ivan@mail.ru''Поздравляем от всей души с Новым Годом''Добрый день! Примите наши теплый поздравления''Всеволод Гаврилов'223 'vova@yandex.ru''petr@mail.ru''От всей души поздравляем с Новым Годом''Добрый день! Примите наши теплый поздравления''Всеволод Гаврилов'224 'gena@yandex.ru''masha@mail.ru''Профессиональные услуги клининга!''Добрый день! Заказывайте клининг только у нас!''Всеволод Гаврилов'235 'gena@yandex.ru''dasha@mail.ru''Позаботьтесь о чистоте в вашем доме''Добрый день! Заказывайте клининг только у нас!''Всеволод Гаврилов'236 'gena@yandex.ru''zinaida@mail.ru''Профессиональные услуги клининга!''Добрый день! Заказывайте клининг только у нас!''Всеволод Гаврилов'237 'olga@yandex.ru''stepan@mail.ru''Фильтры воды для дома и дачи''Добрый день! Заказывайте фильтры воды только у нас!''Всеволод Гаврилов'24
...
Рейтинг: 0 / 0
Помогите с запросом, пожалуйста
    #39579189
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Осподи, что за фуфло?!!

Код: sql
1.
2.
3.
4.
select new_m_subject = isnull( x.mtv_value, t.m_subject)
       , t.* 
  from  v_A_TasksMail as t 
          outer apply ( select top(1) * from tMailTestValues where mtv_id = t.m_id ) as x



ЗЫ. Я догадываюсь, что страдалец хочет "иного"... но суть та же.
...
Рейтинг: 0 / 0
Помогите с запросом, пожалуйста
    #39579328
ntile,
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vsevolod V,

что б ты ещё скриптами всю эту "красоту" выкладывал, цены бы тебе не было :)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
declare @v_A_TasksMail table (m_id int, m_addressFrom varchar(100), m_addressTo varchar(100), m_subject varchar(100), m_text varchar(100), m_nameFrom varchar(100), m_id_parent int) 
insert into @v_A_TasksMail values
 (1, 'vova@yandex.ru', 'vasya@mail.ru', 'Поздравляем Вас с Новым Годом!', 'Добрый день! Примите наши теплый поздравления', 'Всеволод Гаврилов', 22)
,(2, 'vova@yandex.ru', 'ivan@mail.ru', 'Поздравляем Вас с Новым Годом!', 'Добрый день! Примите наши теплый поздравления', 'Всеволод Гаврилов', 22) 
,(3, 'vova@yandex.ru', 'petr@mail.ru', 'Поздравляем Вас с Новым Годом!', 'Добрый день! Примите наши теплый поздравления', 'Всеволод Гаврилов', 22) 
,(4, 'gena@yandex.ru', 'masha@mail.ru', 'Услуги клининга в Санкт-Петербурге', 'Добрый день! Заказывайте клининг только у нас!', 'Всеволод Гаврилов', 23) 
,(5, 'gena@yandex.ru', 'dasha@mail.ru', 'Услуги клининга в Санкт-Петербурге', 'Добрый день! Заказывайте клининг только у нас!', 'Всеволод Гаврилов', 23) 
,(6, 'gena@yandex.ru', 'zinaida@mail.ru', 'Услуги клининга в Санкт-Петербурге', 'Добрый день! Заказывайте клининг только у нас!', 'Всеволод Гаврилов', 23) 
,(7, 'olga@yandex.ru', 'stepan@mail.ru', 'Фильтры воды для дома и дачи', 'Добрый день! Заказывайте фильтры воды только у нас!', 'Всеволод Гаврилов', 24) 

declare @tMailTest table (mt_id int, mt_name varchar(100), m_id_parent int) 
insert into @tMailTest values
 (1, 'Тест заголовка письма', 22) 
,(2, 'Тест заголовка письма', 23) 

declare @tMailTestValues table (mtv_id int, mt_id int, mtv_value varchar(100))
insert into @tMailTestValues values
 (1, 1, 'С Новым 2018 Годом!')
,(2, 1, 'Поздравляем от всей души с Новым Годом') 
,(3, 1, 'От всей души поздравляем с Новым Годом')
,(4, 2, 'Профессиональные услуги клининга!') 
,(5, 2, 'Позаботьтесь о чистоте в вашем доме')



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
;with a1 as 
	(select *, n=row_number()over(partition by m_id_parent order by m_id) from @v_A_TasksMail)
,b1 as
	(select 
			a.*
			,b.m_id_parent
			,n=row_number()over(partition by b.m_id_parent order by a.mtv_id) 
			,m=count(a.mtv_id)over(partition by b.m_id_parent)
	from @tMailTestValues a inner join @tMailTest b on a.mt_id=b.mt_id) 

select 
		new_m_subject	=isnull(b1.mtv_value, a1.m_subject)	
		,a1.* 

from a1 left join b1 on a1.m_id_parent=b1.m_id_parent and (a1.n-1)%b1.m+1=b1.n  



new_m_subject m_idm_addressFromm_addressTom_subjectm_textm_nameFromm_id_parentnС Новым 2018 Годом!1vova@yandex.ruvasya@mail.ruПоздравляем Вас с Новым Годом!Добрый день! Примите наши теплый поздравленияВсеволод Гаврилов221Поздравляем от всей души с Новым Годом2vova@yandex.ruivan@mail.ruПоздравляем Вас с Новым Годом!Добрый день! Примите наши теплый поздравленияВсеволод Гаврилов222От всей души поздравляем с Новым Годом3vova@yandex.rupetr@mail.ruПоздравляем Вас с Новым Годом!Добрый день! Примите наши теплый поздравленияВсеволод Гаврилов223Профессиональные услуги клининга!4gena@yandex.rumasha@mail.ruУслуги клининга в Санкт-ПетербургеДобрый день! Заказывайте клининг только у нас!Всеволод Гаврилов231Позаботьтесь о чистоте в вашем доме5gena@yandex.rudasha@mail.ruУслуги клининга в Санкт-ПетербургеДобрый день! Заказывайте клининг только у нас!Всеволод Гаврилов232Профессиональные услуги клининга!6gena@yandex.ruzinaida@mail.ruУслуги клининга в Санкт-ПетербургеДобрый день! Заказывайте клининг только у нас!Всеволод Гаврилов233Фильтры воды для дома и дачи7olga@yandex.rustepan@mail.ruФильтры воды для дома и дачиДобрый день! Заказывайте фильтры воды только у нас!Всеволод Гаврилов241
...
Рейтинг: 0 / 0
Помогите с запросом, пожалуйста
    #39692489
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача сильно изменилась. Помогите, пожалуйста. Я вижу решение через использование inline фукнции, в которой будут рандомно выбираться и подменяться параметры в тексте. Но производительность, боюсь, будет низкой. Как можно решить это с помощью запрос?

Мне необходимо сделать рандомизацию текстов писем в рассылках для тестирования их эфективности. Под рандомизацией текста письма подразумевается то, что в тексте используются параметры, например [param1], которые подменяются при отправке письма рандомно.
Помогите, пожалуйста, как это можно решить наиболее оптимально с точки зрения производитеьности?

Исходные данные:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
declare @v_A_TasksMail table (m_id int, m_addressFrom varchar(100), m_addressTo varchar(100), m_subject varchar(100), m_text varchar(100), m_nameFrom varchar(100), m_id_parent int) 
insert into @v_A_TasksMail values
 (1, 'vova@yandex.ru', 'vasya@mail.ru', 'Поздравляем Вас с Новым Годом!', '[param1] [param2]. Желаем Вам здоровья и счастья!', 'Всеволод Гаврилов', 22)
,(2, 'vova@yandex.ru', 'ivan@mail.ru', 'Поздравляем Вас с Новым Годом!', '[param1] [param2]. Желаем Вам здоровья и счастья!', 'Всеволод Гаврилов', 22) 
,(3, 'vova@yandex.ru', 'petr@mail.ru', 'Поздравляем Вас с Новым Годом!', '[param1] [param2]. Желаем Вам здоровья и счастья!', 'Всеволод Гаврилов', 22) 
,(4, 'gena@yandex.ru', 'masha@mail.ru', 'Услуги клининга в Санкт-Петербурге', 'Добрый день! [param25] только у нас!', 'Всеволод Гаврилов', 23) 
,(5, 'gena@yandex.ru', 'dasha@mail.ru', 'Услуги клининга в Санкт-Петербурге', 'Добрый день! [param25] только у нас!', 'Всеволод Гаврилов', 23) 
,(6, 'gena@yandex.ru', 'zinaida@mail.ru', 'Услуги клининга в Санкт-Петербурге', 'Добрый день! [param25] только у нас!', 'Всеволод Гаврилов', 23) 
,(7, 'olga@yandex.ru', 'stepan@mail.ru', 'Фильтры воды для дома и дачи', 'Добрый день! Заказывайте фильтры воды только у нас!', 'Всеволод Гаврилов', 24) 

declare @tMailTest table (mt_id int, mt_name varchar(100), m_id_parent int, mt_tag varchar(100)) 
insert into @tMailTest values
 (1, 'Тест текста письма', 22, '[param1]') 
,(2, 'Тест текста письма', 22, '[param2]') 
,(2, 'Тест текста письма', 23, '[param25]') 

declare @tMailTestValues table (mtv_id int, mt_id int, mtv_value varchar(100))
insert into @tMailTestValues values
 (1, 1, 'Добрый день!')
,(2, 1, 'Здравствуйте!') 
,(3, 1, 'Доброго времени суток!')
,(4, 2, 'Примите наши теплые поздравления!') 
,(5, 2, 'От весго нашего коллектива поздравляю Вас с Новым Годом!')
,(6, 3, 'Заказывайте услуги клининга')
,(7, 3, 'Профессиональные услуги клининга')



Моя задача в том, чтобы в результирующем наборе данных получить рандомно подмененные параметры теста. А если теста нет, то ничего не подменять. Результат может быть, например, таким:

m_id m_addressFrom m_addressTo m_subject m_text m_nameFrom m_id_parent1 'vova@yandex.ru' 'vasya@mail.ru' 'С Новым 2018 Годом!' 'Здравствуйте! Примите наши теплые поздравления' 'Всеволод Гаврилов' 222 'vova@yandex.ru' 'ivan@mail.ru' 'Поздравляем от всей души с Новым Годом' 'Здравствуйте! От весго нашего коллектива поздравляю Вас с Новым Годом!' 'Всеволод Гаврилов' 223 'vova@yandex.ru' 'petr@mail.ru' 'От всей души поздравляем с Новым Годом' 'Доброго времени суток! От весго нашего коллектива поздравляю Вас с Новым Годом!' 'Всеволод Гаврилов' 224 'gena@yandex.ru' 'masha@mail.ru' 'Профессиональные услуги клининга!' 'Добрый день! Профессиональные услуги клининга только у нас!' 'Всеволод Гаврилов' 235 'gena@yandex.ru' 'dasha@mail.ru' 'Профессиональные услуги клининга!' 'Добрый день! Профессиональные услуги клининга только у нас!' 'Всеволод Гаврилов' 236 'gena@yandex.ru' 'zinaida@mail.ru' 'Профессиональные услуги клининга!' 'Добрый день! Заказывайте клининг только у нас!' 'Всеволод Гаврилов' 237 'olga@yandex.ru' 'stepan@mail.ru' 'Фильтры воды для дома и дачи' 'Добрый день! Заказывайте фильтры воды только у нас!' 'Всеволод Гаврилов' 24
...
Рейтинг: 0 / 0
Помогите с запросом, пожалуйста
    #39692576
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vsevolod V,

на SQL2016+ можно использовать FORMATMESSAGE().
...
Рейтинг: 0 / 0
Помогите с запросом, пожалуйста
    #39692580
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vsevolod V,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
select
 vtm.*, f.x.value('.', 'varchar(max)')
from
 @v_A_TasksMail vtm cross apply
 (select replace(cast(cast('' as xml).query('sql:column("vtm.m_text")') as varchar(max)), '"', '"')) a(m_text) cross apply
 (select cast('<text value = "' + replace(replace(a.m_text, '[', '"/><param value = "['), ']', ']"/><text value = "') + '"/>' as xml)) b(x) cross apply
 (
  select
   isnull(e.mtv_value, d.node_value)
  from
   (
    select
     c.n.value('local-name(.)', 'varchar(1000)'),
     c.n.value('@value', 'varchar(1000)'),
     row_number() over (order by (select 1))
	from
     b.x.nodes('*') c(n)
   ) d(node_name, node_value, rn) outer apply
   (
    select top (1)
	 mtv.mtv_value
	from
	 @tMailTest mt join
	 @tMailTestValues mtv on mtv.mt_id = mt.mt_id
	where
	 d.node_name = 'param' and
	 mt.mt_tag = d.node_value
	order by
	 newid()
   ) e
  for xml path(''), type
 ) f(x);
...
Рейтинг: 0 / 0
Помогите с запросом, пожалуйста
    #39692585
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исправленный вариант
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
select
 vtm.*, f.x.value('.', 'varchar(max)')
from
 @v_A_TasksMail vtm cross apply
 (select replace(cast(cast('' as xml).query('sql:column("vtm.m_text")') as varchar(max)), '"', '&quot;')) a(m_text) cross apply
 (select cast('<text value = "' + replace(replace(a.m_text, '[', '"/><param value = "['), ']', ']"/><text value = "') + '"/>' as xml)) b(x) cross apply
 (
  select
   isnull(e.mtv_value, d.node_value)
  from
   (
    select
     c.n.value('local-name(.)', 'varchar(1000)'),
     c.n.value('@value', 'varchar(1000)'),
     row_number() over (order by (select 1))
    from
     b.x.nodes('*') c(n)
   ) d(node_name, node_value, rn) outer apply
   (
    select top (1)
     mtv.mtv_value
    from
     @tMailTest mt join
     @tMailTestValues mtv on mtv.mt_id = mt.mt_id
    where
     d.node_name = 'param' and
     mt.mt_tag = d.node_value
    order by
     newid()
   ) e
  order by
   d.rn
  for xml path(''), type
 ) f(x);
...
Рейтинг: 0 / 0
Помогите с запросом, пожалуйста
    #39692592
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

ну вы как зафигачите так зафигачите...
кто это кроме вас сопровождать сможет?
...
Рейтинг: 0 / 0
Помогите с запросом, пожалуйста
    #39692606
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Нетривиальное интересное решение. Спасибо большое.
Чтобы сопровождать, конечно, придется поломать голову)
...
Рейтинг: 0 / 0
Помогите с запросом, пожалуйста
    #39692613
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовVsevolod V,

на SQL2016+ можно использовать FORMATMESSAGE().

Можете, пожалуйста, поподробнее, почему это решение подойдет? Не ясно следующее. Фнкция прнимает аргументом param_value, который:
1. имеет отношение 1 к 1 с заполнителем значения, а надо 1 ко многим
2. Имеет ограничение в 20 значений
...
Рейтинг: 0 / 0
Помогите с запросом, пожалуйста
    #39692636
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Затуливетеркто это кроме вас сопровождать сможет? Vsevolod VЧтобы сопровождать, конечно, придется поломать голову)Тут нет ничего экстраординарного.
Достаточно вывести промежуточные результаты, чтобы понять как работает запрос.

Vsevolod VМожете, пожалуйста, поподробнее, почему это решение подойдет? Не ясно следующее. Фнкция прнимает аргументом param_value, который:
1. имеет отношение 1 к 1 с заполнителем значения, а надо 1 ко многим
2. Имеет ограничение в 20 значенийFORMATMESSAGE для вашей задачи не подходит. Вы не сможете вызвать функцию в одном запроск с разным количеством аргументов.
...
Рейтинг: 0 / 0
Помогите с запросом, пожалуйста
    #39692664
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Все понял. Еще раз спасибо!
...
Рейтинг: 0 / 0
Помогите с запросом, пожалуйста
    #39692902
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напрягите фантазийный орган, компаньерос.
Шаблон ведь ничего не стоит поправить.

Код: sql
1.
2.
3.
4.
5.
select FORMATMESSAGE(N'надо %s %s %s', N'123 р.', '', '')
union
select FORMATMESSAGE(N'приходите в %s-%s %s', '18', '30', '')
union
select FORMATMESSAGE(N'дорогой %s %s %s!', N'Сидоров', N'Петр', N'Фёдорович')
...
Рейтинг: 0 / 0
Помогите с запросом, пожалуйста
    #39692913
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовШаблон ведь ничего не стоит поправить.Может уже перейдете от теории к практике?
И покажете нам как на исходных данных из 21652174 с помощью FORMATMESSAGE получить результат, показанный там же?
...
Рейтинг: 0 / 0
Помогите с запросом, пожалуйста
    #39693076
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

для той структуры справочников не подойдёт, конечно. Но справочники же можно изменить?
...
Рейтинг: 0 / 0
Помогите с запросом, пожалуйста
    #39693081
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовНо справочники же можно изменить?А так же зафиксировать количество, порядок и смысл параметров в шаблоне?
...
Рейтинг: 0 / 0
Помогите с запросом, пожалуйста
    #39693162
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пятничный quiz!
Как вам такой вариант? Разбито на модули (функции), сопровождать проще намного будет думаю.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
use tempdb
go

drop table if exists dbo.v_A_TasksMail
drop table if exists dbo.tMailTest
drop table if exists dbo.tMailTestValues
go

create table dbo.v_A_TasksMail (m_id int, m_addressFrom nvarchar(100), m_addressTo nvarchar(100), m_subject nvarchar(100), m_text nvarchar(100), m_nameFrom nvarchar(100), m_id_parent int) 
insert into dbo.v_A_TasksMail values
 (1, 'vova@yandex.ru', 'vasya@mail.ru', N'Поздравляем Вас с Новым Годом!', N'[param1] [param2]. Желаем Вам здоровья и счастья!', N'Всеволод Гаврилов', 22)
,(2, 'vova@yandex.ru', 'ivan@mail.ru', N'Поздравляем Вас с Новым Годом!', N'[param1] [param2]. Желаем Вам здоровья и счастья!', N'Всеволод Гаврилов', 22) 
,(3, 'vova@yandex.ru', 'petr@mail.ru', N'Поздравляем Вас с Новым Годом!', N'[param1] [param2]. Желаем Вам здоровья и счастья!', N'Всеволод Гаврилов', 22) 
,(4, 'gena@yandex.ru', 'masha@mail.ru', N'Услуги клининга в Санкт-Петербурге', N'Добрый день! [param25] только у нас!', N'Всеволод Гаврилов', 23) 
,(5, 'gena@yandex.ru', 'dasha@mail.ru', N'Услуги клининга в Санкт-Петербурге', N'Добрый день! [param25] только у нас!', N'Всеволод Гаврилов', 23) 
,(6, 'gena@yandex.ru', 'zinaida@mail.ru', N'Услуги клининга в Санкт-Петербурге', N'Добрый день! [param25] только у нас!', N'Всеволод Гаврилов', 23) 
,(7, 'olga@yandex.ru', 'stepan@mail.ru', N'Фильтры воды для дома и дачи', N'Добрый день! Заказывайте фильтры воды только у нас!', N'Всеволод Гаврилов', 24) 

create table dbo.tMailTest (mt_id int, mt_name nvarchar(100), m_id_parent int, mt_tag nvarchar(100)) 
insert into dbo.tMailTest values
 (1, N'Тест текста письма', 22, '[param1]') 
,(2, N'Тест текста письма', 22, '[param2]') 
,(2, N'Тест текста письма', 23, '[param25]') 

create table dbo.tMailTestValues (mtv_id int, mt_id int, mtv_value nvarchar(100))
insert into dbo.tMailTestValues values
 (1, 1, N'Добрый день!')
,(2, 1, N'Здравствуйте!') 
,(3, 1, N'Доброго времени суток!')
,(4, 2, N'Примите наши теплые поздравления!') 
,(5, 2, N'От весго нашего коллектива поздравляю Вас с Новым Годом!')
,(6, 3, N'Заказывайте услуги клининга')
,(7, 3, N'Профессиональные услуги клининга')

go

-- эта вьюха будет нужна чтобы получить случайное число в функции
create or alter view dbo.GetNewId as select newid() as new_id
go

-- получает список параметров из строки
create or alter function dbo.GetStringParams (
	@String nvarchar(max)
)
returns table
as 
/* test
select * from dbo.GetStringParams (N'asdf [param1] [param2]. Желаем Вам здоровья и счастья!')
*/
return
	select concat('[', t.ParamName, ']') as ParamName
	from string_split(@String, ']') 
		cross apply ( select charindex('[', value) as StartIndex ) c
		cross apply ( select stuff(value, 1, c.StartIndex, '') as ParamName ) t
	where c.StartIndex != 0
go

-- получает рандомное значение для переданного параметра
create or alter function dbo.GetRandomParamValue (
	@ParamName nvarchar(100)
)
returns table
as
/* test
select * from dbo.GetRandomParamValue ('[param1]')
*/
return
	select vv.mtv_value as RandomValue
	from dbo.tMailTest t
		cross apply (
			select top 1 *
			from dbo.tMailTestValues v cross join dbo.GetNewId
			where v.mt_id = t.mt_id
			order by new_id
		) vv
	where mt_tag = @ParamName
go

-- меняет параметры в строке на рандомные значения
create or alter function dbo.ReplaceParamsRandom (
	@String nvarchar(max)
)
returns nvarchar(max)
as
begin
/* test
select dbo.ReplaceParamsRandom ('P1=[param1] P2=[param2], P25=[param25]')
*/	
	-- инлайн не осилил...
	select @String = replace(@String, p.ParamName, rv.RandomValue)
	from dbo.GetStringParams(@String) p
		cross apply dbo.GetRandomParamValue(p.ParamName) rv

	return @String;

end
go

select m_id
     , m_addressFrom
     , m_addressTo
     , m_subject
     , dbo.ReplaceParamsRandom(m_text)
     , m_nameFrom
     , m_id_parent
from dbo.v_A_TasksMail
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с запросом, пожалуйста
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]