SqlServer中存储过程中将Exec的执行结果赋值给变量输出

背景:

遇到这样一种情况:动态向存储过程中传入表名和表的某些属性(这里用到的是主键ID),然后利用这两个变量查出一条数据的某些字段值,然后再利用这些值进行逻辑运算(自己的逻辑),最后将结果输出。话不多说,直接上图,看是否是你想要的结果:

说明:【区域1为要用来测试的表】【  区域2 为表中数据】【区域3 为表中数据jan+feb+mar列值的和5】

存储过程代码如下:

从上图可以看出既然可以拿到jan 、feb、mar列的值,后面再做自己的判断就容易了。不再赘述。

由于学艺不精,上述结论是受别人的启发才得出的,相关链接:http://www.cnblogs.com/wanyuan8/archive/2011/11/09/2243483.html

下面贴出原作者博文原文(身为一名程序员,你懂的):

sp_executesql介绍和使用

execute相信大家都用的用熟了,简写为exec,除了用来执行存储过程,一般都用来执行动态Sql

sp_executesql,sql2005中引入的新的系统存储过程,也是用来处理动态sql的, 如:

exec sp_executesql @sql, N‘@count int out,@id varchar(20)‘, @cou out

,@id

@sql为拼成的动态sql

N‘@count int out,@id varchar(20)‘为拼成的动态sql内的参数列表

@cou out,@id为为动态sql内参数列表提供值的外部参数列表

那么它们之间有什么区别呢?

1,它们之间最大的区别是嵌入式的参数,如下面一个语句

declare @sql nvarchar(2000)

declare @id varchar(20)

set @id=‘1‘

set @sql=‘select count(*) from emp where id=‘ + @id

exec @sql

我想把得到的count(*)传出来,用传统的exec是不好办到的,但是用sp_executesql则很容易就办到了:

declare @sql nvarchar(2000)

declare @cou int

declare @id varchar(20)

set @id=‘1‘

set @sql=‘select @count=count(*) from emp where [email protected]‘

exec sp_executesql @sql, N‘@count int out,@id varchar(20)‘, @cou out

,@id

print @cou

2.性能

可以看到,如果用exec,由于每次传入的@id不一样,所以每次生成的@sql就不一样,这样每执行一次Sql2005就必须重新将要执行的动态Sql重新编译一次

但是sp_executesql则不一样,由于将数值参数化,要执行的动态Sql永远不会变化,只是传入的参数的值在变化,那每次执行的时候就秒用重新编译,速度自然快多了哈!

注意:

1.sp_executesql要求动态Sql和动态Sql参数列表必须是Nvarchar,比如上个例子的@sql,N‘@count int out,@id varchar(20)‘我记得在sql2005中Varchar也可以的,但是我打了Sp3补丁后就不行了,必须为Nvarchar

2.动态Sql的参数列表与外部提供值的参数列表顺序必需一致,如:

N‘@count int out,@id varchar(20)‘, @cou out,@id

@count 对应 @cou,@id对应@id

如果不一致,必须显式标明,如:

N‘@count int out,@id varchar(20)‘, @id=@id, @[email protected] out

3.动态SQl的参数列表与外部提供参数的参数列表参数名可以同名

时间: 2024-10-12 05:29:11

SqlServer中存储过程中将Exec的执行结果赋值给变量输出的相关文章

Sqlserver中存储过程,触发器,自定义函数(一)

Sqlserver中存储过程,触发器,自定义函数 1.存储过程有关内容存储过程的定义:存储过程的分类:存储过程的创建,修改,执行:存储过程中参数的传递,返回与接收:存储过程的返回值:存储过程使用游标. 1.1存储过程的定义:存放在服务器上预先编译好的sql语句,可以给存储过程传递参数,也可以从存储过程返回值. 优点:提供了安全访问机制,比如可以将不同的存储过程的执行权限赋予权限不同的用户:改进了执行性能,因为存储过程是预编译的:减少了网络流量,因为在调用存储过程时,传递的字符串很短,没有很长的s

SQLServer 中存储过程

SQLServer 中存储过程返回的三种方式( 包括存储过程的创建, 在存储过程中调用, 在VS中调用的方法)存储过程有三种返回:   1.   用return返回数字型数据   2.   用返回参数返回结果,可以返回各种数据类型(通过游标来循环查询结果每一行)   3.   直接在存储过程中用select返回结果集,可以是任意的select语句,这意味着是任意的返回结果集 方法一:用return返回数字型数据 1. 创建存储过程--SQLSERVER 2005示例数据库USE Adventur

Sqlserver中存储过程,触发器,自定义函数

Sqlserver中存储过程,触发器,自定义函数: 1. 触发器:是针对数据库表或数据库的特殊存储过程,在某些行为发生的时候就会被激活 触发器的分类: DML触发器:发生在数据操作语言执行时触发执行的存储过程,Insert,Update,Delete After触发器:记录被改变之后激活执行 Instead of触发器:记录被改变之前激活执行. DDL触发器:响应数据定义语言执行时触发执行的存储过程,一般用于执行数据库中的管理任务 审核和规范数据库的操作: 防止数据表结构被更改或删除 2. ht

Sqlserver中存储过程,触发器,自定义函数(二)

Sqlserver中存储过程,触发器,自定义函数: 自定义函数:1.函数类型:2.函数的参数和返回值: 1.函数类型:标量值函数,返回的是一个标量值表值函数:内联表值函数:多语句表值函数. 标量值函数: 1 go 2 create function SumOrders(@职工号 varchar(20))--指定参数名,和返回类型 stuNo 3 returns int --指定返回类型 4 begin 5 declare @订单总数 int --学生人数sumstudent 6 select @

SqlServer中存储过程 returnC#代码处理以及对应的MySQL如何改写

一.SqlServer 中 1. 创建表 create table testuser( id int, --primary key, names varchar(50), address varchar(50), paw varchar(50) ) 2.创建存储过程 create proc testp12(@id int ,@names varchar(50),@address varchar(50),@paw varchar(50)) as begin declare @maxid int i

sqlserver 中存储过程的基础知识记录

1.什么是存储过程? 存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令. 通俗来讲:存储过程其实就是能完成一定操作的一组SQL语句. 2.为什么要用存储过程? 1)存储过程只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度. 2)当对数据库进行复杂操作时,可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用. 3)存储过程可以重复使用,可减少数据库开发人员的工作量. 4)安全性高,可设定

C#调用SQL中存储过程并用DataGridView显示执行结果

//连接数据库 SqlConnection con = new SqlConnection("server=服务器名称;database=数据库名称;user id=登录名;pwd=登录密码;"); //打开数据库 con.Open(); //调用存储过程 SqlCommand scd = new SqlCommand("存储过程名称", con); scd.CommandType = CommandType.StoredProcedure;//调用命令改成存储格式

sqlserver中存储过程和游标的使用

DECLARE @phone nvarchar(20) BEGIN declare @count int=0 declare @dateNow nvarchar(100) =convert(nvarchar, getdate(),120) declare @dateNowFormat nvarchar(20) =convert(nvarchar(100), getdate(), 23) print @dateNowFormatdeclare @datepre nvarchar(100)=conv

Sql Sever 表遍历,Exec动态执行sql语句返回变量

DECLARE @id AS INT, @table_name AS NVARCHAR(200), @number_column_name AS NVARCHAR(200), @sql NVARCHAR(MAX), @cnt INT; WHILE EXISTS (SELECT id FROM @temp) BEGIN -- 也可以使用top 1 SET ROWCOUNT 1; SELECT @id = id, @table_name = table_name, @number_column_na