这个例子里面我们从两个表中取出头两行,然后合并到一个表中。
在现实中我们常常会遇到这样的情况,在一个数据库中存在两个表,假设表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