SQL exec的用法

一、使用EXEC执行存储过程

1.執行帶返回參數/輸入參數的存儲過程

declare @count decimal(18,2)
exec Pro_Get_TotalNum 'CP-151207-27 ','2-1-1','-',@count output
print @count

2.執行存儲過程

exec Pro_Get_TotalNum

3.執行帶輸入參數的存儲過程

exec Pro_Get_TotalNum @DocNo = 'P-151207-27' 

或  exec Pro_Get_TotalNum  'P-151207-27'

或  exec Pro_Get_TotalNum  'P-151207-27','001'

 

二、使用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 --';  

 

posted on 2015-12-08 16:37  明俠遠飄  阅读(4980)  评论(0编辑  收藏  举报

导航