EXEC用法总结

一、使用EXEC执行存储过程

例如存储过名为:myprocedure

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

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

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

  1. exec ('select from mytable')  

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

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

下面的脚本是错误的:

  1. DECLARE @i AS INT;  
  2. SET @i 10248;  
  3.   
  4. DECLARE @sql AS VARCHAR(52);  
  5. SET @sql 'SELECT FROM dbo.Orders WHERE OrderID @i;';  
  6. EXEC(@sql);  
  7. 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.   
  4. DECLARE @sql AS VARCHAR(52);  
  5. SET @sql 'SELECT FROM dbo.Orders WHERE OrderID  
  6.   CAST(@i AS VARCHAR(10)) N';';  
  7. EXEC(@sql);  
  8. 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 --';  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值