当前位置:  数据库>sqlserver

sql server 存储过程的执行

    来源: 互联网  发布时间:2014-08-29

    本文导语:  本文为大家介绍sql server 存储过程的执行方面的相关知识,感兴趣的朋友可以参考下。 说明:sp_executesql 的参数必须为UNICODE,即NCHAR,NVARCHAR,NTEXT型,否则报错。 动态sql语句基本语法 1 :普通SQL语句可以用Exec执行     Select * from t...

本文为大家介绍sql server 存储过程的执行方面的相关知识,感兴趣的朋友可以参考下。

说明: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


    
 
 

您可能感兴趣的文章:

  • 在SQL Server中使用SQL语句查询一个存储过程被其它所有的存储过程引用的存储过程名
  • java调用sql server存储过程,如何取存储过程返回码(不是结果集)
  • 急!如何从一个shell文件中传递一个参数到sql文件中,不能用存储过程
  • 在SQL server 2000中用JAVA实现图片存储
  • 用SQL统计SQLServe表存储空间大小的代码
  • 返回SQL执行时间的存储过程
  • java能否调用SQL-SERVER存储过程呢?如果能?如何调?
  • MySQL 存储过程中执行动态SQL语句的方法
  • 浅析SQL Server中包含事务的存储过程
  • SQL SERVER 利用存储过程查看角色和用户信息的写法
  • sql server中sp_reset_connection存储过程的作用
  • 浅析SQL存储过程和事务处理
  • sql 存储过程批量删除数据的语句
  • SQL创建的几种存储过程
  • Sql Server中存储过程中输入和输出参数(简单实例 一看就懂)
  • 关键字: oracle,存储过程,数据库,查询,动态sql包,数组,参传,jdbc 1
  • 请教一个JDBC调用SQL Server 存储过程的问题
  • SQL Server去除外键的存储过程
  • sql2005 存储过程技巧点滴记录
  • sql 判断函数、存储过程是否存在的代码整理
  • SQL Server统计SQL语句执行时间的脚本
  • 怎么写一个Shell来执行这样的功能,访问Oracle数据库,然后执行一个SQL脚本,生成一个文件。急!
  • SQL Server 中查看SQL句子执行所用的时间
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • 循环里面执行sql插入语句只执行第一个插入,为什么??
  • 如何处理此错误:java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]没有执行可选特性
  • .net/c#/asp.net iis7站长之家
  • C#代码验证sql语句是否正确(只验证不执行sql)的方法
  • 为什么 java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]没有执行可选特性
  • sql无效字符 执行sql语句报错解决方案
  • 如何判断一条sql(update,delete)语句是否执行成功
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • (X86/X64)安装sql server 2005 过程中提示“无法启动sql server的 启动”的解决方法
  • 请教各位,如何在JSP中调用SQL 过程?
  • sql2005 存储过程分页示例代码
  • sql server 存储过程使用 IF ELSE 的例子
  • SQL Server创建链接服务器的存储过程示例分享
  • sql server 存储过程中If Else的用法举例
  • sql2005 存储过程的简单例子
  • SQL Server存储过程入门学习
  • sql server 存储过程的异常处理
  • sql2005中创建CLR存储过程的方法详解
  • 在SQL Server 2005中创建CLR存储过程的详细介绍
  • 通过sql存储过程发送邮件的方法
  • sql存储过程详解
  • sql存储过程 求平均值和总和
  • Sql Server使用cursor处理重复数据过程详解
  • 一次SQL调优数据库性能问题后的过程(300W)
  • sql server存储过程分页示例
  • sql 判断数据库,表,存储过程等是否存在的代码
  • Oracle过程中执行动态SQL或DDL语句
  • 快速删除数据库表、视图、存储过程的sql语句
  • java命名空间java.sql接口statement的类成员方法: executeupdate定义及介绍
  • 请问,这是什么错误!java.sql.SQLException: [Microsoft][ODBC SQL Server Driver][Named Pipes]??????? SQL Server?虽然分少,但一定给,只要您是前5名回复者中最好的以为!
  • java命名空间java.sql接口connection的类成员方法: nativesql定义及介绍
  • SQL查询分析工具 SQL Workbench/J
  • java命名空间java.sql接口preparedstatement的类成员方法: executeupdate定义及介绍
  • SQL客户端软件 PKLite SQL Client
  • java命名空间java.sql接口rowid的类成员方法: getbytes定义及介绍
  • SQL语句实现SQL Server 2000及Sql Server 2005日志收缩(批量)
  • java命名空间java.sql接口ref的类成员方法: getbasetypename定义及介绍
  • SQL客户端管理工具 SQuirreL SQL Client
  • java命名空间java.sql接口databasemetadata的类成员方法: getsqlkeywords定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3