日期:2014-05-18  浏览次数:20544 次

菜鸟请教存储过程该怎么写
sql   数据库中有这么一张用户表
User_ID   User_Name
1               张三
2               李四
3               李红

用其他地方(比如excel)通过转换获得这么两个字符串
  Field_name   =   "姓名,性别,年龄 "
 
  Values           =   "张三,男,12;李四,男,33;李红,女,22; "

想通过存储过程用以下格式写入数据库中

字段名:     a         b         User_ID
                  张三   姓名   1
                  男       性别   1
                  12       年龄   1
                  李四   姓名   2
                  男       性别   2
                  33       年龄   2                
                  李红   姓名   3
                  女       性别   3
                  22       年龄   3
要如何做呢

------解决方案--------------------
create function uf_splitstring
(
@str varchar(8000) --要分拆的字符串
,@spli varchar(10) --字符串分隔符
)
returns @retab table(a varchar(100),b varchar(100),user_id int)
as
begin
declare @i int
declare @splen int
declare @user_id int
select @splen=len(@spli),@i=charindex(@spli,@str)
while @i > 0
begin
select @user_id =user_id from 用户表 where user_name=left(@str,@i-1)
insert into @retab(a,b,user_id)
values(left(@str,@i-1),case when datalength(left(@str,@i-1))> 2 then '姓名 ' when left(@str,@i-1) in ( '男 ', '女 ') then '性别 ' else '年龄 ' end,@user_id)
select @str=substring(@str,@i+@splen,8000)
select @i=charindex(@spli,@str)
end
if @str <> ' ' insert into @retab(a) values(@str)
return
end

declare @values varchar(8000)
--将分号,全角逗号替换为半角逗号
select @Values = replace(replace( '张三,男,12;李四,男,33;李红,女,22; ', '; ', ', '), ', ', ', ')
--结果输出
select * from uf_splitstring(@Values, ', ')
------解决方案--------------------
create procedure sp_test(@str varchar(1000))
as
begin
create table #t(id int identity(1,1),name varchar(8),sex varchar(8),age varchar(8))

declare @t table(a varchar(10),b varchar(10),User_ID int)

declare @tmp varchar(1000)

while charindex( '; ',@str)> 0
begin
select
@tmp=left( @str,charindex( '; ',@str)-1) ,
@str=stuff(@str,1,charindex( '; ',@str), ' ')

set @tmp= 'insert into #t(name,sex,age) select ' ' '+replace(@tmp, ', ', ' ' ', ' ' ')+ ' ' ' '
exec(@tmp)
end

insert into @t
select name, '姓名 ' as b,id from #t union select sex, '性别 ',id from #t union select age