首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

初学者请问存储过程该如何写

2012-03-16 
菜鸟请教存储过程该怎么写sql数据库中有这么一张用户表User_IDUser_Name1张三2李四3李红用其他地方(比如ex

菜鸟请教存储过程该怎么写
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, '年龄 ',id from #t




select * from @t order by User_ID,(case b when '姓名 ' then 1 when '性别 ' then 2 else 3 end)
end
go

exec sp_test '张三,男,12;李四,男,33;李红,女,22; '
/*
a b User_ID
---------- ---------- -----------
张三 姓名 1
男 性别 1
12 年龄 1
李四 姓名 2
男 性别 2
33 年龄 2
李红 姓名 3
女 性别 3
22 年龄 3
*/
go

drop procedure sp_test
go

热点排行