- 浏览: 2163167 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1878)
- [网站分类]ASP.NET (141)
- [网站分类]C# (80)
- [随笔分类]NET知识库 (80)
- [随笔分类]摘抄文字[非技术] (3)
- [随笔分类]养生保健 (4)
- [网站分类]读书区 (16)
- [随笔分类]赚钱 (7)
- [网站分类].NET新手区 (233)
- [随笔分类]网站 (75)
- [网站分类]企业信息化其他 (4)
- [网站分类]首页候选区 (34)
- [网站分类]转载区 (12)
- [网站分类]SQL Server (16)
- [网站分类]程序人生 (7)
- [网站分类]WinForm (2)
- [随笔分类]错误集 (12)
- [网站分类]JavaScript (3)
- [随笔分类]小说九鼎记 (69)
- [随笔分类]技术文章 (15)
- [网站分类]求职面试 (3)
- [网站分类]其他技术区 (6)
- [网站分类]非技术区 (10)
- [发布至博客园首页] (5)
- [网站分类]jQuery (6)
- [网站分类].NET精华区 (6)
- [网站分类]Html/Css (10)
- [随笔分类]加速及SEO (10)
- [网站分类]Google开发 (4)
- [随笔分类]旅游备注 (2)
- [网站分类]架构设计 (3)
- [网站分类]Linux (23)
- [随笔分类]重要注册 (3)
- [随笔分类]Linux+PHP (10)
- [网站分类]PHP (11)
- [网站分类]VS2010 (2)
- [网站分类]CLR (1)
- [网站分类]C++ (1)
- [网站分类]ASP.NET MVC (2)
- [网站分类]项目与团队管理 (1)
- [随笔分类]个人总结 (1)
- [随笔分类]问题集 (3)
- [网站分类]代码与软件发布 (1)
- [网站分类]Android开发 (1)
- [网站分类]MySQL (1)
- [网站分类]开源研究 (6)
- ddd (0)
- 好久没写blog了 (0)
- sqlserver (2)
最新评论
-
JamesLiuX:
博主,能组个队么,我是Freelancer新手。
Freelancer.com(原GAF – GetAFreelancer)帐户里的钱如何取出? -
yw10260609:
我认为在混淆前,最好把相关代码备份一下比较好,不然项目完成后, ...
DotFuscator 小记 -
日月葬花魂:
大哥 能 加我个QQ 交流一下嘛 ?51264722 我Q ...
web应用程序和Web网站区别 -
iaimg:
我想问下嵌入delphi写的程序总是出现窗体后面感觉有个主窗体 ...
C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部 -
iaimg:
代码地址下不了啊!
C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部
MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有。还有一个最大的好处就是利用sp_executesql,能够重用执行计划,这就大大提供了执行性能(对于这个我在后面的例子中会详加说明),还可以编写更安全的代码。EXEC在某些情况下会更灵活。除非您有令人信服的理由使用EXEC,否侧尽量使用sp_executesql.
1,EXEC的使用
EXEC命令有两种用法,一种是执行一个存储过程,另一种是执行一个动态的批处理。以下所讲的都是第二种用法。
下面先使用EXEC演示一个例子,代码1
DECLARE @TableName VARCHAR(50),@Sql NVARCHAR(MAX),@OrderID INT;SET @TableName = 'Orders';SET @OrderID = 10251;SET @sql = 'SELECT * FROM '+QUOTENAME(@TableName) +'WHERE OrderID = '+CAST(@OrderID AS VARCHAR(10))+' ORDER BY ORDERID DESC'EXEC(@sql);注:这里的EXEC括号中只允许包含一个字符串变量,但是可以串联多个变量,如果我们这样写EXEC:
EXEC('SELECT TOP('+ CAST(@TopCount AS VARCHAR(10)) +')* FROM '+QUOTENAME(@TableName) +' ORDER BY ORDERID DESC');
SQL编译器就会报错,编译不通过,而如果我们这样:
EXEC(@sql+@sql2+@sql3);编译器就会通过;
所以最佳的做法是把代码构造到一个变量中,然后再把该变量作为EXEC命令的输入参数,这样就不会受限制了;
EXEC不提供接口
这里的接口是指,它不能执行一个包含一个带变量符的批处理,这里乍一听好像不明白,不要紧,我在下面有一个实例,您一看就知道什么意思.
DECLARE @TableName VARCHAR(50),@Sql NVARCHAR(MAX),@OrderID INT;SET @TableName = 'Orders';SET @OrderID = 10251;SET @sql = 'SELECT * FROM '+QUOTENAME(@TableName) +'WHERE OrderID = @OrderID ORDER BY ORDERID DESC'EXEC(@sql);关键就在SET @sql这一句话中,如果我们运行这个批处理,编译器就会产生一下错误
Msg 137, Level 15, State 2, Line 1
必须声明标量变量 "@OrderID"。
使用EXEC时,如果您想访问变量,必须把变量内容串联到动态构建的代码字符串中,如:SET @sql = 'SELECT * FROM '+QUOTENAME(@TableName) +'WHERE OrderID = '+CAST(@OrderID AS VARCHAR(10))+' ORDER BY ORDERID DESC'
串联变量的内容也存在性能方面的弊端。SQL Server为每一个的查询字符串创建新的执行计划,即使查询模式相同也是这样。为演示这一点,先清空缓存中的执行计划
DBCC FREEPROCCACHE (这个不是本文所涉及的内容,您可以查看MS的MSDN)
http://msdn.microsoft.com/zh-cn/library/ms174283.aspx
将代码1运行3次,分别对@OrderID 赋予下面3个值,10251,10252,10253。然后使用下面的代码查询
SELECT cacheobjtype,objtype,usecounts,sql FROM sys.syscacheobjects WHERE sql NOT LIKE '%cach%' AND sql NOT LIKE '%sys.%' 点击F5运行,就会出现下面如图所示的查询结果:
我们可以看到,每执行一次都要产生一次的编译,执行计划没有得到充分重用。
EXEC除了不支持动态批处理中的输入参数外,他也不支持输出参数。默认情况下,EXEC把查询的输出返回给调用者。例如下面代码返回Orders表中所有的记录数
DECLARE @sql NVARCHAR(MAX)SET @sql = 'SELECT COUNT(ORDERID) FROM Orders';EXEC(@sql);然而,如果你要把输出返回给调用批处理中的变量,事情就没有那么简单了。为此,你必须使用INSERT EXEC语法把输出插入到一个目标表中,然后从这表中获取值后赋给该变量,就像这样:
DECLARE @sql NVARCHAR(MAX),@RecordCount INTSET @sql = 'SELECT COUNT(ORDERID) FROM Orders'; CREATE TABLE #T(TID INT);INSERT INTO #T EXEC(@sql);SET @RecordCount = (SELECT TID FROM #T)SELECT @RecordCountDROP TABLE #T2,sp_executesql的使用
sp_executesql命令在SQL Server中引入的比EXEC命令晚一些,它主要为重用执行计划提供更好的支持。
为了和EXEC作一个鲜明的对比,我们看看如果用代码1的代码,把EXEC换成sp_executesql,看看是否得到我们所期望的结果
DECLARE @TableName VARCHAR(50),@sql NVARCHAR(MAX),@OrderID INT ,@sql2 NVARCHAR(MAX);SET @TableName = 'Orders ';SET @OrderID = 10251;SET @sql = 'SELECT * FROM '+QUOTENAME(@TableName) + ' WHERE OrderID = '+CAST(@OrderID AS VARCHAR(50)) + ' ORDER BY ORDERID DESC'EXEC sp_executesql @sql注意最后一行;
事实证明可以运行;
sp_executesql提供接口
sp_executesql命令比EXEC命令更灵活,因为它提供一个接口,该接口及支持输入参数也支持输出参数。这功能使你可以创建带参数的查询字符串,这样就可以比EXEC更好的重用执行计划,sp_executesql的构成与存储过程非常相似,不同之处在于你是动态构建代码。它的构成包括:代码快,参数声明部分,参数赋值部分。说了这么多,还是看看它的语法吧
EXEC sp_executesql
@stmt = <statement>,--类似存储过程主体
@params = <params>, --类似存储过程参数部分
<params assignment> --类似存储过程调用
@stmt参数是输入的动态批处理,它可以引入输入参数或输出参数,和存储过程的主体语句一样,只不过它是动态的,而存储过程是静态的,不过你也可以在存储过程中使用sp_executesql;
@params参数与定义输入/输出参数的存储过程头类似,实际上和存储过程头的语法完全一样;
@<params assignment> 与调用存储过程的EXEC部分类似。
为了说明sp_executesql对执行计划的管理优于EXEC,我将使用前面讨论EXEC时用到的代码。
DECLARE @TableName VARCHAR(50),@sql NVARCHAR(MAX),@OrderID INT; SET @TableName = 'Orders '; SET @OrderID = 10251; SET @sql = 'SELECT * FROM '+QUOTENAME(@TableName) + ' WHERE OrderID = @OID ORDER BY ORDERID DESC' EXEC sp_executesql @stmt = @sql, @params = N'@OID AS INT ', @OID = @OrderID
在调用该代码和检查它生成的执行计划前,先清空缓存中的执行计划;
DBCC FREEPROCCACHE
将上面的动态代码执行3次,每次执行都赋予@OrderID 不同的值,然后查询sys.syscacheobjects表,并注意它的输出,优化器只创建了一个备用计划,而且该计划被重用的3次
SELECT cacheobjtype,objtype,usecounts,sql FROM sys.syscacheobjects WHERE sql NOT LIKE '%cache%' AND sql NOT LIKE '%sys.%' AND sql NOT LIKE '%sp_executesql%'
点击F5运行,就会出现如下表所示的结果;
sq_executesql的另一个与其接口有关的强大功能是,你可以使用输出参数为调用批处理中的 变量返回值。利用该功能可以避免用临时表返回数据,从而得到更高效的代码和更少的重新编译。定义和使用输出参数的语法与存储过程类似。也就是说,你需要在声明参数时指定OUTPUT子句。例如,下面的静态代码简单的演示了如何从动态批处理中利用输出参数@p把值返回到外部批处理中的变量@i.
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 OUTPUTSELECT @i该代码返回输出10
以上就是EXEC和sp_executesql的主要区别,如果各位看官觉得哪不对或者表达不清楚的,还请多多指出^_^
发表评论
-
whmcs介绍
2013-03-18 15:39 0WHMCS是一套国外流行的域名主机管理软件,跟国内众所周知的 ... -
单IP泛域名绑定
2010-05-19 08:45 1666单 IP泛域名绑定是指的是? 防火墙配置文件保存在当前服务 ... -
CodeSmith将模板文件批量生成文件的方法
2010-03-31 09:08 1921以前写codeSmith模板的时候,如果直接像asp一样混排编 ... -
linux下dd命令详解
2010-03-29 09:16 1631名称: dd 使用权限: ... -
文件服务器 之 VSFTPD的高手篇
2010-03-29 09:16 1048此文章细致的讲解了VSFTP的配置 环境:linux as ... -
linux VPS上装FTP
2010-03-29 09:17 1116今天疯子说一位朋友的站三天两头挂,来找我弄个VPS用,不过这位 ... -
VPS使用手记-Linux下FTP服务器的选择
2010-03-29 09:18 1441linux下常见的ftp服务器有wu-ftp、vsftpd、p ... -
四十个非常实用的轻量级JavaScript库
2010-03-25 09:18 1080流行的JavaScript库,如jQuery, MooTool ... -
GoDaddy域名注册/空间购买优惠码
2010-01-03 23:46 398网站地址: godaddy.comGodadd ... -
2008年godaddy 购买省钱新招
2010-01-03 23:54 238Godaddy提供的产品比较多,购买过程繁琐,各种促销,优惠码 ... -
Godaddy Windows主机组件支持情况
2010-01-03 23:55 262下面是Godaddy Windows主机支持的组件ADODB. ... -
Godaddy主机购买图解教程
2010-01-04 00:09 2581# 大 中 小 发表于 2007-3-28 12 ... -
GoDaddy域名及虚拟主机介绍
2010-01-04 00:12 258Godaddy是世界第一大域名 ... -
与Godaddy空间一起购买的domain获得$1.99优惠价的方法
2010-01-04 00:15 355不少人都说不知道怎么和空间一起买到$1.99的域名,小紫特意做 ... -
GoDaddy域名注册图解
2010-01-04 00:18 261GoDaddy域名注册图解 在godaddy注册域名是一个痛苦 ... -
Godaddy主机续费教程- Gift card 付款
2010-01-04 00:19 559, 登录Godady 帐号2, 进入Hosting accou ... -
Godaddy主机控制面板使用
2010-01-04 00:28 319Godaddy主机控制面板使用 最新说明请参考:http:/ ... -
如何建立MSSQL数据库
2010-01-04 00:34 1013如何建立MSSQL数据库 1.登陆账户2. 在my produ ... -
godaddy虚拟主机access数据库中文乱码的解决方法
2010-01-04 00:35 443非程序生成的文字可以显示。但程序生成的文字就只有E文可以显 ... -
Godaddy 如何添加独立IP到主机账户
2010-01-04 00:36 289Godaddy 如何添加独立IP到主机账户 Godaddy购买 ...
相关推荐
Web scraping and browser automation librarylee 涵盖了端到端的抓取和爬取,并帮助您快速构建可靠的爬取工具。 Crawlee for Python 向早期采用者开放!即使使用默认配置,您的爬虫程序看起来也几乎像人类一样,并且不会受到现代机器人保护的监视。Crawlee 为您提供了工具,让您可以抓取网络上的链接、抓取数据并以机器可读的格式持久存储数据,而无需担心技术细节。而且,由于配置选项丰富,如果默认设置不适用,您可以调整 Crawlee 的几乎任何方面以满足您的项目需求。在Crawlee 项目网站上查看完整的文档、指南和示例我们还有一个 TypeScript 实现的 Crawlee,您可以探索并利用它来完成您的项目。请访问我们的 GitHub 存储库,获取有关GitHub 上 JS/TS 的 Crawlee 的更多信息。安装我们建议您访问Crawlee 文档中的简介教程以获取更多信息。Crawlee 可作为crawleePyPI 软件包使用。核心功能包含在基础软件包中,其他功能作为可选附加功能提供,以最大限度地减少软件包大小和依赖项。要安装
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
Simple Run Blocker -应用上锁工具
基于springboot+vue的网上零食销售商城。适用于计算机类毕业设计,课程设计参考与学习用途。 系统设计考虑了企业在库存管理中的各种需求,提供了包括用户管理、商品管理、库存监控、订单处理、数据分析、客户关系维护以及系统安全与配置在内的核心功能模块。用户管理模块支持用户信息的增删改查以及角色和权限的分配,确保了系统的安全性和多级管理的便捷性。商品管理模块允许轻松录入和更新商品信息,自动化记录库存变动,为库存优化提供了数据支持。订单管理模块覆盖了订单的整个生命周期,从创建到发货再到退货,每个环节都得到了精细化管理。报表统计模块通过生成各类报表,为决策提供了数据支撑。客户管理模块则侧重于维护客户信息和购买历史,以便更好地服务客户。最后,系统设置模块允许管理员根据业务需求调整系统参数。整个系统的设计旨在帮助企业提升库存管理的效率和精确度。本文研究成果为企业提供了一套完备的库存管理解决方案。 关键词: 库存管理;Spring Boot;Vue.js;系统设计;数据库
java面向对象 - 类与对象 在Java编程语言中,面向对象编程(OOP)是一个核心概念。它强调以对象作为程序的基本单位,并将相关的数据和功能封装在对象中。类和对象是Java OOP的两个关键组成部分。 ### 类(Class) 类是一个模板或蓝图,它定义了对象的属性和行为。我们可以将类视为对象的类型或种类。通过类,我们可以创建(实例化)具有特定属性和行为的对象。 类的组成部分通常包括: 1. **成员变量**(属性):用于存储对象的状态或数据。 2. **方法**(行为):定义了对象可以执行的操作或功能。 3. **构造方法**:一种特殊类型的方法,用于在创建对象时初始化其状态。 4. **块**(如静态块、实例初始化块):用于执行类级别的初始化代码。 5. **嵌套类**:一个类可以包含其他类,这被称为嵌套或内部类。 ### 对象(Object) 对象是类的实例。它是根据类模板创建的具体实体,具有自己的状态和行为。每个对象都是其类的一个唯一实例,可以访问其类中定义的属性和方法。 创建对象的过程通常涉及以下几个步骤: 1. **声明**:指定对象的类型(即其所属的类
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
Notepad-v2.20工具,是替代Notepad++的首选工具
项目管理软考基础知识点和冲刺要点
月色场景嫦娥弹琴flash动画.zip
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
图表效果及代码实现讲解链接:https://blog.csdn.net/zhangjiujiu/article/details/143997013
原生js模仿新浪微博发布评论代码.rar
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
内容概要:本文档提供了对外经济贸易大学20XX-20XX学年第X学期《宏观经济学》期末考试的试卷,涵盖了单项选择题、名词解释、简答题和论述题,旨在测试学生对宏观经济学基础知识和理论的理解及应用能力。试题内容涉及国内生产总值、边际消费倾向、通货膨胀、财政政策、货币政策等多个概念及其政策意义。 适合人群:对外经济贸易大学或类似院校的学生,尤其是修读《宏观经济学》课程的学生,教师也可作为教学参考资料。 使用场景及目标:①帮助学生全面掌握《宏观经济学》的基础知识点,为考试复习做准备;②教师可用作课堂教学材料或考试命题的参考;③研究机构研究人员可借鉴试卷内容进行相关课题研究。 其他说明:试卷难度适中,题目覆盖面广,既考查学生的记忆能力,也强调理解和分析能力。
数据库基本内容讲解和操作
计算机二级考试选择题练习模拟题70道及答案 所看及所得 内容有生成式AI自动出题并解析答案 欢迎爱学习的朋友下载
背包问题的求解。本资源是c++语言编程用遗传算法解决背包问题的源代码。代码可以自己设置物品的数量、种群的大小。进化次数、交叉概率、变异概率等参数。背包问题是给定一组物品,每个物品都有一个重量和一个价值,确定在不超过背包最大载重量的情况下,应该选择哪些物品,使得这些物品的总价值最大。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手