搜索和替换序列化DB转​​储

时间:2012-09-16 10:04:05

标签: sql regex database serialization

我正在将数据库从一台服务器移动到另一台服务器,并且在那里有大量的序列化数据。所以,我想知道:

是否可以使用regex替换所有出现的内容,例如以下(和类似的)

s:22:\"http://somedomain.com/\"  
s:26:\"http://somedomain.com/abc/\" 
s:29:\"http://somedomain.com/abcdef/\"

s:27:\"http://someOtherdomain.com/\"  
s:31:\"http://someOtherdomain.com/abc/\"  
s:34:\"http://someOtherdomain.com/abcdef/\"  

1 个答案:

答案 0 :(得分:1)

如果包含这些数据的列具有相同的长度,并且这些出现22, 26, 29,...与字符串的开头位于相同的位置。然后,对于SQL Server,您可以使用REPLACESUBSTRINGCHARINDEX来执行此操作:

DECLARE @s VARCHAR(50);
DECLARE @sub INT;
SET @s = 's:27:\"http://somedomain.com/\"';
SET @sub = CONVERT(INT, SUBSTRING(@s, CHARINDEX(':', @s) + 1, 2));
SELECT REPLACE(REPLACE(@s, 'somedomain', 'someOtherdomain'), @sub, @sub + 5);

因此s:number:\"http://somedomain.com/\"将成为s:number + 5:\"http://someOtherdomain.com/\"

如果您想对该表运行UPDATE,可以这样写:

UPDATE @t 
SET s = REPLACE(REPLACE(s, 'somedomain', 'someOtherdomain'), 
            CONVERT(INT, SUBSTRING(s, CHARINDEX(':', s) + 1, 2)),
            CONVERT(INT, SUBSTRING(s, CHARINDEX(':', s) + 1, 2)) + 5);

此查询的作用是,它搜索somedomain的匹配项并将其替换为someOtherdomain,获取前两个:之间的数字,将其转换为到INT并将其替换为相同的数字+ 5。以下是运行上一个查询后数据的样子:

s:27:\"http://someOtherdomain.com/\"
s:31:\"http://someOtherdomain.com/abc/\"
s:34:\"http://someOtherdomain.com/abcdef/\"

这是Live Demo