SQL 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 --'; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值