一个关于sql语句的问题解决,包括:字符串拆分,游标

来源:互联网 发布:js作用域和this关键字 编辑:程序博客网 时间:2024/05/21 17:38

已知stu表和h表,需要形成o_h表

stu表:学生表(姓名,所有爱好)                                h表:兴趣表(id,所有爱好)                                      

         

o_h表:学生爱好表(id,爱好,姓名)

   

基本思路:逐行读取h表,依据','拆分hobby字段的字符串,将拆分后的字符串添加到新的表m_h表,eg:c++,插入前要先判断是否已经存在该表中,若是不存在,则有以下操作:1.插入m_h表   2.向o_h表批量插入hobby中有C++的数据

m_h表:中间生成的表,(id,爱好)


1.游标

 参考:http://www.cnblogs.com/wudiwushen/archive/2010/03/30/1700925.html

 问题:逐行读取

 示例:逐行读取h表

--声明变量
declare @hobby nvarchar(50)
--声明游标
declare mycursor cursor for select hobby from h
--打开游标
open mycursor
--从游标里取出数据赋值到我们@hobby中
fetch next from mycursor into @hobby
--判断游标的状态
while(@@FETCH_STATUS=0)
begin
 --处理
 print @hobby
 --用游标取下一条记录
 fetch next from mycursor into @hobby
end
--关闭游标
close mycursor
--撤销游标
deallocate mycursor

2.字符串拆分

参考:http://blog.csdn.net/tastelife/article/details/7914646

http://msdn.microsoft.com/zh-cn/library/ms188043.aspx


实现:

delete from m_h
delete from s_h
--声明变量
declare @hobby nvarchar(50)
declare @count int
declare @h nvarchar(50)
--声明游标
declare mycursor cursor for select hobby from h
--打开游标
open mycursor
--从游标里取出数据赋值到我们@hobby中
fetch next from mycursor into @hobby
--判断游标的状态
while(@@FETCH_STATUS=0)
begin
--处理
print @hobby
while(CHARINDEX(',',@hobby)<>0)
begin
set @h=SUBSTRING(@hobby,1,CHARINDEX(',',@hobby)-1)
--判断@h是否在表m_h中存在
select @count=COUNT(*) from m_h where hobby=@h
if(@count=0)
begin
--插入m_h表中
insert into m_h (hobby) values (@h)
--批量插入s_h表符合@h的项
insert into s_h (hobby,name) select @h,name from stu where hobby like '%'+@h+'%'
end
--截取剩余的字符串重新赋值给@hobby
set @hobby = STUFF(@hobby,1,CHARINDEX(',',@hobby),'')
end
--和@h一样处理@hobby
select @count=COUNT(*) from m_h where hobby=@hobby
if(@count=0)
begin
insert into m_h (hobby) values (@hobby)
insert into s_h (hobby,name) select @hobby,name from stu where hobby like '%'+@hobby+'%'
end
 --用游标取下一条记录
 fetch next from mycursor into @hobby
end
--关闭游标
close mycursor
--撤销游标
deallocate mycursor



 

 

0 0
原创粉丝点击