Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Массовая автозамена по всем столбцам таблицы  [new]
Maximusu
Member

Откуда:
Сообщений: 22
Добрый день, друзья!

Есть разовая задачка, решение которой честно искал, ответа пока не нашел.

1. Есть временная таблица #t со множеством столбцов

2. И есть постоянная таблица Translit, где всего 2 столбца:
TextFrom;TextTo

3. Задача по всей таблице #t заменить абсолютно во всех полях
значения =TextFrom на значения =TextTo

По одному столбцу Code и одному конкретному значению ясно, это делается примерно так:
Update #t Set Code = replace(Code, 'abc', 'xyz')

Но задача:
1. пробежаться по всем строкам Translit
2. пробежаться по всем столбцам #t

Не очень тривиально для меня...

Не поможете друзья с алгоритмом?


Заранее благодарен :)
18 май 17, 18:21    [20493877]     Ответить | Цитировать Сообщить модератору
 Re: Массовая автозамена по всем столбцам таблицы  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Maximusu, динамический SQL.

Для каждой строки в Translit вы должны сгенерировать строку такого типа, как вы привели: "Update #t Set Code = replace(Code, 'abc', 'xyz')", только вместо "abc" и "xyz" указать значения полей TextFrom;TextTo.
18 май 17, 18:31    [20493889]     Ответить | Цитировать Сообщить модератору
 Re: Массовая автозамена по всем столбцам таблицы  [new]
Maximusu
Member

Откуда:
Сообщений: 22
Minamoto,

Да, но тогда придется перебрать последовательно такую инструкцию для каждого столбца...
18 май 17, 18:35    [20493893]     Ответить | Цитировать Сообщить модератору
 Re: Массовая автозамена по всем столбцам таблицы  [new]
buven
Member

Откуда:
Сообщений: 792
Maximusu
Minamoto,

Да, но тогда придется перебрать последовательно такую инструкцию для каждого столбца...


Ну вот так можно и перебрать наверно...

create table #T (ID int)
select * from tempdb.sys.columns where object_id = object_id('tempdb..#T')
drop table #T
18 май 17, 18:48    [20493922]     Ответить | Цитировать Сообщить модератору
 Re: Массовая автозамена по всем столбцам таблицы  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Maximusu, нет, в подзапросе для каждого столбца нужно будет продублировать эту часть: "Code = replace(Code, 'abc', 'xyz')", соединить их все запятой. как получить список столбцов, вам подсказали.
18 май 17, 18:58    [20493933]     Ответить | Цитировать Сообщить модератору
 Re: Массовая автозамена по всем столбцам таблицы  [new]
Maximusu
Member

Откуда:
Сообщений: 22
Minamoto
Maximusu, нет, в подзапросе для каждого столбца нужно будет продублировать эту часть: "Code = replace(Code, 'abc', 'xyz')", соединить их все запятой. как получить список столбцов, вам подсказали.


Не судите строго, в SQL туговат..


create table #T (ID int)
select * from tempdb.sys.columns where object_id = object_id('tempdb..#T')

-- Как здесь корректно организовать цикл по отобранным столбцам,
-- ведь ссылаться нужно будет уже не поименно... а по отобранным значениям.


drop table #T
18 май 17, 19:14    [20493967]     Ответить | Цитировать Сообщить модератору
 Re: Массовая автозамена по всем столбцам таблицы  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Maximusu, вот так:

create table #T (ID int, value1 nvarchar(max), value2 nvarchar(max));
create table #translit (TextFrom nvarchar(max), TextTo nvarchar(max));
insert into #translit (TextFrom, TextTo) values  (N'abc', N'xyz'), (N'cba', N'zyx');

declare @sql nvarchar(max) = N'';

select @sql +=	N'update #t set ID = ID' 
			+	(	select N', ' + col.name + N' = replace(' + col.name + N', ''' + t.TextFrom + N''', ''' + t.TextTo + N''')'
					from	tempdb.sys.columns col
					where	object_id = object_id('tempdb..#T')
						and col.name != 'ID'
					for xml path('')
				)
			+ N';' + char(13) + char(10)
from	#translit as t;

print @sql;
--чтобы выполнить, нужно раскомментировать следующую строчку
--exec sp_executesql @sql;

drop table #T;
drop table #translit;
19 май 17, 09:54    [20494987]     Ответить | Цитировать Сообщить модератору
 Re: Массовая автозамена по всем столбцам таблицы  [new]
Maximusu
Member

Откуда:
Сообщений: 22
Minamoto,

Мощно! :)

Спасибо большое, буду пробовать
21 май 17, 01:08    [20498992]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить