使用SQL Server替换函数

Pரத*_*ீப் 3 sql t-sql sql-server replace sql-server-2008

谁能解释为什么Replace功能并不能取代所有出现string_patternstring_replacement

select REPLACE(' A A A A ',' A ',' B ')
Run Code Online (Sandbox Code Playgroud)

输出: B A B A

预期产出: B B B B

select REPLACE('.A.A.A.A.','.A.','.B.')
Run Code Online (Sandbox Code Playgroud)

输出: .B.A.B.A.

预期产量: .B.B.B.B.

在上面的查询中,为什么只替换备用值?

我知道上面的问题可以通过添加一个替换来修复.

select replace(REPLACE('.A.A.A.A.A.A.A.A.A.','.A.','.B.'),'.A.','.B.')
Run Code Online (Sandbox Code Playgroud)

但是,为什么单Replace 并不取代一切的发生string_patternstring_replacement

任何人都可以解释发生了什么?

eli*_*ide 7

第一个空格(或句点)在第一个空格(或句号)之后A计为第一个匹配的一部分.例:

.A.A.A.A.
111 222
Run Code Online (Sandbox Code Playgroud)

1s为第一次匹配,并且2s为第二场比赛.完成第一次更换后,该功能正在查看第二次A,并且不会备份.A.A不是匹配,所以它向前看,看着.A..

换句话说,您正在尝试匹配重叠的字符串.这就像试图取代bobjob在以下几点:

bobob
Run Code Online (Sandbox Code Playgroud)

你期待看到jojob,但这不是它的工作原理.在第一次替换后,你有jobob,但替换功能已经转移到第二次o.它不再看到bobs,所以它停止了.