2、问题–传入“多个”参数
参考链接:
https://blog.csdn.net/kyleing/article/details/6749703
2.1、问题分析
由于存储过程中没有数组这个概念,因此当我们需要传入多个参数时就得变通一下。
即传入一个字符串,然后利用分隔符将其变为多个参数。
关于sqlever排序的思路主要分为两个方面:传参和排序
- 1.将参数传入到表中:
首先建立一个分割字符的存储过程,将每个参数单独分割出来逐个插入到表中,然后在exec+字符串
传入一组数据,最后select查询验证数据- 是否插入成功。 - 2.对表进行排序:两种方法:
-
- 直接order by
-
- 冒泡排序
在讲解存储过程前,我们先运行我们可能会用到的函数。
declare @a int,@str varchar(10)
select @a=CHARINDEX(',','1,2,3,4') --分隔符第一次的位置
print @a
SELECT @str=LEFT('1,2,3,4',@a-1) --截取从0到@a-1的字符串
print 'LEFT='+@str
SELECT @str=SUBSTRING('1,2,3,4',1,@a-1) --截取从1到@a-1的字符串1
print '直接substring='+@str
SELECT @str=SUBSTRING('1,2,3,4',@a+1,LEN('1,2,3,4')-@a)
print 'substring='
运行结果如下:
2.2、实现步骤
在建立存储过程前,我们先建立一张表,用来存放我们的数据。
create table sort_num
(
id int,
num varchar(100)
)
存储过程1:将参数先进行分割,然后再传入到表中。
CREATE PROCEDURE sort1
@str varchar(100), --传入的字符串
@spot varchar(5) --分割符
as
begin
declare @string varchar(100),@len int
set @string=@str
select @len=CHARINDEX(@spot,@str) --分隔符第一次出现的位置
if @len=0 --没有分隔符
begin
insert into sort_num values(@string)
end
else
begin
while @len <> 0
begin
insert into sort_num values(LEFT(@string,@len-1))
select @string=SUBSTRING(@string,@len+1,LEN(@string)-@len)
select @len=CHARINDEX(@spot,@string)
end
insert into sort_num values(@string)
end
end
go
执行该存储过程:验证我们的数据是否传入进去了。
exec sort1 '6,5,4,3,2,1',','
select * from sort_num order by num
存储过程2:对我们传入到表中的数据进行冒泡排序。(排序那么多为什么偏偏选冒泡呢?别问,问就是把其他都忘了,唉 ~ ,白学系列!)
(睡一觉后的我竟然有了灵感,哈哈哈哈~~~~,)
新修改后已运行的程序如下:
CREATE PROCEDURE sort1
@str varchar(100), --传入的字符串
@spot varchar(5) --分割符
as
begin
declare @string varchar(100),@len int,@id int
set @id=1 --行号
set @string=@str
select @len=CHARINDEX(@spot,@str) --分隔符第一次出现的位置
if @len=0 --没有分隔符
begin
insert into sort_num values(@id,@string)
end
else
begin
while @len <> 0
begin
insert into sort_num values(@id,LEFT(@string,@len-1))
set @id=@id+1
select @string=SUBSTRING(@string,@len+1,LEN(@string)-@len)
select @len=CHARINDEX(@spot,@string)
end
insert into sort_num values(@id,@string)
end
end
go
执行结果:(额,进行了排序,但是愣是没有正确结果,看了很久我也不知道问题在哪,所以就先放放吧!唉~)
exec sort_table
select * from sort_num
2.3、最终代码
后期整改发现上面分为两个存储过程有点麻烦,所以后来就直接把它合并成为一个存储过程了。
CREATE PROCEDURE sort1
@str varchar(100), --传入的字符串
@spot varchar(5) --分割符
as
begin
--字符拆分
declare @string varchar(100),@len int,@id int
set @id=1 --行号
set @string=@str
select @len=CHARINDEX(@spot,@str) --分隔符第一次出现的位置
if @len=0 --没有分隔符,即仅有一个字符时直接插入
begin
insert into sort_num values(@id,@string)
end
else
begin
while @len <> 0
begin
insert into sort_num values(@id,LEFT(@string,@len-1)) --插入@string的第一个分隔符前的字符串
set @id=@id+1 --下一行
select @string=SUBSTRING(@string,@len+1,LEN(@string)-@len) --@string为截取掉第一个字符后的字符串
select @len=CHARINDEX(@spot,@string) ----分隔符在@string出现的第一个位置
end
insert into sort_num values(@id,@string)
end
select * from sort_num
--冒泡排序算法
declare @row int,@i int,@id1 int,@first varchar(100),@last varchar(100)
--set @tablename=@table
set @i=1
set @id1=1
set @row=(select COUNT(*) from sort_num) --获取表的总行数
while @i<=@row --冒泡开始,顺序:从小到大
begin
set @id1=1
while @id1<(@row-@i+1)
begin
set @first = (select num from sort_num where id=@id1)
set @last = (select num from sort_num where id=@id1+1)
if @first>@last --当前面的数大于后面的数是发生位置交换
begin
update sort_num set num=@last where id=@id1
update sort_num set num=@first where id=@id1+1
end
select @id1=@id1+1
end
select @i=@i+1
end
select * from sort_num
end
go
执行存储过程:
exec sort1 '6,5,4,3,2,1',','
输出结果: