使用存储过程插入多条记录

macrohui29 2014-07-09 11:45:40
1.传递过来多个用户名和一个组号(如z1,z2,z3;101),用户名间用逗号分隔,如z1,z2,z3,两个数据间用;分隔
2.每个用户名要在User表(ID自编号)中查找是否存在(用户名字段为UserName),如果不存在则做
(1)在表USERS中插入记录(假设生成记录ID为10,11,设Z3存在,不插入
(2)从Group表中,读取所有groupcode为101的记录
数据格式为
ID groupcode perid
1 101 3
2 202 4
3 101 6
4 101 7
5 202 8
(3)在assess表中插入相应记录
userid perid
10 3
10 6
10 7
11 3
11 6
11 7
要求用事务提交,返回插入USER表中的记录数2
...全文
190 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2014-07-09
  • 打赏
  • 举报
回复

-- 建[User]表
create table [User]
(ID int identity(1,1),
 UserName varchar(10))

insert into [User](UserName)
 select 'Z3'


-- 建[Group]表
create table [Group]
(ID int,groupcode int,perid int)

insert into [Group]
 select 1,101,3 union all
 select 2,202,4 union all
 select 3,101,6 union all
 select 4,101,7 union all
 select 5,202,8 


-- 建assess表
create table assess
(userid int,perid int)


-- 建存储过程
create proc sp0709
(@x varchar(100))
as
begin
 set nocount on
 declare @userlist varchar(100),@groupname varchar(100)
 
 select @userlist=substring(@x,1,charindex(';',@x,1)-1),
        @groupname=substring(@x,charindex(';',@x,1)+1,100)

 create table #t(ID int,UserName varchar(10))

 set xact_abort on
 begin tran
 
 insert into [User](UserName)
 output inserted.* into #t
 select t1.UserName
  from
  (select substring(a.s,b.number,charindex(',',a.s+',',b.number)-b.number) 'UserName'
   from (select @userlist 's') a,master.dbo.spt_values b
   where b.type='P' and b.number between 1 and len(a.s)
   and substring(','+a.s,b.number,1)=',') t1
  left join [User] t2 on t1.UserName=t2.UserName
  where t2.UserName is null

 insert into assess(userid,perid)
  select a.ID,b.perid
   from #t a
   cross join
   (select perid 
    from [Group]
    where groupcode=@groupname) b
 
 commit tran
 
 select * from #t
end


-- 执行
exec sp0709 @x='z1,z2,z3;101'


-- 存储过程返回结果
/*
ID          UserName
----------- ----------
2           z1
3           z2
*/


-- 表数据结果
select * from [User]
/*
ID          UserName
----------- ----------
1           Z3
2           z1
3           z2

(3 row(s) affected)
*/


select * from assess
/*
userid      perid
----------- -----------
2           3
2           6
2           7
3           3
3           6
3           7

(6 row(s) affected)
*/
无涯大者 2014-07-09
  • 打赏
  • 举报
回复

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧