Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как заменить символы в строке? / 8 сообщений из 8, страница 1 из 1
21.09.2018, 13:12
    #39706082
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить символы в строке?
Дано: хмл строка, в которой может встречаться такая подстрока:

N'<node action="i" s=""petya""></node>'

чего хотелось бы в идеальном случае:
если s содержит строку с двойными кавычками(что уже ошибка), тогда
заменить на одинарныею и, если такое есть то сделать в этом же тэге action="u", не важно, что там было до того.

Пример результата:
N'<node action="u" s="petya"></node>'


Как такое сделать?
...
Рейтинг: 0 / 0
21.09.2018, 14:08
    #39706111
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить символы в строке?
прочитать в хелпе про ф-цию replace()
...
Рейтинг: 0 / 0
21.09.2018, 14:29
    #39706132
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить символы в строке?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
declare @s varchar(max) = N'<node action="i" s=""petya""></node><node action="i" s="vasya"></node>'
set @s = replace(@s,'=""','="&quot;')
set @s = replace(@s,'""','&quot;"')
declare @xml xml = cast(@s as xml)

;with cte as (
	select 
		[action]=t.c.value('@action', 'varchar(20)')
		,s		=t.c.value('@s', 'varchar(100)')
	from @xml.nodes('node') as t(c)
)
select 
	 case when s like '"%"' then 'u' else [action] end			as '@action'
	 ,case when s like '"%"' then substring(s, 2, len(s)-2) else s end	as '@s'
from cte
for xml path('node')
...
Рейтинг: 0 / 0
21.09.2018, 14:34
    #39706136
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить символы в строке?
court
Код: sql
1.
2.
3.
declare @s varchar(max) = N'<node action="i" s=""petya""></node><node action="i" s="vasya"></node>'
set @s = replace(@s,'=""','="&quot;')
set @s = replace(@s,'""','&quot;"')



изящно, просто, со вкусом. браво!
...
Рейтинг: 0 / 0
21.09.2018, 15:12
    #39706164
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить символы в строке?
Maxxпрочитать в хелпе про ф-цию replace()

даладно, одной функцией не отделаться
...
Рейтинг: 0 / 0
21.09.2018, 15:15
    #39706167
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить символы в строке?
court
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
declare @s varchar(max) = N'<node action="i" s=""petya""></node><node action="i" s="vasya"></node>'
set @s = replace(@s,'=""','="&quot;')
set @s = replace(@s,'""','&quot;"')
declare @xml xml = cast(@s as xml)

;with cte as (
	select 
		[action]=t.c.value('@action', 'varchar(20)')
		,s		=t.c.value('@s', 'varchar(100)')
	from @xml.nodes('node') as t(c)
)
select 
	 case when s like '"%"' then 'u' else [action] end			as '@action'
	 ,case when s like '"%"' then substring(s, 2, len(s)-2) else s end	as '@s'
from cte
for xml path('node')




Красиво, но вот в таком случае, когда есть другие теги - они теряются
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
declare @s varchar(max) = N'<node action="i" mumu="1" s=""petya""></node><node action="i" mumu="2" s="vasya"></node><node action="x" mumu="3" s="kolya"></node>'
set @s = replace(@s,'=""','="&quot;')
set @s = replace(@s,'""','&quot;"')
declare @xml xml = cast(@s as xml)

;with cte as (
	select 
		[action]=t.c.value('@action', 'varchar(20)')
		,s		=t.c.value('@s', 'varchar(100)')
	from @xml.nodes('node') as t(c)
)
select 
	 case when s like '"%"' then 'u' else [action] end			as '@action'
	 ,case when s like '"%"' then substring(s, 2, len(s)-2) else s end	as '@s'
from cte
for xml path('node')
...
Рейтинг: 0 / 0
21.09.2018, 16:22
    #39706220
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить символы в строке?
256kно вот в таком случае, когда есть другие теги - они теряютсядык, добавить эти "другие теги" в формирование нового xml-я (в cte и в запрос for xml) и всё

или их много/заранее не известные атрибуты ?
Если второе, то можно через XQuery поменять только нужные атрибуты, а всё остальное останеться как было. Типа этого что-то:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
declare @s varchar(max) = N'<node action="i" mumu="1" s=""petya""></node><node action="i" mumu="2" s="vasya"></node><node action="x" mumu="3" s=""kolya""></node>'
set @s = replace(@s,'=""','="&quot;')
set @s = replace(@s,'""','&quot;"')

declare @xml xml = cast(@s as xml)

select @xml

while @xml.query('data(/node[contains(@s,"""")]/@action)').value('text()[1]', 'varchar(100)') is not null
begin
	set @xml.modify('  
	  replace value of (/node[contains(@s,"""")]/@action)[1]  
	  with     "u"  
	');
	set @xml.modify('  
	  replace value of (/node[contains(@s,"""")]/@s)[1]  
	  with     substring((/node[contains(@s,"""")]/@s)[1], 2, string-length((/node[contains(@s,"""")]/@s)[1]) - 2)  
	');
end

select @xml
...
Рейтинг: 0 / 0
21.09.2018, 18:38
    #39706260
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить символы в строке?
256k,

Как-то так:
Код: 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.
declare @s varchar(max) = N'<node mumu = "0"/><node action="i" mumu="1" s=""petya""></node><node action="i" mumu="2" s="vasya"></node><node action="x" mumu="3" s="kolya"></node>';

with cte as
(
select
 c.f,
 d.n.value('local-name(.)', 'varchar(100)') as attr_name,
 d.n.value('.', 'varchar(100)') as attr_value,
 dense_rank() over (order by b.n) as r
from
 (
  select
   cast(string_agg(s + case rn % 2 when 0 then '"&quot;' when 1 then '&quot;"' end, '') within group (order by rn) as xml)
  from
   (select value, row_number() over (order by (select 1)) - 1 from string_split(replace(@s, '""', char(1)), char(1))) t(s, rn)
 ) a(x) cross apply
 a.x.nodes('node') b(n) cross apply
 (select charindex('"', b.n.value('@s', 'varchar(100)'))) c(f) cross apply
 b.n.nodes('@*') d(n)
)
select
 cast(string_agg(s, '') within group (order by r) as xml)
from
 (
  select
   r,
   '<node> ' + string_agg(attr_name + ' = "' +
     case
      when attr_name = 'action' and f > 0 then 'u'
      when attr_name = 's' and f > 0 then replace(attr_value, '"', '')
      else attr_value
     end +
   '"', ' ') + '</node>'
  from
   cte
  group by
   r
 ) t(r, s);
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как заменить символы в строке? / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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