SQL Server存储过程Return、output参数及使用技巧



SQL Server目前正日益成为WindowNT操作系统上面最为重要的一种数据库管理系统,随着 SQL Server2000的推出,微软的这种数据库服务系统真正地实现了在WindowsNT/2000系列操作系统一统天下的局面,在微软的操作系统上,没有任何一种数据库系统能与之抗衡,包括数据库领域中的领头羊甲骨文公司的看家数据库Oracle在内。不可否认,SQL Server最大的缺陷就是只能运行在微软自己的操作系统上,这一点是SQL Server的致命点。但在另一方面却也成了最好的促进剂,促使SQL Server在自己仅有的“土地”上面将自己的功能发挥到了极至最大限度的利用了NT系列操作系统的各种潜能!作为SQL Server数据库系统中很重要的一个概念就是存储过程,合理的使用存储过程,可以有效的提高程序的性能;并且将商业逻辑封装在数据库系统中的存储过程中,可以大大提高整个软件系统的可维护性,当你的商业逻辑发生改变的时候,不再需要修改并编译客户端应用程序以及重新分发他们到为数众多的用户手中,你只需要修改位于服务器端的实现相应商业逻辑的存储过程即可。合理的编写自己需要的存储过程,可以最大限度的利用SQL Server的各种资源。下面我们来看看各种编写SQL Server存储过程和使用存储过程的技巧经验。



 



Input 此参数只用于将信息从应用程序传输到存储过程。 



InputOutput 此参数可将信息从应用程序传输到存储过程,并将信息从存储过程传输回应用程序。 



Output 此参数只用于将信息从存储过程传输回应用程序。 



ReturnValue 此参数表示存储过程的返回值。SQL Server 的存储过程参数列表中不显示该参数。它只与存储过程的 RETURN 语句中的值相关联。



  存储过程为主键生成新值后,通常使用存储过程中的 RETURN 语句返回该值,因此用来访问该值的参数类型是 ReturnValue 参数。 



 



1、不带输入参数的简单存储过程


if object_id('up_user') is not null 
  
 
  

    drop proc up_user 
  
 
  

    go 
  
 
  

    create proc up_user 
  
 
  

    as 
  
 
  

    set nocount on 
  
 
  

    delcare @name varchar(10) 
  
 
  

    begin 
  
 
  

    select @name=uname from user 
  
 
  

    end 
  
 
  

    set nocount off 
  
 
  

    go 
  
 
  

    esec up_user 
  
 
  

      
  
 
  
2、带输入参数的简单存储过程
 
  

     if object_id('up_user') is not null 
  
 
  

    drop proc up_user 
  
 
  

    go 
  
 
  

    create proc up_user 
  
 
  

    @id int 
  
 
  

    as 
  
 
  

    set nocount on 
  
 
  

    delcare @name varchar(10) 
  
 
  

    begin 
  
 
  

    select @name=uname from user where  uid=@id 
  
 
  

    end 
  
 
  

    set nocount off 
  
 
  

    go 
  
 
  

    --执行该存储过程 
  
 
  

    esec up_user 1 
  
 
  

      
  
 
  
3、带Return参数的存储过程
 
  

     if object_id('up_user') is not null 
  
 
  

    drop proc up_user 
  
 
  

    go 
  
 
  

    create proc up_user 
  
 
  

    as 
  
 
  

    set nocount on 
  
 
  

    delcare @age int 
  
 
  

    begin 
  
 
  

    select @age=uage from user 
  
 
  

    return @age 
  
 
  

    end 
  
 
  

    set nocount off 
  
 
  

    go 
  
 
  

      
  
 
  

    --执行该存储过程 
  
 
  

    declare @age int 
  
 
  

    exec @age=up_user 
  
 
  

    select @age 
  
 
  

      
  
 
  
4、带output参数的存储过程
 
  

     if object_id('up_user') is not null 
  
 
  

    drop proc up_user 
  
 
  

    go 
  
 
  

    create proc up_user 
  
 
  

    @id int, 
  
 
  

    @name varchar(10) ='' output 
  
 
  

    as 
  
 
  

    set nocount on 
  
 
  

    begin 
  
 
  

    select @name=uname from user where uid=@id 
  
 
  

    end 
  
 
  

    set nocount off 
  
 
  

    go 
  
 
  

      
  
 
  

    --执行该存储过程 
  
 
  

    declare @name varchar(10) 
  
 
  

    exec up_user 2, @name output 
  
 
  

    select @name 
  
 
  

      
  
 
  
5、同时带Return和output参数的存储过程
 
  

    if exists(select name from sysobjects where name='up_user' and type='p') 
  
 
  

    drop proc up_user 
  
 
  

    go 
  
 
  

    create proc up_user 
  
 
  

    @id int, 
  
 
  

    @name varchar(20) output 
  
 
  

    as 
  
 
  

    declare @age int 
  
 
  

    begin 
  
 
  

    select @age=stuage,@name=stuname from stuinfo where uid=@id 
  
 
  

    return @age 
  
 
  

    end 
  
 
  

      
  
 
  

    --执行该存储过程 
  
 
  

    declare @age int 
  
 
  

    declare @name varchar(20) 
  
 
  

    exec @age=up_user 2,@name output 
  
 
  

    select @age,@name 
  
 
  

      
  
 
  
附:SQL Server 系统全局变量
 
  

    @@CONNECTIONS  
  
 
  

    返回自上次启动以来连接或试图连接的次数。 
  
 
  

    @@CURSOR_ROWS  
  
 
  

    返回连接上最后打开的游标中当前存在的合格行的数量(返回被打开的游标中还未被读取的有效数据行的行数) 
  
 
  

    @@DATEFIRST  
  
 
  

    返回每周第一天的数字 
  
 
  

    @@ERROR  
  
 
  

    返回最后执行的SQL 语句的错误代码。 
  
 
  

    @@FETCH_STATUS  
  
 
  

    返回被 FETCH 语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态。 
  
 
  

    @@IDENTITY  
  
 
  

    返回最后插入的标识值 
  
 
  

    @@LANGID  
  
 
  

    返回当前所使用语言的本地语言标识符(ID)。 
  
 
  

    @@LANGUAGE  
  
 
  

    返回当前使用的语言名。 
  
 
  

    @@LOCK_TIMEOUT  
  
 
  

    返回当前会话的当前锁超时设置,单位为毫秒。 
  
 
  

    @@PROCID  
  
 
  

    返回当前过程的存储过程标识符 (ID) 。 
  
 
  

    @@ROWCOUNT  
  
 
  

    返回受上一语句影响的行数。 
  
 
  

    @@SERVERNAME  
  
 
  

    返回运行 的本地服务器名称。 
  
 
  

    @@SPID  
  
 
  

    返回当前用户进程的服务器进程标识符 (ID)。 
  
 
  

    @@TRANCOUNT  
  
 
  

    返回当前连接的活动事务数。 
  
 
  

    @@VERSION  
  
 
  

    返回当前安装的日期、版本和处理器类型。 
  
 
  

    @@CPU_BUSY 
  
 
  

    返回自SQL Server 最近一次启动以来CPU 的工作时间其单位为毫秒 
  
 
  

    @@DATEFIRST 
  
 
  

    返回使用SET DATEFIRST 命令而被赋值的DATAFIRST 参数值SET DATEFIRST,命令用来指定每周的第一天是星期几 
  
 
  

    @@DBTS 
  
 
  

    返回当前数据库的时间戳值必须保证数据库中时间戳的值是惟一的 
  
 
  

    @@ERROR 
  
 
  

    返回执行Transact-SQL 语句的错误代码 
  
 
  

    @@FETCH_STATUS 
  
 
  

    返回上一次FETCH 语句的状态值 
  
 
  

    @@IDLE 
  
 
  

    返回自SQL Server 最近一次启动以来CPU 处于空闭状态的时间长短单位为毫秒 
  
 
  

    @@IO_BUSY 
  
 
  

    返回自SQL Server 最近一次启动以来CPU 执行输入输出操作所花费的时间其单位为毫秒 
  
 
  

    @@LANGID 
  
 
  

    返回当前所使用的语言ID 值 
  
 
  

    @@LANGUAGE 
  
 
  

    返回当前使用的语言名称 
  
 
  

    @@LOCK_TIMEOUT 
  
 
  

    返回当前会话等待锁的时间长短其单位为毫秒 
  
 
  

    @@MAX_CONNECTIONS 
  
 
  

    返回允许连接到SQL Server 的最大连接数目 
  
 
  

    @@MAX_PRECISION 
  
 
  

    返回decimal 和numeric 数据类型的精确度 
  
 
  

    @@NESTLEVEL 
  
 
  

    返回当前执行的存储过程的嵌套级数初始值为0 
  
 
  

    @@OPTIONS 
  
 
  

    返回当前SET 选项的信息 
  
 
  

    @@PACK_RECEIVED 
  
 
  

    返回SQL Server 通过网络读取的输入包的数目 
  
 
  

    @@PACK_SENT 
  
 
  

    返回SQL Server 写给网络的输出包的数目 
  
 
  

    @@PACKET_ERRORS 
  
 
  

    返回网络包的错误数目 
  
 
  

    @@PROCID 
  
 
  

    返回当前存储过程的ID 值 
  
 
  

    @@REMSERVER 
  
 
  

    返回远程SQL Server 数据库服务器的名称 
  
 
  

    @@SERVICENAME 
  
 
  

    返回SQL Server 正运行于哪种服务状态之下如MSSQLServer MSDTC SQLServerAgent 
  
 
  

    @@SPID 
  
 
  

    返回当前用户处理的服务器处理ID 值 
  
 
  

    @@TEXTSIZE 
  
 
  

    返回SET 语句的TEXTSIZE 选项值SET 语句定义了SELECT 语句中text 或image数据类型的最大长度基本单位为字节 
  
 
  

    @@TIMETICKS 
  
 
  

    返回每一时钟的微秒数 
  
 
  

    @@TOTAL_ERRORS 
  
 
  

    返回磁盘读写错误数目 
  
 
  

    @@TOTAL_READ 
  
 
  

    返回磁盘读操作的数目 
  
 
  

    @@TOTAL_WRITE 
  
 
  

    返回磁盘写操作的数目 
  
 
  

    @@TRANCOUNT


返回当前连接中处于激活状态的事务数目



附:SQL Server 常用系统存储过程



exec sp_databases; --查看数据库
exec sp_tables;        --查看表
exec sp_columns student;--查看列
exec sp_helpIndex student;--查看索引
exec sp_helpConstraint student;--约束
exec sp_stored_procedures;
exec sp_helptext 'sp_stored_procedures';--查看存储过程创建、定义语句
exec sp_rename student, stuInfo;--修改表、索引、列的名称
exec sp_renamedb myTempDB, myDB;--更改数据库名称
exec sp_defaultdb 'master', 'myDB';--更改登录名的默认数据库
exec sp_helpdb;--数据库帮助,查询数据库信息
exec sp_helpdb master;




附:SQL Server 常用系统函数



HOST_ID()

返回客户进程中当前主进程的ID号码   select HOST_Id();

HOST_NAME()

返回客户进程中当前主机名

SUSER_SID([‘login_name’])

返回与用户登录名对应的安全标识符(SID)号

SUSER_SNAME([server_user_id])

返回与用户安全标识号对应的登录名

USER_ID([‘name_in_db’])

返回与用户名对应的数据库标识号

USER_NAME([user_id])

返回与数据库标识对应的用户名

DB_ID([‘db_name’])

返回数据库的ID号

DB_NAME([db_id])

返回数据库名

OBJECT_ID(‘objectname’)

返回数据库对象ID号

OBJECT_NAME(‘obj_id’)

返回数据库对象名