例如存储过名为:myprocedure

  1. use AdventureWorks
  2. create procedure myprocedure @city varchar(20)
  3. as
  4. begin
  5. select * from Person.Address
  6. end
  1. exec myprocedure @city = 'Bothell'
  2. --或
  3. exec myprocedure 'Bothell'

二、使用EXEC执行动态的SQL语句

注意:动态的sql必须包含于圆括号内如:

  1. exec ('select * from mytable')

使用EXEC执行动态sql语句注意下面问题

1.不能有输入参数,输出参数

下面的脚本是错误的:

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

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

下面的脚本是错误的:

  1. DECLARE @schemaname AS NVARCHAR(128), @tablename AS NVARCHAR(128);
  2. SET @schemaname = N'dbo';
  3. SET @tablename = N'Order Details';
  4. EXEC(N'SELECT COUNT(*) FROM '
  5. + QUOTENAME(@schemaname) + N'.' + QUOTENAME(@tablename) + N';');
  6. GO

不过把函数放在变量中是可以的:

  1. DECLARE
  2. @schemaname AS NVARCHAR(128),
  3. @tablename AS NVARCHAR(128),
  4. @sql AS NVARCHAR(539);
  5. SET @schemaname = N'dbo';
  6. SET @tablename = N'Order Details';
  7. SET @sql = N'SELECT COUNT(*) FROM '
  8. + QUOTENAME(@schemaname) + N'.' + QUOTENAME(@tablename) + N';'
  9. EXEC(@sql);

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

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

当@i = 10248, 10249, 10250要生成3个执行计划。

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

  1. DECLARE @lastname AS NVARCHAR(40), @sql AS NVARCHAR(200);
  2. SET @lastname = N''' DROP TABLE dbo.Employees --';
  3. SET @sql = N'SELECT * FROM dbo.Employees WHERE LastName = '''
  4. + @lastname + ''';';
  5. EXEC @sql;
  6. GO

实际执行的sql为:

  1. SELECT * FROM dbo.Employees WHERE LastName = '' DROP TABLE dbo.Employees --';

普通SQL语句可以用Exec执行的更多相关文章

  1. 动态sql语句基本语法--Exec与Exec sp_executesql 的区别

    http://www.cnblogs.com/goody9807/archive/2010/10/19/1855697.html 动态sql语句基本语法 1   :普通SQL语句可以用Exec执行   ...

  2. [sqlserver脚本]查看指定SQL语句生成了哪些执行计划

    参考SQL技术内幕写了一段脚本,可以通过这段脚本查看执行指定SQL语句后,系统生成了哪些执行计划.使用时注意以下几点: 修改use MyTest,换成自己的数据库名字. 将 exec sp_page_ ...

  3. SQL语句到底是怎么执行的

    写在前面的话:有时不理解SQL语句各个部分执行顺序,导致理解上出现偏差,或者是书写SQL语句时随心所欲,所以有必要了解一下sql语句的执行顺序.可以有时间自己写一个简单的数据库,理解会更加深入.下面就 ...

  4. SQL 语句在查询分析器执行很快,程序 Dapper 参数化查询就很慢(parameter-sniffing)

    这个问题困扰我好长时间了,使用SQLSERVER 事务探查器找到执行超时的SQL语句,参数查询都是通过执行exe sp_executesql 的存储过程调用,因为它能够分析并缓存查询计划,从而优化查询 ...

  5. 【mybatis】mybatis执行一个update方法,返回值为1,但是数据库中数据并未更新,粘贴sql语句直接在数据库执行,等待好久报错:Lock wait timeout exceeded; try restarting transaction

    今天使用mybatis和jpa的过程中,发现这样一个问题: mybatis执行一个update方法,返回值为1,但是数据库中数据并未更新,粘贴sql语句直接在数据库执行,等待好久报错:Lock wai ...

  6. 009 面试题 SQL语句各部分的执行顺序

    SQL语句各部分的执行顺序 select distinct...from t1 (left/right) join t2 on t1.xx=t2.xx where t1.xx=? and t2.xx= ...

  7. SQL 语句与性能之执行顺序

    select * , t3.Name from t1 left join t2 on t1.sysno = t2.Asysno left join t3 on t3.sysno = t2.Bsysno ...

  8. SqlServer 中如何查看某一个Sql语句是复用了执行计划,还是重新生成了执行计划

    我们知道SqlServer的查询优化器会将所执行的Sql语句的执行计划作缓存,如果后续查询可以复用缓存中的执行计划,那么SqlServer就会为后续查询复用执行计划而不是重新生成一个新的执行计划,因为 ...

  9. 如何测试sql语句性能,提高执行效率

    有时候我们经常为我们的sql语句执行效率低下发愁,反复优化后,可还是得不到提高 那么你就用这条语句找出你sql到底是在哪里慢了 示例: SET STATISTICS io ON        SET ...

随机推荐

  1. 如何设置通过ip访问数据库

    文章转自:http://blog.163.com/wz_pk007/blog/static/17062705020119242440713/ 问题:mysql只能用localhost或127.0.0. ...

  2. 老项目的#iPhone6与iPhone6Plus适配#iOS8无法开启定位问题和#解决方案#

    本文永久地址为 http://www.cnblogs.com/ChenYilong/p/4020359.html,转载请注明出处. iOS8的定位和推送的访问都发生了变化, 下面是iOS7和iOS8申 ...

  3. AJAX创建表格,删除数据

    主页面 <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8 ...

  4. cocos基础教程(2)Window环境下搭建

    第一步:开始安装VS2012  第二步:下载Cocos2d-x 3.4源码  配置环境变量 COCOS_CONTROL = E:\cocos2d-x-3.4\tools\cocos2d-console ...

  5. XSS代码触发条件,插入XSS代码的常用方法

    1.脚本插入 (1)插入javascript和vbscript正常字符. 例1:<img src=”javascript:alert(/xss/)”> 例2:<table backg ...

  6. Matlab实现线性回归和逻辑回归: Linear Regression & Logistic Regression

    原文:http://blog.csdn.net/abcjennifer/article/details/7732417 本文为Maching Learning 栏目补充内容,为上几章中所提到单参数线性 ...

  7. 菜鸟带你飞______DP基础26道水题

    DP 158:11:22 1205:00:00   Overview Problem Status Rank (56) Discuss Current Time: 2015-11-26 19:11:2 ...

  8. PHP声明

    1. <!DOCTYPE> 声明位于文档中的最前面的位置,处于 <html> 标签之前.2. 此标签可告知浏览器文档使用哪种 HTML 或 XHTML 规范. <!DOC ...

  9. iptables 命令介绍

    http://www.cnblogs.com/wangkangluo1/archive/2012/04/19/2457072.html iptables 防火墙可以用于创建过滤(filter)与NAT ...

  10. SharePoint 2010 隐藏快速启动栏之使用内容编辑器webpart

    SharePoint 2010 自带的webpart里有一个叫内容编辑,在媒体和内容分类里面: 将其添加到页面后效果: 点击用于添加新内容,此时注意Ribbon菜单中的变化: 这里可以看到,你可以插入 ...