我在列中有以下字符串:
<effect effrg="001003"> </effect>
我想删除两个标签之间的空格。
有没有办法做到这一点?
答案 0 :(得分:2)
我认为这会对你有所帮助:
if OBJECT_ID('tempdb..#t') is not null drop table #t
create table #t (x xml)
insert into #t(x)
values('<effect effrg="001003"> </effect>')
UPDATE #t
SET x.modify('replace value of
(/effect/text())[1] with ("")')
您还可以查看示例here
答案 1 :(得分:0)
您可以使用stuff
函数删除标记之间的字符(通过替换为空字符串),并使用charindex
函数两次查找第一个标记的结尾和开头第二。
UPDATE语句变为
update [table] set [colname] = stuff([colname], charindex('>',[colname],1)+1, charindex('</',[colname],1)-charindex('>',[colname],1)-1, '')
答案 2 :(得分:0)
您可以使用简单的递归查询来解决此问题。递归查询将通过文本字段重复,直到没有剩余空格。
;WITH data
AS (SELECT *,
Row_number()
OVER (
ORDER BY [text]) RN
FROM table1),
recurs
AS (SELECT Replace([text], ' ', '') [text],
rn
FROM data
UNION ALL
SELECT Replace(T1.[text], ' ', '') [text],
T1.rn
FROM recurs T1
INNER JOIN data T2
ON T1.rn = T2.rn
AND Charindex(T1.[text], ' ') > 0)
SELECT *
FROM recurs
您可以在 SQL Fiddle 上找到一个有效的例子。
<强>被修改强>
为了保留括号内的空格,需要添加一个小的更改(总共添加4个字符):
;WITH data
AS (SELECT *,
Row_number()
OVER (
ORDER BY [text]) RN
FROM table1),
recurs
AS (SELECT Replace([text], '> ', '>') [text],
rn
FROM data
UNION ALL
SELECT Replace(T1.[text], '> ', '>') [text],
T1.rn
FROM recurs T1
INNER JOIN data T2
ON T1.rn = T2.rn
AND Charindex(T1.[text], ' ') > 0)
SELECT *
FROM recurs
您也可以在 SQL Fiddle 上找到此版本的工作示例。
答案 3 :(得分:0)
你可以用这个很酷的技巧来做到这一点:
Declare @s nvarchar(100) = '<effect effrg="001003"> </effect>'
Select replace(replace(replace(replace(@s, ' ', '[]'), '][', ''), '>[]<', '><'), '[]', ' ')
输出:
<effect effrg="001003"></effect>