您的位置:首页 > 数据库

真TMD爽,第一次找到复杂SQL的错误

2006-03-20 17:58 197 查看
以前用的ASPNetPager的存储过程今天突然错了,郁闷啊!

因为以前只是用,今天第一次研究。。。。

哈哈!居然让我找到了错误所在。。。 嘿嘿

越来越强烈的体会到procdeure的强大!

Alter PROCEDURE dbo.Code_SYS_PackSqlInPage
(
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) = '*', -- 需要返回的列
@fldName varchar(255)='', -- 排序的字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = '', -- 页码
@OrderType bit = '', -- 设置排序类型, 非 0 值则降序
@strWhere varchar(8000) = '' -- 查询条件 (注意: 不要加 where)
)
AS
BEGIN
declare @strSQLCount nvarchar(4000) -- 主语句
declare @strSQL nvarchar(4000) -- 主语句
declare @strTmp varchar(1000) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
declare @sCRLF char(2)
declare @sTAB char(1)
SET @sTAB = char(9)
SET @sCRLF = char(13) + char(10)
if @strWhere !=''
set @strSQLCount = 'select count(1) as Total from ' + (@tblName) + @sCRLF+'where 1 = 1'+@sCRLF+@strWhere
else
set @strSQLCount = 'select count(1) as Total from ' + (@tblName)
--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况
if @OrderType = 0
BEGIN
set @strTmp = '<'+@sCRLF+'('+@sCRLF+@sTAB+'select min'
set @strOrder = 'order by ' + (@fldName)
--如果@OrderType不是0,就执行降序,这句很重要!
END
else
BEGIN
set @strTmp = '>'+@sCRLF+'('+@sCRLF+@sTAB+'select max'
set @strOrder = 'order by ' + (@fldName) +' asc'
END
if @PageIndex = 1
BEGIN
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields +@sCRLF+ ' from ' + (@tblName) + ' where 1 = 1 ' + @sCRLF + @strWhere
+ @sCRLF + @strOrder
else
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields +@sCRLF+ ' from '+ (@tblName) + ' '
+ @sCRLF + @strOrder
--如果是第一页就执行以上代码,这样会加快执行速度
END
else
BEGIN
--以下代码赋予了@strSQL以真正执行的SQL代码
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+@sCRLF+ 'from '
+ (@tblName)+@sCRLF+'where ' + (@fldName) + @strTmp +'('+ (@fldName) + ') from '+@sCRLF+@sTAB
+'('+@sCRLF+@sTAB+@sTAB
+'select top ' + str((@PageIndex-1)*@PageSize) + ' '+ (@fldName) + ' from ' + (@tblName)

if (len(@strWhere)>0)
set @strSQL = @strSQL + ' where 1 = 1 ' + @sCRLF + @strWhere + ' '

-- select @strSQL as SQLCommand1
set @strSQL = @strSQL+@sCRLF+@strOrder+@sCRLF+@sTAB
-- set @strSQL = @strSQL+@sCRLF+@sTAB
+ ')'+' as tblTmp'+@sCRLF
+')'
if (len(@strWhere)>0)
set @strSQL = @strSQL + @sCRLF + @strWhere +@sCRLF
set @strSQL = @strSQL + @strOrder
-- select @strSQL as SQLCommand
END
exec(@strSQL)
exec(@strSQLCount)
END

GO
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐