存储过程(Stored Procedure)使用(三)
2009-12-14 21:49
169 查看
继第二篇后,后面还使用存储过程实现了其它功能
七 字符串的拆分:
如果存储过程参数只有一个,是nvarchar或varchar等字符串类型,如果有多个字符串,要多次调用此存储过程,这样要多次连接数据库,效率较低,可以把多个字符串组成一个字符串,并有符号分隔开,而在存储过程中对字符串进行拆分,再进行其它操作,这样,只需要调用一次存储过程,效率当然比多次调用高。如下就是如何进行字符串的拆分(字符串是用逗号分隔):
说明一下流程:找到字符串@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条符合条件的记录:
如果N是在SQL中通过其它表查询出来的数值才能确定,则可以先把语句写在变量中,待N确定后再执行它,如下所示。
九 临时表的使用:
如果需要先查询出一堆记录,再从这堆记录中进行取数据,那么用临时表是不错的选择。创建临时表,前表名需要加“#”。格式是:
create table #t(参数名 参数类型),下面是实例,把表A,表B,表C中的名称都查询出来放在临时表中,然后取出临时表的全部名称。
至此,已经将所用到的使用存储过程的功能使用进行了介绍,希望可以帮到初学者,同时也可以记录一下自己学习的过程。呵呵
七 字符串的拆分:
如果存储过程参数只有一个,是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
至此,已经将所用到的使用存储过程的功能使用进行了介绍,希望可以帮到初学者,同时也可以记录一下自己学习的过程。呵呵
相关文章推荐
- SQLServer 存储过程简介与使用方法
- 存储过程的使用
- java中使用jdbc和mybatis调用数据库中的存储过程和函数
- mysql存储过程中in、out、inout参数使用实际案例
- 为什么使用plsql编写存储过程会提高程序的性能?
- [SQL]存储过程的使用
- SD--关于定价过程中的存储顺序的参考结构和参考字段的使用代码跟踪
- MySQL 存储过程中使用动态行转列(列值转换列名)
- 使用 ADO.NET 访问 Oracle 9i 存储过程《收藏MSDN》
- Jorm使用Session实现存储过程和函数的调用
- MySql 存储过程游标使用示例
- 使用C#编写扩展存储过程
- 使用CLR存储过程方便快捷导出数据到Excel
- PL/SQL块或者存储过程中不能执行DDL,可以使用动态SQL
- ADO.NET Entity Framework 如何:使用存储过程定义模型(实体框架)
- sqlserver查找使用了某个字段的所有存储过程
- [PL/SQL]测试存储过程执行超长SQL(使用CLOB变量)
- 存储过程分页的使用
- mysql 存储过程游标的使用及存储过程调用存储过程
- SQL Server中使用表类型参数批量添加和修改的存储过程