动态SQL语句传参问题总结一
来源:互联网 发布:导出数据库命令plsql 编辑:程序博客网 时间:2024/04/29 17:02
在调用分页存储过程的时候往往会遇到参数被当做字符传递,而没被赋值的情况:
例入:有如下分页存储过程
create PROCEDURE [dbo].[PageChange_sp]
(
@TableName varchar(max), --表名
@ReFieldsStr varchar(max) = '*', --字段名(全部字段为*)
@OrderString varchar(max), --排序字段(必须!支持多字段不用加order by)
@WhereString varchar(max) =N'', --条件语句(不用加where)
@PageSize int, --每页多少条记录
@PageIndex int = 1 , --指定当前为第几页
@TotalRecord int output --返回总记录数
)
AS
BEGIN
--处理开始点和结束点
Declare @StartRecord int;
Declare @EndRecord int;
Declare @TotalCountSql nvarchar(max);
Declare @SqlString nvarchar(max);
set @StartRecord = (@PageIndex-1)*@PageSize + 1
set @EndRecord = @StartRecord + @PageSize - 1
SET @TotalCountSql= N'select @TotalRecord = count(1) from ' + @TableName;--总记录数语句
SET @SqlString = N'(select row_number() over (order by '+ @OrderString +') as rowId,'+@ReFieldsStr+' from '+ @TableName;--查询语句
--
IF (@WhereString! = '' or @WhereString!=null)
BEGIN
SET @TotalCountSql=@TotalCountSql + ' where '+ @WhereString;
SET @SqlString =@SqlString+ ' where '+ @WhereString;
END
--第一次执行得到
--IF(@TotalRecord is null)
-- BEGIN
EXEC sp_executesql @totalCountSql,N'@TotalRecord int out',@TotalRecord output;--返回总记录数
-- END
----执行主语句
set @SqlString ='select * from ' + @SqlString + ') as t where rowId between ' + ltrim(str(@StartRecord)) + ' and ' + ltrim(str(@EndRecord));
Exec(@SqlString)
END
在另外一个存储工程中调用该存储过程传递参数!
错误的方式:
create proc GetUserInfo(@UserId int,@UserType int,@PageSize int,@PageIndex int)
as
begin
DECLARE @TotalRecord int
Declare @strWhere nvarchar(max)
set @strWhere='UserId=@UserId and UserType =@UserType '
exec PageChange_sp User_tb,'*',UserId Desc',@strWhere,@pPageSize,@pPageIndex,@TotalRecord out
end
上面这种传递参数的方式会导致 @UserId @UserType 直接传到分页存储过程,而在分页存储过程中没有@UserId和@UserType而报错。。
解决方法如下:
create proc GetUserInfo(@UserId int,@UserType int,@PageSize int,@PageIndex int)
as
begin
DECLARE @TotalRecord int
Declare @strWhere nvarchar(max)
set @strWhere='UserId='ltrim(@UserId)+' and UserType ='+ltrim(@UserType)'
exec PageChange_sp User_tb,'*',UserId Desc',@strWhere,@pPageSize,@pPageIndex,@TotalRecord out
end
- 动态SQL语句传参问题总结一
- SQL语句写法总结一
- 常用SQL语句总结<一>
- SQL语句总结一(MS SQL Server)
- ORACLE SQL语句优化总结(一)
- 自我总结的一引起SQL语句
- SQL语句:Group By总结一
- Oracle Sql 语句优化技巧总结一
- MySQL数据库常用SQL语句总结一
- mysql基本sql语句总结(一)
- MySQL基础sql语句总结(一)
- 【MYSQL】基础SQL语句总结(一)
- SQL语句中的日期问题一
- 比较复杂的动态SQL语句功能一例
- 比较复杂的动态SQL语句功能一例
- 比较复杂的动态SQL语句功能一例
- 比较复杂的动态SQL语句功能一例
- MyBatis学习总结(三):执行动态SQL语句
- Unix基础知识
- 字符数组和字符指针的例子--一个字符查找函数
- USB HDD
- Linux RPM包使用指南
- WebView
- 动态SQL语句传参问题总结一
- 在VIM中实现对嵌入式软件的调试
- wpf 中利用border创建带有圆角的区域
- 操作系统启动过程
- 不是很爽
- SQL Server压缩日志及数据库文件大小
- sudo 与 su
- ckEditor 和 ckFinder 的使用
- ado初始化