存储过程的执行

 

,sp_executesql 的参数必须为UNICODE,即NCHAR,NVARCHAR,NTEXT型,否则报错

动态sql语句基本语法 
1 :普通SQL语句可以用Exec执行     
    
Select * from tableName 
Exec('select * from tableName') 
Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N 

 

 

存储过程可以返回的不仅仅是查询的结果,也可以是一个指示了存储过程的成功或失败的标识,我们可以利用return来返回这个标识,return的工作方式不管一个存储过程是否提供返回值,程序都会收到一个返回值,sqlserver默认的会在完成存储过程时自动返回一个0值。

使用return可以返回值,例如:return 100

注意:返回值必须为整数!

这个return和其他的语言的函数中的return相似,执行它以后,会从存储过程中退出,而不会执行以后的代码。

用这个return的意义是什么呢?实际上我在写存储过程的时候确实很少用到它啊,每次新建存储过程,模板里最后都会有个return,而每次,我都会删掉它。

考虑一下这个问题,如果返回值默认为0,则意味着没有错误,但是这样就不是很好,明明存储过程里出了问题,而仍旧返回0,我们一定要很明确的知道返回值的意义,这样才不至于得到一个意外的返回值。所以当不符合逻辑时,可以return 一个标识,通过这个标识判断存储过程的是否执行正确。

 

alter procedure aa
(
@input int,
@aa int output,
@bb int output
)
as
select @aa=@input+3
set @bb=3
return 44
go

declare @a int
declare @b int
declare @c int
execute @c=aa 4,@a out,@b out //注意输入,输出,返回值的写法
print @a 返回7
print @b  返回3
print @c  返回44


execute 与sp_executesql的区别:

EXEC命令有两种用法,一种是执行一个存储过程,另一种是执行一个动态的批处理.

SET @sql = 'SELECT * FROM '+QUOTENAME(@TableName) +'WHERE OrderID = '+CAST(@OrderID AS VARCHAR(10))+' ORDER BY ORDERID DESC'
EXEC(@sql);
exec括号中只能包含一个字符串变量,但可以串联多个变量
EXEC('SELECT TOP('+ CAST(@TopCount AS VARCHAR(10)) +')* FROM '+QUOTENAME(@TableName) +' ORDER BY ORDERID DESC');
 
SQL编译器就会报错,编译不通过,而如果我们这样:
EXEC(@sql+@sql2+@sql3);
编译器就会通过;
 
所以最佳的做法是把代码构造到一个变量中,然后再把该变量作为EXEC命令的输入参数,这样就不会受限制了;
SET @sql = 'SELECT * FROM '+QUOTENAME(@TableName) +'WHERE OrderID = @OrderID ORDER BY ORDERID DESC'
错误:必须声明标量变量 "@OrderID".但sp_executesql可以 
DECLARE @TableName VARCHAR(50),@sql NVARCHAR(MAX),@OrderID INT;
   2:  SET @TableName = 'Orders ';
   3:  SET @OrderID = 10251;
   4:  SET @sql = 'SELECT * FROM '+QUOTENAME(@TableName) + ' WHERE OrderID = @OID ORDER BY ORDERID DESC'
   5:  EXEC sp_executesql
   6:      @stmt = @sql,
   7:      @params = N'@OID AS INT ',
   8:      @OID = @OrderID


DECLARE @sql AS NVARCHAR(12),@i AS INT;
SET @sql = N' SET @p = 10';
EXEC sp_executesql 
    @stmt = @sql,
    @params = N'@p AS INT OUTPUT',
    @p = @i OUTPUT
SELECT @i

EXEC不提供接口
 
这里的接口是指,它不能执行一个包含一个带变量符的批处理,sp_executesql 提供接口.

DECLARE @tab nvarchar(max),@filds nvarchar(max),@where nvarchar(max),@sql nvarchar(max)

set @tab=' class '
set @filds=' id ';
set @where=1;
set @sql='select id,@filds from class where id>@id'
exec sp_executesql @sql,N'@filds nvarchar(22),@id int',@filds,@where

通用存储过程:

USE [pinkcitydb]
GO
/****** Object: StoredProcedure [dbo].[mvcPager] Script Date: 02/22/2012 09:10:15 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[mvcPager]
(
@Psql nvarchar(4000), --生成dataset的语句
@PNum int, --显示第几页
@PSize int, --显示多少条
@Sort nvarchar(200) = null, --排序语句 如:order by id desc
@RowNumName nvarchar(50), --ROW_NUMBER别名
@Prcount int out, --返回记录总数
@Pcount int out --返回分页总数
)
as
set nocount on
declare @sqlTmp nvarchar(1000) --存放SQL语句
declare @sqlTmpCount nvarchar(1000) --存放查询记录总数量SQL语句

--计算范围
declare @Pmax int
declare @Pmin int
set @Pmax = @pnum*@psize --当前页*页大小 = 页最大值
set @Pmin = @Pmax - @psize +1 --页最大值 - 页大小 + 1 = 页最小值
set @sqlTmp='select * from ('+@Psql+')as temptb where '+@rowNumName+' BETWEEN '+cast(@Pmin as varchar(10))+' and '+cast(@Pmax as varchar(10))+''+@sort
set @sqlTmpCount='select @Prcount=count(*) from ('+@Psql+') as temptb' --print @sqlTmpCount
--
--取得查询记录总数量-----
exec sp_executesql @sqlTmpCount,N'@Prcount int out ',@Prcount out --print @Prcount
--
取得分页总数
set @Pcount=(@Prcount+@pSize-1)/@pSize
exec sp_executesql @sqlTmp
set nocount off



posted @ 2012-02-21 16:37  pantherbean  阅读(40251)  评论(0编辑  收藏  举报