EXEC

Exec 命令有两种用法
1、执行存储过程
2、执行动态的批处理

exec 存储过程 @参数 = 值
--或
exec 存储过程 值 exec 存储过程  存储过程中的参数=参数{接受参数返回值} outputCREATE PROCEDURE [dbo].[Sp_GetStudent]@Score FLOAT,@Nums INT OUTPUT
AS
BEGINSET NOCOUNT ON;SELECT * FROM t_student WHERE Score >=@ScoreSELECT @Nums=COUNT(1) FROM t_student WHERE Score >=@ScoreIF(@Nums>0)RETURN 1ELSERETURN 0
END
GO
DECLARE @return_value int,@OutNums int
EXEC    @return_value = [dbo].[Sp_GetStudent]  @Score = 90,@Nums = @OutNums OUTPUT
SELECT  @OutNums as N'大于90分的人数'
SELECT  '返回值' = @return_value
GO
exec ('select * from mytable')

使用EXEC执行动态sql语句注意下面问题
1.不能有输入参数,输出参数

DECLARE @i AS INT;
SET @i = 10248;
DECLARE @sql AS VARCHAR(52);
SET @sql = 'SELECT * FROM dbo.Orders WHERE OrderID = @i;';
EXEC(@sql);
GO

2.圆括号内部能使用函数或case表达式

----下面的脚本是错误的:
DECLARE @schemaname AS NVARCHAR(128), @tablename AS NVARCHAR(128);
SET @schemaname = N'dbo';
SET @tablename = N'Order Details';
EXEC(N'SELECT COUNT(*) FROM '  + QUOTENAME(@schemaname) + N'.' + QUOTENAME(@tablename) + N';');
GO
------不过把函数放在变量中是可以的:
DECLARE  @schemaname AS NVARCHAR(128),  @tablename AS NVARCHAR(128),  @sql AS NVARCHAR(539);
SET @schemaname = N'dbo';
SET @tablename = N'Order Details';
SET @sql = N'SELECT COUNT(*) FROM '  + QUOTENAME(@schemaname) + N'.' + QUOTENAME(@tablename) + N';'
EXEC(@sql);

3.不能利用重用执行计划,存所以存在性能问题

DECLARE @i AS INT;
SET @i = 10248;  DECLARE @sql AS VARCHAR(52);
SET @sql = 'SELECT * FROM dbo.Orders WHERE OrderID = '  + CAST(@i AS VARCHAR(10)) + N';';
EXEC(@sql);
GO

4、容易被sql注入,存在安全问题。

DECLARE @lastname AS NVARCHAR(40), @sql AS NVARCHAR(200);
SET @lastname = N''' DROP TABLE dbo.Employees --';
SET @sql = N'SELECT * FROM dbo.Employees WHERE LastName = '''  + @lastname + ''';';
EXEC @sql;
GO
--实际sql SELECT * FROM dbo.Employees WHERE LastName = '' DROP TABLE dbo.Employees --';
注意

EXEC 执行拼接的SQL语句的时候,不支持内嵌参数,包括输入参数和输出参数。有的时候我们想把得到的count(*)传出来,用EXEC是不好办到的

sp_executesql

重用执行计划提供更好的支持
语法结构
sp_executesql [ @stmt = ] stmt
[
{, [@params=] N’@parameter_name data_type [ OUT | OUTPUT ][,…n]’ }
{, [ @param1 = ] ‘value1’ [ ,…n ] }
]

exec sp_executesql
@stmt=<statement>,----类似存储过程的主体
@params=<params>,-----类似存储过程的参数部分
@<params assignment>----类似存储过程的调用
--@stmt参数是输入的动态批处理,它可以引入输入参数或输出参数,和存储过程的主体语句一样,只不过它是动态的,而存储过程是静态的,不过你可以在存储过程中使用sp_executesql
---@params参数于定义输入、输出参数的存储过程头类似,实际上和存储过程的语法完全一样
--@<params assignment>与调用存储过程的exec部分类似

DECLARE @TotalSqlStr NVARCHAR(MAX);
SET @TotalSqlStr = 'SELECT @TotalRecords = COUNT(p.Id) FROM (SELECT ' + @MainSqlStr + @FilterStr + ') AS p';EXEC sp_executesql
@TotalSqlStr,
N'@TotalRecords INT OUTPUT',
@TotalRecords OUTPUT

如果你要把输出返回给调用批处理中的变量,事情就没有那么简单了。为此,你必须使用INSERT EXEC语法把输出插入到一个目标表中,然后从这表中获取值后赋给该变量,就像这样:

DECLARE @sql NVARCHAR(MAX),@RecordCount INT
SET @sql = 'SELECT COUNT(ORDERID) FROM Orders';
CREATETABLE #T(TID INT);
INSERT INTO #T EXEC(@sql);   --这里是一个表格
SET @RecordCount = (SELECT TID FROM #T)
SELECT @RecordCount
DROP TABLE #T
SP_EXECUTESQL 支持内嵌参数:

因为参数是运行时传递进去SQL的,而不是编译时传递进去的,传递的参数是什么就按照什么执行,参数本身不参与编译




所谓的参数化SQL,就是用变量当做占位符,通过 EXEC sp_executesql执行的时候将参数传递进去SQL中,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,这样的话,

第一,既能避免第一种写法中的SQL注入问题(包括转移符的处理),
   因为参数是运行时传递进去SQL的,而不是编译时传递进去的,传递的参数是什么就按照什么执行,参数本身不参与编译
第二,保证执行计划的重用,因为使用占位符来拼凑SQL的,SQL参数的值不同并导致最终执行的SQL文本不同
   同上面,参数本身不参与编译,如果查询条件一样(SQL语句就一样),而参数不一样,并不会影响要编译的SQL文本信息

缺点,1,对于这种方式,也有一点不好的地方,就是拼凑的字符串处理过程中,调试具体的SQL语句的时候,参数是直接拼凑在SQL文本中的,不能直接执行,要手动将占位参数替换成具体的参数值

SQL SERVER EXEC 、SP_EXECUTESQL相关推荐

  1. LINUX 下SQL server 安装、配置及对接ceph功能性能测试

    1.安装ceph环境(略) 2.安装iscsi 启动器及目标器(略) 修改iscsi启动器地址为ceph集群块设备target,然后扫描并登陆启动器,挂载块设备 这里最好使用多路径(安装multipa ...

  2. Sql Server 添加、修改列脚本

    Sql Server 添加.修改列脚本 --添加列 ALTER TABLE StudentsADD Name NVARCHAR(50) NULL --修改列 ALTER TABLE StudentsA ...

  3. oracle数据库需要的端口号,SQL Server数据库、MySQL、Oracle数据库各自的默认端口号...

    我们今天主要向大家讲述的是SQL Server数据库.MySQL.Oracle数据库各自的默认端口号,以下就是对SQL Server数据库.MySQL.Oracle数据库各自的默认端口号的描述,望在你 ...

  4. SQL Server 中位数、标准差、平均数 1

    SQL Server 中位数.标准差.平均数 复制代码 create table examines ([e_id] [int] IDENTITY(1,1) NOT NULL,[dept_name] [ ...

  5. SQL Server 事务、异常和游标

    建议先阅读存储过程:SQL Server 存储过程 Ø 事务 在数据库中有时候需要把多个步骤的指令当作一个整体来运行,这个整体要么全部成功,要么全部失败,这就需要用到事务. 1. 事务的特点 事务有若 ...

  6. 5、SQL Server数据库、T-SQL

    SQL Server数据库基础 一.安装SQL Server数据库 setup.exe->安装->全新SQL Server独立安装或向现有安装添加功能->输入序列号->下一步- ...

  7. 工作学习笔记——用SQL语句新建SQL SERVER数据库、数据库用户以及登录名

    查阅了一些资料,对几个概念先有了个大概的认识.登录名用来连接SQL SERVER数据库,也就是连接字符串里USER ID的值.同一个登录名可以操作很多数据库,只需要这些数据库中有拥有操作权限的数据库用 ...

  8. SQL Server Cast、Convert数据类型转换

    一.概述 本篇文章转载来着官网在线文档,文章主要介绍SQL Server数据类型转换相关语法.隐式转换.Date样式等. 语法 Syntax for CAST: CAST ( expression A ...

  9. 常用的sql server 函数、存储过程、临时表总结

    最近写T-sql语句比较多, 想把这段时间遇到过的貌似有用的一些sql server的函数,存储过程,临时表等总结一下,以便不时之需,当然不会一下子所有都总结,但会分段总结: 1)存储过程定义: cr ...

最新文章

  1. 项目管理过程中应注意的问题
  2. LR11之web_reg_find文本检查点的使用
  3. 如何删除计算机桌面多余的大e,桌面有个大E浏览器图标,怎么也删除不了
  4. 使用sui实现的选择控件【性别、日期、省市级联】
  5. ubuntu终端快捷键
  6. OK6410裸机开发之LED灯
  7. Python成长之路【第七篇】:Python基础之装饰器
  8. python四分位数_Python解释数学系列——分位数Quantile
  9. python字典怎么输出key_python如何调用字典的key
  10. 数据库中表名、字段名、字符串大小写处理规则
  11. windows 10无法安装virtualbox的解决方法
  12. wordpress利用rsync同步备份
  13. win7中office2016版的word在非管理员账户时无法插入页码问题解决记录
  14. 解析移动互联网四大App云加固平台市场和质量对比
  15. 【大数据搜索引擎案例汇总】
  16. C++中为二维数组开辟空间,并释放空间
  17. python3爬虫伪装代理IP
  18. Spring框架及其特点
  19. 搜索引擎site关键字的站内搜索
  20. 你是我今生最美的相遇

热门文章

  1. 软件需求规格文档(含附录)
  2. matlab迭代求解,[基于matlab平台的三种迭代法求解矩阵方程]matlab迭代法求方程的根...
  3. 取消input焦点,返回上一页
  4. martini-md参数(mdp文件)
  5. 表达式必须包含指向对象的指针类型,但他具有“int“?
  6. php自动回复指定的词,金鱼,PHP自动回复脚本
  7. CNN实现图像风格迁移 ---Image Style Transfer Using Convolutional Neural Networks
  8. VM下ubuntu cheese调用笔记本摄像头,解决黑屏问题
  9. matplotlib小抄与实战
  10. 测试基于php的购物网站,基于ThinkPHP开发的购物网站-微淘淘开发笔记