剖析SQLsever之02-冒泡排序-sqlsever存储过程

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',','

输出结果:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值