zhongyan

博客园 首页 新随笔 联系 订阅 管理

这个例子里面我们从两个表中取出头两行,然后合并到一个表中。
在现实中我们常常会遇到这样的情况,在一个数据库中存在两个表,假设表1储存着公司个产品本季度销售信息,表2储存着公司本季度欠款金额情况。在一个页面中

我们想把这两个信息显示出来。通常的做法是在程序中进行两次SQL查询,返回两个结果集,在分别显示出来,非常麻烦。

  下面是实现这个功能的代码:

  CREATE PROCEDURE test
  AS
   SET NOCOUNT ON --指示存储过程不返回查询影响的行数
   DECLARE @col1c varchar(20),@col2c varchar(20), @index int
   SET @index = 1
   CREATE TABLE #tmptbl --创建一个临时表,用于储存我们的结果
   (
    colID int IDENTITY(1,1) PRIMARY KEY CLUSTERED,
    col1 varchar(20),
    col2 varchar(20)
   )

   DECLARE cur1 CURSOR FOR SELECT  TOP 2 customerid FROM orders
   DECLARE cur2 CURSOR FOR SELECT TOP 2 regiondescription FROM region
   OPEN cur1
   OPEN cur2
   FETCH cur2 INTO @col2c
   FETCH cur1 INTO @col1c
   WHILE @@FETCH_STATUS = 0
    BEGIN
     INSERT INTO #tmptbl (col1, col2) VALUES (@col1c, @col2c)
     FETCH NEXT FROM cur1 INTO @col1c
     FETCH NEXT FROM cur2 INTO @col2c
    END
   CLOSE cur1
   CLOSE cur2
   DEALLOCATE cur1
   DEALLOCATE cur2
   SELECT * FROM #tmptbl
   DROP TABLE #tmptbl
  GO

  说明:

  @@FETCH_STATUS,返回被fetch语句执行的最后游标状态。

  返回值:0-FETCH语句执行成功
      1-FETCH语句失败,或此行不再结果集中。
      2-被提取的行不存在。

存储过程学习笔记
CREATE PROCEDURE [OWNER].[PROCEDURE NAME]

@paramsname type -参数

as

begin

//执行体

  if @@Error<>0
  begin
   Goto Failed
  end

Failed:
  RaisError(@ErrorMsg,16,1)
  Rollback Tran 
  Return 1

Succeed:
  Commit Tran
  Return 0

End


@@Error:

当 Microsoft® SQL Server™ 完成 Transact-SQL 语句的执行时,如果语句执行成功,则 @@ERROR 设置为 0。若出现一个错误,则返回一条错误信息。@@ERROR 返回

此错误信息代码,直到另一条 Transact-SQL 语句被执行。您可以在 sysmessages 系统表中查看与 @@ERROR 错误代码相关的文本信息。

由于 @@ERROR 在每一条语句执行后被清除并且重置,应在语句验证后立即检查它,或将其保存到一个局部变量中以备事后查看。


CREATE  PROCEDURE spDoAccountSet
 @nType int,                      --操作命令标识
 @dbname nvarchar(50)=NULL,       --数据库名
 @FilePath nvarchar(200)=NULL,  --数据库文件路径
 @AccSetName nvarchar(50)=NULL,   --帐套名
 @FileNamemdf nvarchar(200)=NULL, --数据文件名
 @FileNameldf nvarchar(200)=NULL, --日志文件名
 @CorpName nvarchar(50)=NULL,     --企业名
 @NaturalMoney nvarchar(50)=NULL, --本位币
 @AccSetMan nvarchar(50)=NULL,
 @AccSetPwd nvarchar(50)=NULL,
        @CreateDate nvarchar(50)=Null   --加密后的建帐日期
AS
Begin
Declare @ErrorMsg nvarchar(200)
DECLARE @AccSetID nvarchar(50)
declare @strSQL nvarchar(800)

Set @dbname =rTrim(@dbName)
Set @FilePath =rTrim(@FilePath)
Set @AccSetName =rTrim(@AccSetName)
Set @FileNamemdf =rTrim(@FileNamemdf)
Set @FileNameldf =rTrim(@FileNameldf)
Set @CorpName =rTrim(@CorpName)
Set @NaturalMoney =rTrim(@NaturalMoney)
Set @AccSetMan =rTrim(@AccSetMan)
Set @AccSetPwd =rTrim(@AccSetPwd)
Set @CreateDate =rTrim(@CreateDate)

if @nType=1------增加帐套
begin

 Exec sp_attach_db @dbname,@filenamemdf,@filenameldf

 if @@Error<>0
 begin
  RaisError('注册数据库失败!',16,1)
  Return 1
 end

 begin Tran   --开始事务
 --维护帐套管理表
 INSERT INTO [ClothingSys]..TAccount(aName,aCompanyName,aDatabaseName,aFilePath,aDate,aUser,aCreateDate)
  values(@AccSetName,@CorpName,@DbName,@FilePath,GetDate(),@AccSetMan,@CreateDate)
 
 if @@Error<>0
 begin
  Set @ErrorMsg='维护帐套管理表失败!'
  Goto Failed
 end
 
 --维护dJXC中的TCompanyInfo表
 select @AccSetID=aID from [ClothingSys]..TAccount where aName=@AccSetName

 select @strSQL='INSERT INTO '+@dbname+'..TCompanyInfo(fAccountID,fNatureMoney,fCompanyName)
    VALUES ('+convert(nvarchar(50),@AccSetID)+','''+@NaturalMoney+''','''+@CorpName+''')'

 exec (@strSQL)

 if @@Error<>0
 begin
  Set @ErrorMsg='维护帐套中的企业信息表失败!'
  Goto Failed
 end
 
 --单据类型
 Set @StrSql='Insert into '+@DBName+'.dbo.TBillType(fID,fCode,fName,fInNumber,fOutNumber,fDefBeginDep,fDefEndDep)
   Select fID,fCode,fName,fInNumber,fOutNumber,fDefBeginDep,fDefEndDep from ClothingSys.dbo.TBillType'
 Exec (@StrSql)
 
 if @@Error<>0
 begin
  Set @ErrorMsg='初始化[TBillType]表失败!'
  Goto Failed
 end
 
 --员工类型表
 Set @StrSql='Insert into '+@DBName+'.dbo.TEtype(fName,fNotes,fFlag)
   Select fName,fNotes,fFlag from ClothingSys.dbo.TEtype'
 Exec (@StrSql)
 
 if @@Error<>0
 begin
  Set @ErrorMsg='初始化[TEtype]表失败!'
  Goto Failed
 end
 
 --系统模块
 Set @StrSql=' Insert into '+@DBName+'.dbo.TModule(fID,fName)
   Select fID,fName from ClothingSys.dbo.TModule'
 Exec (@StrSql)
 
 if @@Error<>0
 begin
  Set @ErrorMsg='初始化[TModule]表失败!'
  Goto Failed
 end
 
 --系统权限列表
 Set @StrSql=' Insert into '+@DBName+'.dbo.TFunction

(fID,fModuleID,fActionName,fName,fRun,fInsert,fEdit,fDelete,fPrint,fConfirm,fCancel,fFinish,fStart,fOther2,fOther3,fOther4,fOther5)
   Select fID,fModuleID,fActionName,fName,fRun,fInsert,fEdit,fDelete,fPrint,fConfirm,fCancel,fFinish,fStart,fOther2,fOther3,fOther4,fOther5 from

ClothingSys.dbo.TFunction'
 Exec (@StrSql)
 
 if @@Error<>0
 begin
  Set @ErrorMsg='初始化[TFunction]表失败!'
  Goto Failed
 end
 

 --维护用户表
 Select @StrSQL='INSERT INTO '+@DbName+'..tUser(fCode,fName,fPWD,fFlag)
    VALUES (''Admin'','''+@AccSetMan+''','''+isnull(@AccSetPWD,'')+''',1)'
 
 exec (@strSQL)

 if @@Error<>0
 begin
  Set @ErrorMsg='初始化用户表失败!'
  Goto Failed
 end

end--结束
else if @nType=-1--删除帐套
 begin
  --删除数据库
  select @strSQL='drop database '+@dbname
  exec (@strSQL)
 
  if @@Error<>0
  begin
   RaisError('删除数据库失败!可能有人正在使用。',16,1)
   Return 1
  end
 
  begin Tran--开始事务
 
  --维护帐套管理表
  Delete [ClothingSys]..TAccount where aName=@AccSetName
 
  if @@Error<>0
  begin
   Set @ErrorMsg='维护帐套管理表失败!'
   Goto Failed
  end
  --
 end  --结束
 else if @nType=0 --引入帐套
  begin
  --如果只有数据文件
  if @FileNameldf=Null
   begin
   exec sp_detach_db @dbname
   exec sp_attach_single_file_db @dbname,@filenamemdf
   end
   else
   begin
   Exec sp_attach_db @dbname,@filenamemdf,@filenameldf
   end
 
  if @@Error<>0
  begin
   RaisError('注册数据库失败!',16,1)
   Return 1
  end
 
  begin Tran --开始事务
  --维护帐套管理表
  INSERT INTO [ClothingSys]..tAccount(aName,aCompanyName,aDatabaseName,aFilePath,aDate,aUser)
   values(@AccSetName,@CorpName,@DbName,@FilePath,GetDate(),@AccSetMan)
 
  if @@Error<>0
  begin
   Set @ErrorMsg='维护帐套管理表失败!'
   Goto Failed
  end
 
  --维护dJXC中的TCompanyInfo,tCode表
  select @AccSetID=aID from [ClothingSys]..tAccount where aName=@AccSetName
 
  select @strSQL='UPDATE '+@dbname+'..TCompanyInfo SET fAccountID = '+convert(nvarchar(50),@AccSetID)
 
  exec (@strSQL)
 
  if @@Error<>0
  begin
   Set @ErrorMsg='维护帐套中的企业信息表失败!'
   Goto Failed
  end
 
  end

Goto Succeed-事务结束

Failed:
  RaisError(@ErrorMsg,16,1)
  Rollback Tran 
  Return 1

Succeed:
  Commit Tran
  Return 0

End
GO

posted on 2007-08-31 19:55  钟岩  阅读(805)  评论(0编辑  收藏  举报