今天在论坛看到一个帖子,觉得很好玩,就去弄了一下。问题是这样的。
有张 Log表
User表
需要实现的效果是
我用的存储过程来实现的
create proc Ganker
as
declare @num int
set @num=0
declare @str1 varchar(50)
declare @str2 varchar(50)
declare @i int
declare @j int
declare @val1 varchar(50)
declare @val2 varchar(50)
declare @name1 varchar(50)
declare @name2 varchar(50)
declare @txt varchar(100)
declare @count int
select @count=COUNT(*) from [log]
begin
while(@count>=@num+1)
begin
select top(1) @str1=Title from [Log] where id not in (select top(@num) id from [Log]) -- 一次读取一条数据
set @i=charindex('{',@str1)--获取第一个前括号
set @j=CHARINDEX('}',@str1)-- 获取第一个后括号
set @val1=substring(@str1,@i+1,@j-@i-1)-- 获取括号里面的 UserID
set @str1=SUBSTRING(@str1,@j+1,len(@str1)-@j+1)-- 获取去除括号后的Title
set @i=CHARINDEX('{',@str1) -- 在去除第一个括号后 再次截取'{' 看是否有值
if(@i=0) --为0说明 没有括号了
begin
select @name1=name from [User] where UserID=@val1 --根据ID 获取 名字
set @txt=@name1+@str1
print @txt
end
else --如果不为0 说明还有括号
begin
set @str2=SUBSTRING(@str1,1,@i-1) --截取 两个括号之间的文字
set @j=CHARINDEX('}',@str1) --获取后一个括号的'}'
set @val2=substring(@str1,@i+1,@j-@i-1) --获取第二个括号内的 UserId
select @name1=name from [User] where UserID=@val1 --获取第一个括号里UserID的名字
select @name2=name from [User] where UserID=@val2 --获取第二个括号里UserID的名字
if(@j<LEN(@str1)) -- 如果后一个括号的长度 < 截取后title的长度 说明'}'后面还有内容
begin
set @str1=SUBSTRING(@str1,@j+1,len(@str1)-@j+1) --获取第二个括号后面的内容
set @txt=@name1+@str2+@name2+@str1
print @txt
end
else -- 如果后一个括号的长度 = 截取后title的长度 说明'}'后面没有内容了
begin
set @txt = @name1+@str2+@name2
print @txt
end
end
set @num=@num+1
end
end
贴出来,分享一下。