什么是更换所有“&LT”的最好办法<
在给定的数据库列? 基本上执行s/<[^;]/</gi
笔记:
- 必须上班的MS SQL Server 2000
- 必须是可重复(并且不与最终
<;;;;;;;;;
)
什么是更换所有“&LT”的最好办法<
在给定的数据库列? 基本上执行s/<[^;]/</gi
笔记:
<;;;;;;;;;
) 有些黑客必需的,但我们可以用LIKE,PATINDEX, 左 , 右和良好的老字符串连接做到这一点。
create table test
(
id int identity(1, 1) not null,
val varchar(25) not null
)
insert into test values ('< <- ok, < <- nok')
while 1 = 1
begin
update test
set val = left(val, patindex('%<[^;]%', val) - 1) +
'<' +
right(val, len(val) - patindex('%<[^;]%', val) - 2)
from test
where val like '%<[^;]%'
IF @@ROWCOUNT = 0 BREAK
end
select * from test
更好的是,这是SQL Server版本无关,应该只是罚款。
我认为这是可以做到,如果你使用不同的STUFF干净多了:)
create table test
(
id int identity(1, 1) not null,
val varchar(25) not null
)
insert into test values ('< <- ok, < <- nok')
WHILE 1 = 1
BEGIN
UPDATE test SET
val = STUFF( val , PATINDEX('%<[^;]%', val) + 3 , 0 , ';' )
FROM test
WHERE val LIKE '%<[^;]%'
IF @@ROWCOUNT = 0 BREAK
END
select * from test
怎么样:
UPDATE tableName
SET columName = REPLACE(columName , '<', '<')
WHERE columnName LIKE '%lt%'
AND columnName NOT LIKE '%lt;%'
编辑:
我才意识到这会忽略与部分正确列<
字符串。
在这种情况下,你可以忽略where子句的第二部分和后来称之为:
UPDATE tableName
SET columName = REPLACE(columName , '<;', '<')
本文介绍如何创建一个简单的正则表达式替换,你可以在SQL 2000(和2005年通过简单的调整)的使用,可以帮助你的功能。
如果MSSQL的正则表达式的味道支持负先行,这将是正确的方式来处理这一点。
s/<(?!;)/</gi
将捕获&LT其后面没有的所有实例; (即使他们后面什么都没有,这[^;]将错过),并没有捕捉到以下非; 字符作为比赛的一部分,消除了对人物的原题的评论中提到的问题被丢在了更换。
不幸的是,我不使用MSSQL,所以我不知道它是否支持负超前或不...
非常具体的这种模式,但我在过去做过类似这样:
REPLACE(REPLACE(columName, '<', '<'), '<', '<')
更广泛的例子(其可以在一个TITLE属性是不适当的编码字符)
REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
columName
-- Remove existing encoding:
, '&', '&')
, '"', '"')
, ''', '''')
-- Reinstate/Encode:
, '&', '&')
-- Encode:
, '"', '"')
, '''', ''')
, ' ', '%20')
, '<', '%3C')
, '>', '%3E')
, '/', '%2F')
, '\', '%5C')