再谈存储过程

存储过程
1。返回不同的值,区别错在什么地方
create proc procaddperson
(@userid vchar(40),@name varchar(40),@titile varchar(40),@password varchar(40))
as
begin
  if exists(select * from tableperson where userid=@userid)
  begin
     rollback tran
     return 10 ---人已存在
  end
  insert into tableperson(userid,name,title,password)
  values(@userid,@name,@title,convert(varbinary(300),@password))
  if @@error<>0
  begin
     rollback tran
     return 20 --意外错误
  end else
  begin
    commit tran
    return 1
  end 
2.取得自增编号,以便利用
  在 insert 后
  select @@identify  
3.创建临时表
create procedure sumlogin 
as
  declare @count int
  set @count=0
 create table #temp
  (spid smallint,
   ecid smallint,
   status nchar(30),
   loginname nchar(128),
   hostname nchar(128),
   blk char(5),
   dbname nchar(128),
   cmd nchar(16)
 )
  insert into #temp exec sp_who
  select @count=count(*) from #temp where upper(dbname)=upper(''fmeca'') and 
  status=''sleeping''
  return @count
4.当存储过程返回表时,调用要用 open而不要用execsql
5。更新字段,当调用存储过程更新字段,而字段数目又不确定时
    有的字段要更新,有的要保留,有时要全部更新,每次更新的不一定时
   create proc updatetable (@f1 varchar(100),@f2 varchar(100)....)
  as
    update tabelname
   set 
     field1=isnull(@f1,filed1),
     field2=isnull(@f2,field2)
    .....
   from tablename 
   当不想更新时就传null对应相应的字段。
6.select ,update 不能直接调用存储过程,insert可以,见前面的例子
7。使用带一个变量的 EXECUTE ''tsql_string'' 语句
这个例子显示 EXECUTE 语句如何处理动态生成的、含有变量的字符串。这个例子创建 tables_cursor 游标来保存所有用户定义表 (type = U) 的列表。
说明  此例子只用作举例。
DECLARE tables_cursor CURSOR
   FOR
   SELECT name FROM sysobjects WHERE type = ''U''
OPEN tables_cursor
DECLARE @tablename sysname
FETCH NEXT FROM tables_cursor INTO @tablename
WHILE (@@FETCH_STATUS <> -1)
BEGIN
   /* A @@FETCH_STATUS of -2 means that the row has been deleted.
   There is no need to test for this because this loop drops all
   user-defined tables.   */.
   EXEC (''DROP TABLE '' + @tablename)  
   FETCH NEXT FROM tables_cursor INTO @tablename
END
PRINT ''All user-defined tables have been dropped from the database.''
DEALLOCATE tables_cursor
8.访问不同的表
  create proc dynamictable  @tablename  varchar(50)
as
  declare @ssql varchar(200)
  set @ssql=''select * from ''+@tablename 
  exec(@ssql)
9.使用带远程存储过程的 EXECUTE 语句
这个例子在远程服务器 SQLSERVER1 上执行 checkcontract 存储过程,在 @retstat 中保存返回状态,说明运行成功或失败。

DECLARE @retstat int
EXECUTE @retstat = SQLSERVER1.pubs.dbo.checkcontract ''409-56-4008''

10.使用带扩展存储过程的 EXECUTE 语句
下例使用 xp_cmdshell 扩展存储过程列出文件扩展名为 .exe 的所有文件的目录。

USE master
EXECUTE xp_cmdshell ''dir *.exe''

11.使用带一个存储过程变量的 EXECUTE 语句
这个例子创建一个代表存储过程名称的变量。

DECLARE @proc_name varchar(30)
SET @proc_name = ''sp_who''
EXEC @proc_name

12.使用带 DEFAULT 的 EXECUTE 语句
这个例子创建了一个存储过程,过程中第一个和第三个参数为默认值。当运行该过程时,如果调用时没有传递值或者指定了默认值,这些默认值就会赋给第一个和第三个参数。注意 DEFAULT 关键字有多种使用方法。 

USE pubs
IF EXISTS (SELECT name FROM sysobjects 
      WHERE name = ''proc_calculate_taxes'' AND type = ''P'')
   DROP PROCEDURE proc_calculate_taxes
GO
-- Create the stored procedure.
CREATE PROCEDURE proc_calculate_taxes (@p1 smallint = 42, @p2 char(1), 
      @p3 varchar(8) = ''CAR'')
    AS 
   SELECT * 
   FROM mytable
13.使用多个参数与一个输出参数
    [B] 存储过程的return好像只能返回整数,要想返回浮点数,要用output[/B]
    这个例子执行 roy_check 存储过程,传递三个参数。第三个参数 @pc 是输出参数。过程 执行完后,返回变量可以从变量 @percent 得到。

说明  roy_check 存储过程只是用作举例,pubs 数据库中并没有此过程。
DECLARE @percent int
EXECUTE roy_check ''BU1032'', 1050, @pc = @percent OUTPUT
SET Percent = @percent

你可能感兴趣的:(存储过程)