EXEC用法总结

摘要:
容易被sql注入,存在安全问题。

一、使用EXEC执行存储过程

例如存储过名为:myprocedure

  1. useAdventureWorks
  2. createproceduremyprocedure@cityvarchar(20)
  3. as
  4. begin
  5. select*fromPerson.Address
  6. end
  1. execmyprocedure@city='Bothell'
  2. --或
  3. execmyprocedure'Bothell'

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

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

  1. exec('select*frommytable')

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

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

下面的脚本是错误的:

  1. DECLARE@iASINT;
  2. SET@i=10248;
  3. DECLARE@sqlASVARCHAR(52);
  4. SET@sql='SELECT*FROMdbo.OrdersWHEREOrderID=@i;';
  5. EXEC(@sql);
  6. GO

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

下面的脚本是错误的:

  1. DECLARE@schemanameASNVARCHAR(128),@tablenameASNVARCHAR(128);
  2. SET@schemaname=N'dbo';
  3. SET@tablename=N'OrderDetails';
  4. EXEC(N'SELECTCOUNT(*)FROM'
  5. +QUOTENAME(@schemaname)+N'.'+QUOTENAME(@tablename)+N';');
  6. GO

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

  1. DECLARE
  2. @schemanameASNVARCHAR(128),
  3. @tablenameASNVARCHAR(128),
  4. @sqlASNVARCHAR(539);
  5. SET@schemaname=N'dbo';
  6. SET@tablename=N'OrderDetails';
  7. SET@sql=N'SELECTCOUNT(*)FROM'
  8. +QUOTENAME(@schemaname)+N'.'+QUOTENAME(@tablename)+N';'
  9. EXEC(@sql);

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

  1. DECLARE@iASINT;
  2. SET@i=10248;
  3. DECLARE@sqlASVARCHAR(52);
  4. SET@sql='SELECT*FROMdbo.OrdersWHEREOrderID='
  5. +CAST(@iASVARCHAR(10))+N';';
  6. EXEC(@sql);
  7. GO

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

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

  1. DECLARE@lastnameASNVARCHAR(40),@sqlASNVARCHAR(200);
  2. SET@lastname=N'''DROPTABLEdbo.Employees--';
  3. SET@sql=N'SELECT*FROMdbo.EmployeesWHERELastName='''
  4. +@lastname+''';';
  5. EXEC@sql;
  6. GO

实际执行的sql为:

  1. SELECT*FROMdbo.EmployeesWHERELastName=''DROPTABLEdbo.Employees--';

免责声明:文章转载自《EXEC用法总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇jquery hover事件只触发一次动画Ansible进阶下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ORACLE ROWNUM解析[转]

一、对rownum的说明    关于Oracle 的 rownum 问题,很多资料都说不支持SQL语句中的“>、>=、=、between...and”运算符,只能用如下运算符号“<、<=、!=”,    并非说用“>、>=、=、between..and”时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫...

Mysql 合并结果接横向拼接字段

近日在做一个报表功能里面有一个这样的需求是统计各部门在某一月入职和离职的人数 我的步骤是这样先查出入职的人数关键sql如下: SELECT dept ,COUNT(1) rcNumber FROM 员工表 WHERE ( 入职时间 != '' OR 入职时间 IS NOT NULL) and DATE_FORMAT(入职时间...

Oracle去除重复(某一列的值重复),取最新(日期字段最新)的一条数据

参考地址:https://blog.csdn.net/nux_123/article/details/45037719 解决思路:用Oracle的row_number() over函数来解决该问题。 解决过程: 1.查看表中的重复记录 SELECT * FROM find_new ; 2.标记重复的记录 select t.id, t.name,...

oracle中imp命令具体解释

oracle中imp命令具体解释 Oracle的导入有用程序(Import utility)同意从数据库提取数据,而且将数据写入操作系统文件。imp使用的基本格式:imp[username[/password[@service]]],下面例举imp经常使用用法。 1. 获取帮助 imp help=y 2. 导入一个完整数据库 imp syste...

oracle dblink使用

一、dblink介绍 dblink是一个单向的数据库连接,通过设置可以访问其他数据库中的数据跟使用本地数据库中数据一样的感觉,但注意是单向的dblink。例如:A建连B的dblink,A可以访问B的表,插入数据到B的表等,但反过来B不可以。 创建dblink一般有两种方式,不过在创建dblink之前用户必须有创建dblink的权限。想知道有关dblink的...

SQL 语句解析

查询语句 1.基础查询: SELECT * FROM 表 解析:此语句会将表中所有的字段查询出来,SQL执行的顺序:FROM 表 (找到表)=>SELECT *  (查询所有字段*代表所有字段) SELECT ID,NAME FROM 表 解析:此语句会将表中所有的字段查询出来,SQL执行的顺序:FROM 表 (找到表)=>SELECT  ...