如何通过执行动态sql获取分页需要的总记录数

2025-02-23 11:56:49
推荐回答(1个)
回答1:

�衷诘奈侍饩凸榻嵩谡饷窗鸦袢∽芗锹挤祷氐酱娲⒐�痰氖涑霾问�小O衷诩虻ヌ�隹突П斫峁梗�   接着贴出我的存储过程: Create proc [dbo].[Get_Customer] @type varchar(1000), @pageIndex int, @pageSize int, @RecordCount int outputasdeclare @beginIndex int declare @endIndex int declare @sql Nvarchar(max)注意这里定义的是Unicode变量 set @beginIndex=(@pageIndex-1)*@pageSize+1 set @endIndex=@pageIndex*@pageSize set @sql=' IF OBJECT_ID(''tempdb..#temp'') IS NOT NULL DROP TABLE #temp select ROW_NUMBER() over (order by c.Id) as id,CustomNO,Name,Phone,Email,Type into #temp from Customer ' if(@type is not null) set @sql=@sql+'where type='''+@type+'' set @sql=@sql+' select @p=COUNT(*) from #temp select * from #temp where #temp.rowNum between ' + cast(@beginIndex as varchar(10))+' and '+ cast(@endIndex as varchar(10)) --使用EXECUTE直接执行获取不到总记录数 --EXECUTE (@sql) --使用EXECUTE执行sp_executesql存储过程才能获取到  EXECUTE sp_executesql @sql,N'@p AS INT OUTPUT',@p=@RecordCount Output 其实以上两种执行的方式差别就是:一种是执行一个动态的批处理,另一种是执行一个存储过程 sp_executesql命令,因为它提供一个接口,该接口及支持输入参数也支持输出参数。这功能使你可以创建带参数的查询字符串,这样就可以比EXEC更好的重用执行计划,sp_executesql的构成与存储过程非常相似,不同之处在于你是动态构建代码。通过上面的列子的话可以看见直接执行批处理时获取不到动态语句里面的总记录数的。 构造动态sql的where子句,也就是条件子句时,exec无法使用变量来进行占位,需要将变量转换成字符串,然后和动态sql进行拼接,这就可能引起Sql注入问题,而通过sp_executesql就不会有这个问题 比如上面的存储过程可以按一下方式修改执行修改一: set @sql=@sql+'where type='''+@type+''改为: set @sql=@sql+'where type=@typ' 修改二 --使用EXECUTE执行sp_executesql存储过程才能获取到 EXECUTE sp_executesql @sql,N'@p AS INT OUTPUT',@p=@RecordCount Output 改为 --使用EXECUTE执行sp_executesql存储过程才能获取到 EXECUTE sp_executesql @sql,N'@typ Nvarchar(50),@p AS INT OUTPUT',@typ=@type @p=@RecordCount Output 至于sp_executesql更详细的语法及使用方式请参考其它资料,或者直接打开数据库然后按F1寻求帮助 嘿嘿!! ,本站保留追究责任的权利。