引言
在前一篇文章中说到了一个核心技术路线,就是在js代码中通过ajax请求调用sqlserver中的存储过程。
下面对这一个调用过程在数据库端的工作过程做一个较为详细的说明。因为这里用到了在存储过程中动态调用其它存储过程的技术,所以值得细讲一下。
项目的源码可在CSDN资源中下载
入口存储过程
现在很多网络应用都在使用单入口技术。在本项目中通过一个入口存储过程,实现了单入口功能。下面看一下这个入口存储过程的代码
CREATEPROCEDURE dbo.callProc@procName varchar(100) ,@inStr varchar(200) ,@outStr varchar(4000) outputasset nocount onbegindeclare @SQLString nvarchar(500)declare @ParmDefinition nvarchar(500)declare @outPara varchar(4000)if rtrim(ltrim(@inStr)) <>''beginset @inStr = @inStr + ','endset @SQLString = N'exec '+ @procName + ' '+@inStr+ '@outPara out'set @ParmDefinition = N'@outPara varchar(4000) OUTPUT'EXECUTE sp_executesql @SQLString, @ParmDefinition, @outPara=@outStr outputreturn 0end
所有其它的存储过程都是通过这个入口存储过程被调用的,而所有的后台业务逻辑都是由存储过程来实现。所以这就是后台应用的一个单入口。
该存储过程有三个参数:
@procName varchar(100) ,
@inStr varchar(200) ,
@outStr varchar(4000) output
第一个参数指明要被调用的实现业务功能的存储过程的名字,第二个参数指明被实际调用的存储过程的的参数。此处参数是由逗号分隔的形式,所以可以传递任意数量的参数。 同时约定,被调用的存储过程返回一个json串,所以只需要一个输出参数就可以返回实际产生的结果。
在这里要说明一下,由于被调用的存储过程的名字是通过一个字符串参数传进来的,所以不能像通常调用存储过程那样
exec someSP,…
因为在写代码时,并不知道具体要调用哪一个存储过程,所以这里要运用到sqlserver的动态执行能力。而这一点是通过一个系统存储过程 sp_executesql 实现的。
这个sp_executesql 可以动态地执行sql语句,其能力相当于 javascript中的eval, php中的call_user_function。
由于可以动态地执行sql语句,所以代码变得很灵活。
可以这么说,如果sqlserver 没有提供 sp_executesql,就没有办法实现单入口存储过程。
对于sp_executesql的使用来说,输入参数的使用很简单,用逗号分隔开来就是了,但是输出参数的使用就要特别注意了
1,要先定义一个局部变量,用于接受输出的值
2,要在参数后面跟一个关键字 output
3, 要为sp_executesql 的第2个参数指定输出的参数的定义串
4,要为sp_executesql 的第3个参数指定接收输出的变量,并且要加上 output关键字。
上面这些关键点,如果不通过本文所给出的具体例子,是很难一下写出正确的调用代码的。所以看一下实测通过了的例子比单纯的文字说明要有用得多。
对动态调用存储过程感兴趣,但是又没有实际调用成功的朋友,可以仔细看一下本文给出的源码,总共没有几行,但是完整地展现了动态调用 ,特别是取回输出参数值的完整过程。、