存储过程中拼接SQL语句

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

 

代码:

 

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
-- =============================================
-- Author:		yy
-- Create date: 2012-1-17
-- Description:	存储过程SQL字符串拼接示例
-- =============================================
CREATE PROCEDURE [dbo].[Test]
	@FileName varchar(10), --字段名
	@Operator varchar(1), --操作符
	@FileValue  varchar(10) --字段值
AS 
	DECLARE @TempSql varchar(100) --临时存放sql语句
BEGIN
	set @TempSql= 'select * from Comment where ' + @FileName + @Operator + char(39) + @FileValue + char(39) --拼接sql字符串,char(39)为单引号
	execute(@TempSql) --执行sql字符串
END

测试:

 

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”之间。

原文地址:https://www.cnblogs.com/iyangyuan/p/2801849.html