需要这样的一个存储过程:输入姓名,性别,年龄,但是同时输入的人数是不一样的,有时同时输入一个人的信息,有时同时输入五个人的信息,请问怎么做?

bolome 2008-09-26 09:50:00
需要这样的一个存储过程:输入姓名,性别,年龄,但是同时输入的人数是不一样的,有时同时输入一个人的信息,有时同时输入五个人的信息,最多六个人同时输入,
请问怎么做?
是设置六组输入参数,然后判断有几组就就输入几组吗?有没有别的好的方法,像购物车的存储过程也是不知道一次有多少东西输入的,它是怎么做的?
name_1,sex_1,age_1
name_2,sex_2,age_2
name_3,sex_3,age_3
name_4,sex_4,age_4
name_5,sex_5,age_5
name_6,sex_6,age_6
...全文
270 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
bolome 2008-10-05
  • 打赏
  • 举报
回复
好谢谢。前端做有什么好思路?
lisypro 2008-09-29
  • 打赏
  • 举报
回复
只有在前端做,用SQL
储实现会很不好
水族杰纶 2008-09-27
  • 打赏
  • 举报
回复
set nocount on
if object_id('dbo.fn_split')is not null drop function dbo.fn_split --自定义函数
go
create function dbo.fn_split
(
@inputstr varchar(8000),
@seprator varchar(10)
)
returns @temp table (a varchar(200))
as

begin
declare @i int

set @inputstr = rtrim(ltrim(@inputstr))
set @i = charindex(@seprator, @inputstr)

while @i >= 1
begin
insert @temp values(left(@inputstr, @i - 1))

set @inputstr = substring(@inputstr, @i + 1, len(@inputstr) - @i)
set @i = charindex(@seprator, @inputstr)
end

if @inputstr <> '\'
insert @temp values(@inputstr)

return
end
go
if object_id('P_Info')is not null drop table P_Info -->测试表
go
create table P_Info(name varchar(5),sex varchar(5),age varchar(10),[Work] varchar(10),Meno varchar(10) )
insert P_Info select '张三','男',18,'医生','好医生'
insert P_Info select '王三','男',28,'教师','高级教师'
insert P_Info select '赵三','女',38,'IT','没什么出息'
go
if object_id('P_GetInfo')is not null drop proc P_GetInfo --定义存储过程
go
create proc P_GetInfo
@Name varchar(50),
@Sex varchar(20),
@Age varchar(20)
as
set nocount on
declare @t1 table(ID int identity(1,1),name varchar(5))
declare @t2 table(ID int identity(1,1),Sex varchar(5))
declare @t3 table(ID int identity(1,1),age varchar(5))
insert @t1 select * from dbo.fn_split(@Name,',')
insert @t2 select * from dbo.fn_split(@Sex,',')
insert @t3 select * from dbo.fn_split(@age,',')
select P.* from P_Info p inner join @t1 t1 on p.name=t1.name
inner join @t2 t2 on p.Sex=t2.Sex
inner join @t3 t3 on p.age=t3.age
and t1.id=t2.id and t2.id=t3.id
go
exec P_GetInfo '张三,赵三','男,女','18,38'
/*
name sex age Work Meno
----- ----- ---------- ---------- ----------
张三 男 18 医生 好医生
赵三 女 38 IT 没什么出息*/
bolome 2008-09-26
  • 打赏
  • 举报
回复
类似订单号的
-晴天 2008-09-26
  • 打赏
  • 举报
回复
你说的这个ID是什么?
bolome 2008-09-26
  • 打赏
  • 举报
回复
有个想法:
存储过程只有一组参数,先在前台只输入一组数据执行一次存储过程得到一个惟一的ID,然后看有N组就循环N-1次存储过程,ID相同就可以了!
-狙击手- 2008-09-26
  • 打赏
  • 举报
回复
这种规则还是放在前端应用检验的好,
dawugui 2008-09-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 bolome 的帖子:]
需要这样的一个存储过程:输入姓名,性别,年龄,但是同时输入的人数是不一样的,有时同时输入一个人的信息,有时同时输入五个人的信息,最多六个人同时输入,
请问怎么做?
是设置六组输入参数,然后判断有几组就就输入几组吗?有没有别的好的方法,像购物车的存储过程也是不知道一次有多少东西输入的,它是怎么做的?
name_1,sex_1,age_1
name_2,sex_2,age_2
name_3,sex_3,age_3
name_4,sex_4,age_4
name_5,sex_5,age_5
name…
[/Quote]
你这个严格意义上来说,放在SQL里面来做有点吃力不讨好.一般是用程序来完成.
但SQL也可以完成,传入一个串,然后来分解.
例如:"姓名1,性别1,年龄1"--这是一个人的.
"姓名1,性别1,年龄1;姓名2,性别2,年龄2"--这是两个人的.
"姓名1,性别1,年龄1;姓名2,性别2,年龄2;姓名3,性别3,年龄3"--这是三个人的.
依此类推.先按';'分解,然后再按','分解.给你一个分解的函数,然后自己改改即可.
/*
功能:实现split功能的函数
*/

create function dbo.fn_split
(
@inputstr varchar(8000),
@seprator varchar(10)
)
returns @temp table (a varchar(200))
as

begin
declare @i int

set @inputstr = rtrim(ltrim(@inputstr))
set @i = charindex(@seprator, @inputstr)

while @i >= 1
begin
insert @temp values(left(@inputstr, @i - 1))

set @inputstr = substring(@inputstr, @i + 1, len(@inputstr) - @i)
set @i = charindex(@seprator, @inputstr)
end

if @inputstr <> '\'
insert @temp values(@inputstr)

return
end
go

--调用

declare @s varchar(1000)

set @s='1,2,3,4,5,6,7,8,55'

select * from dbo.fn_split(@s,',')

drop function dbo.fn_split
bolome 2008-09-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qianjin036a 的回复:]
你可以设置默认值为NULL,有几个人就使用几组参数,没有的就为默认值.在过程中判断参数不为NULL时再插入.
[/Quote]
没有更好的方法吗?
Garnett_KG 2008-09-26
  • 打赏
  • 举报
回复
2000 & 2005可以传字符串,或xml,在存储过程里面解析。

CREATE PROC spXXX @NameList XML
AS
DECLARE @r TABLE(Name varchar(10),age int,sex bit)
....
INSERT INTO @r
SELECT *
FROM OPENXML (....)





2008则可以传table变量了.
bolome 2008-09-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qianjin036a 的回复:]
试试传递表变量?
[/Quote]
 不明白是什么意思?
-晴天 2008-09-26
  • 打赏
  • 举报
回复
你可以设置默认值为NULL,有几个人就使用几组参数,没有的就为默认值.在过程中判断参数不为NULL时再插入.
-晴天 2008-09-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qianjin036a 的回复:]
试试传递表变量?
[/Quote]

呵呵...不行...
wxg22526451 2008-09-26
  • 打赏
  • 举报
回复
应该是个字符串,记录间加分隔符,
在程序中先用分隔符分离出所有输入的记录再处理
-晴天 2008-09-26
  • 打赏
  • 举报
回复
试试传递表变量?

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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