存储过程中拼接SQL语句

很多时候我们需要利用参数在存储过程中重新组织SQL语句,在存储过程中拼接的SQL语句只是一个字符串,不会被直接执行,所以加一个execute执行它就可以了。具体看如下演示代码:

 

代码:

 

[sql] view plain copy
 
 print?
  1. set ANSI_NULLS ON  
  2. set QUOTED_IDENTIFIER ON  
  3. go  
  4. -- =============================================  
  5. -- Author:      yy  
  6. -- Create date: 2012-1-17  
  7. -- Description: 存储过程SQL字符串拼接示例  
  8. -- =============================================  
  9. CREATE PROCEDURE [dbo].[Test]  
  10.     @FileName varchar(10), --字段名  
  11.     @Operator varchar(1), --操作符  
  12.     @FileValue  varchar(10) --字段值  
  13. AS   
  14.     DECLARE @TempSql varchar(100) --临时存放sql语句  
  15. BEGIN  
  16.     set @TempSql= 'select * from Comment where ' + @FileName + @Operator + char(39) + @FileValue + char(39) --拼接sql字符串,char(39)为单引号  
  17.     execute(@TempSql) --执行sql字符串  
  18. END  

测试:

 

 

[sql] view plain copy
 
 print?
  1. execute Test 'newsid','>',4  

 

     在这解释一下“ALTERPROCEDURE [dbo].[Test]”至“AS”之间的代码和“AS”至“BEGIN”之间的代码有什么区别,像我这种SQL新手应该会有疑问:为什么@TempSql要定义在“AS”至“BEGIN”之间?因为,“AS”至“BEGIN”之间定义的为临时变量,前边必须加DECLARE,和其他语言中普通变量的使用方法相同;而“ALTER PROCEDURE [dbo].[Test]”至“AS”之间定义的是存储过程被调用时传入的必要参数,必须在调用的时候就赋值,不可以加DECLARE,可以理解为字符常量,一旦调用时被赋值,就再无法改变,就上边例子来说,类似@FileName=’xxx’的写法是错误的。因为@TempSql只是用来接受SQL语句的临时变量,没有初值,但必须接受值,所以要定义在“AS”至“BEGIN”之间。

 

posted @ 2016-12-21 16:36  Best丶zhaotf  阅读(555)  评论(0编辑  收藏  举报