苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.4-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 4958|回复: 1

[Sql Server] sp_executesql使用方法与介绍

[复制链接]
发表于 2012-9-12 10:39:19 | 显示全部楼层 |阅读模式
execute相信大家都用的用熟了,简写为exec,除了用来执行存储过程,一般都用来执行动态Sql
sp_executesql,sql2005中引入的新的系统存储过程,也是用来处理动态sql的,如:
[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,它们之间最大的区别是嵌入式的参数,如下面一个语句
[SQL] 纯文本查看 复制代码
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则很容易就办到了:
[SQL] 纯文本查看 复制代码
declare @sql nvarchar(2000) 
declare @cou int 
declare @id varchar(20) 
set @id='1' 
set @sql='select @count=count(*) from emp where id=@id' 
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的参数列表与外部提供值的参数列表顺序必需一致,如:
[SQL] 纯文本查看 复制代码
N'@count int out,@id varchar(20)', @cou out,@id 
@count 对应 @cou,@id对应@id 

如果不一致,必须显式标明,如:
[SQL] 纯文本查看 复制代码
N'@count int out,@id varchar(20)', @id=@id, @count=@cou out 

3.动态SQl的参数列表与外部提供参数的参数列表参数名可以同名
总结一下:
      不知道大家看的怎么样,其实我也是刚看明白,sp_executesql主要有三个参数,第一个是动态Sql语句,第二个是必须使用Nvarchar类型来定义一下动态SQl语句中和变量类型,第三个是给变量赋值。就是这样。
这个有点像C#访问存储过程的样子,大家有什么不明白的直接回复哦



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-6-20 00:42:04 | 显示全部楼层
看的人少,回一下
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2022-7-3 14:00

© 2014-2021

快速回复 返回顶部 返回列表