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 --'; 
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL中,exec是一个用来执行动态SQL语句的关键字。它的主要作用是允许我们在SQL语句中动态地执行其他SQL语句或存储过程。 exec的基本语法为:EXEC sql_statement 其中,sql_statement是被执行的SQL语句或存储过程。 在使用exec时,我们可以直接执行简单的SQL语句,如SELECT、INSERT、UPDATE和DELETE等。例如,可以使用以下语句执行一个查询操作: EXEC('SELECT * FROM table_name') 除了执行简单的SQL语句外,exec还可以用于执行存储过程。存储过程是一组经过预编译的SQL语句,可以在需要时重复执行。通过exec可以执行已经定义好的存储过程。例如,可以使用以下语句执行一个名为sp_name的存储过程: EXEC sp_name 在使用exec执行存储过程时,还可以向存储过程传递参数。参数可以是输入参数,也可以是输出参数或者是用于同时传递输入和输出值的双向参数。以下是一个向存储过程传递输入和输出参数的例子: DECLARE @input_param INT DECLARE @output_param INT SET @input_param = 1 EXEC sp_name @input_param, @output_param OUTPUT 上述代码中,@input_param是一个输入参数,@output_param是一个输出参数。通过将@output_param声明为OUTPUT,可以从存储过程中获取返回的值。 总而言之,execSQL中的用法是用来执行动态SQL语句或存储过程。它可以用于执行查询操作、执行存储过程以及传递参数,帮助我们更灵活和方便地处理SQL操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值