您的位置:首页 > 其它

存储过程(Stored Procedure)使用(三)

2009-12-14 21:49 169 查看
继第二篇后,后面还使用存储过程实现了其它功能
七 字符串的拆分:
如果存储过程参数只有一个,是nvarchar或varchar等字符串类型,如果有多个字符串,要多次调用此存储过程,这样要多次连接数据库,效率较低,可以把多个字符串组成一个字符串,并有符号分隔开,而在存储过程中对字符串进行拆分,再进行其它操作,这样,只需要调用一次存储过程,效率当然比多次调用高。如下就是如何进行字符串的拆分(字符串是用逗号分隔):

-- =============================================
-- Author:		masson
-- Create date: 2009-12-14
-- Description:	拆分字符串
-- =============================================
CREATE PROCEDURE testSplit
@Name nvarchar(max)  --字符串用逗号分隔
AS
declare @charind int,@lengh int
declare @NameStr nvarchar(300)
BEGIN
set @charind = charindex(',',@Name) –-分隔符位置
while @charind >0  –- 大于0表示存在此分隔符
BEGIN
set @lengh = len(@Name) –- 字符串总长度
set @NameStr = left(@Name,@charind-1) –-取得一个字符串,@charind-1表示除去分隔符
print @NameStr –- 输出信息
set @Name = right(@Name,@lengh - @charind) –减去已经取得的字符串
set @charind = charindex(',', @Name) --移动下标
if(@charind =0) ––处理最后一个字符串
BEGIN
print @NameStr–- 输出信息
END
END
END


说明一下流程:找到字符串@Name中第一个分隔符“,”的位置,在SQL中,字符串的位置是从1开始的(要与C#中的字符串起始位置区别开来)。然后把此分隔符前的字符串取出,此字符串就是第一个需要的字符串,把字符串@Name减去已经取得的字符串及其分隔符。这样,再重新对已经减去取得字符串的字符串进行操作,不断重复。直到最后一个字符串,此字符串没有分隔符,它本身就是需要取的字符串。

这里几个函数要说明一下:
(1)charindex(分隔符,字符串):取得指定的分隔符在字符串中的第一个位置。返回int,如字符串,”abc,efg,hij”,调用charindex(’,’,’ abc,efg,hij’),则返回4。如果没有匹配的分隔符,则返回0.
(2)left(字符串,左起N个字符),返回此字符串左起N个字符。如调用left(abcdefg,3),则返回abc
(3)right((字符串,右起N个字符),返回此字符串右起N个字符。如调用right(abcdefg,3),则返回efg。

八 随机选择表中记录:
如果需要从表中随机选择N条记录返回,则需要用到order by newid()。具体格式如下:
select top N * from tableName order by newid()。
注意,在这里,N是一个已经确定的数,即在调用之前已经确定N的值。*表示要选择的表的列,可以添加where语句进行在符合条件的行中随机选择。如下面所示,从A表中随机选择2条符合条件的记录:

-- =============================================
-- Author:		masson
-- Create date: 2009-12-14
-- Description:	随机选择1
-- =============================================
CREATE PROCEDURE testNewid
@name nvarchar(20)
AS
BEGIN
select TOP 2 * from A where Name = @name order by newid()
END

如果N是在SQL中通过其它表查询出来的数值才能确定,则可以先把语句写在变量中,待N确定后再执行它,如下所示。
-- =============================================
-- Author:		masson
-- Create date: 2009-12-14
-- Description:	随机选择2
-- =============================================
CREATE PROCEDURE testNewid
@name nvarchar(20)
AS
declare @s nvarchar(max), @n int
BEGIN
Select @n = Num from B where Name=@name  -- 取得数量N
set @s = ' select top '+cast(@n as nvarchar(50))+ ' * from A where Name=’ +@name + ‘ order by newid() '—把select语句写在变量中
exec (@s) – 执行
END


九 临时表的使用:

如果需要先查询出一堆记录,再从这堆记录中进行取数据,那么用临时表是不错的选择。创建临时表,前表名需要加“#”。格式是:
create table #t(参数名 参数类型),下面是实例,把表A,表B,表C中的名称都查询出来放在临时表中,然后取出临时表的全部名称。

-- =============================================
-- Author:		masson
-- Create date: 2009-12-14
-- Description:	临时表
-- =============================================
CREATE PROCEDURE testTempTable
AS
BEGIN
Select @n = Num from B where Name=@name  -- 取得数量N
set @s = create table #t(name varchar())’ +' insert into #t select Name from A '+' insert into #t select Name form B ’ +' insert into #t select Name form C ’ +' select * from #t’—-把语句写在变量中
exec (@s) – 执行,返回临时表中的全部记录
END


至此,已经将所用到的使用存储过程的功能使用进行了介绍,希望可以帮到初学者,同时也可以记录一下自己学习的过程。呵呵
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: