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

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

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

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


Как такое сделать?
...
Рейтинг: 0 / 0
Как заменить символы в строке?
    #39706111
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прочитать в хелпе про ф-цию replace()
...
Рейтинг: 0 / 0
Как заменить символы в строке?
    #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
Как заменить символы в строке?
    #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
Как заменить символы в строке?
    #39706164
256k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxxпрочитать в хелпе про ф-цию replace()

даладно, одной функцией не отделаться
...
Рейтинг: 0 / 0
Как заменить символы в строке?
    #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
Как заменить символы в строке?
    #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
Как заменить символы в строке?
    #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
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как заменить символы в строке?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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