sql交叉报表的动态生成通用代码(不是我写的)use NorthWind goIF EXISTS (SELECT name FROM sysobjects WHERE name = 'cvt' AND type = 'P') DROP PROCEDURE cvt GOCREATE PROCEDURE cvt @table varchar(50), --表名 @row varchar(50), --行字段 @col varchar(50), --列字段 @content varchar(50) WITH ENCRYPTION AS declare @sql1 varchar(8000), @sql2 varchar(8000), @sql3 varchar(8000), @sql4 varchar(8000), @sql5 varchar(8000), @sql6 varchar(8000), @i int, @ic varchar(50), @mc varchar(50)exec('select ID=Identity(int,1,1),COL=''sum(case '+@col+' when ''''''+'+@col+'+'''''' then '+@content+' else 0 end) as ''''''+'+@col+'+'''''','' ,GID=0 into ##tmp from (select distinct '+@col+'=replace('+@col+','''''''','''''''''''') from '+@table+')a')select @i=Max(len(COL)) from ##tmp set @i=4000/@iupdate ##tmp set GID=ID/@i select @i=Max(GID),@mc=cast(@i as varchar(50)) from ##tmp select @sql1='',@sql2='',@sql3='',@sql4='',@sql5='' while @i>=0 select @ic=cast(@i as varchar(50)),@i=@i-1,@sql1='@'+@ic+' as varchar(4000),'+@sql1,@sql2='@'+@ic+'='''','+@sql2, @sql3='select @'+@ic+'=@'+@ic+'+COL from ##tmp where gid='''+@ic+''''+char(13)+@sql3,@sql4='@'+@ic+'+'+@sql4set @sql5=''' from '+@table+' group by '+@row+'''' select @sql1='declare '+left(@sql1,len(@sql1)-1)+char(13),@sql2='select '+left(@sql2,len(@sql2)-1)+char(13),@sql4=left(@sql4,len(@sql4)-1)exec(@sql1+@sql2+@sql3+ 'set @'+@mc+'=left(@'+@mc+',len(@'+@mc+')-1)'+ 'exec(''select '+@row+',''+'+@sql4+'+'+@sql5+')' )drop table ##tmpGOEXEC cvt '[Product Sales for 1997]','CategoryName','ProductName','ProductSales'
to zj教师:--1. 楼主的排序其实有点多余,因为存储过程本来接受的就是sql语句,要排序的话,调用时直接加在sql语句中就行了。 这样灵活性更大 >> 接受指正(只是以个人习惯)你给出的几个贴子中的例子相对来说已经是很完善了,如果在这之前我已经发现以上你所列出来的贴子的话,那我也不会费神让自己再整理了,今天也不会贴出来了。之所以贴出来,我只是感觉还是有点用,想与大家分享交流,因为自己感觉在 CSDN 上得到很多热心朋友的帮助和解答,其实我平时很少来CSDN,也只是有问题才来,如果每个人都只是因为有问题而来而没有去帮助那些需要有帮助的人话,那将会是件遗憾的事或说是有点自私,所以我感觉自己应该贴上点什么,仅此而已。
关于分页方案,我找到了一个比较高效率的写法,大家不妨参考一下。 前提是表中有一个 ID (int)字段。我们可以采用以下的写法: SELECT TOP 页大小 * FROM TestTable WHERE (ID NOT IN (SELECT TOP 页大小*页数 id FROM 表 ORDER BY id)) ORDER BY ID呵呵! 这种方法是不是很实用呢? 看下牛人是怎么分析的: http://dev.csdn.net/article/37/37213.shtm
我也收集了一个,现在一直用这个觉得速度很不错。CREATE PROCEDURE pageX@tblName varchar(255), -- 表名@strGetFields varchar(1000) = '*', -- 需要返回的列 @fldName varchar(255)='', -- 排序的字段名@PageSize int = 10, -- 页尺寸@PageIndex int = 1, -- 页码@doCount bit = 0, -- 返回记录总数, 非 0 值则返回@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序@strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)ASdeclare @strSQL varchar(5000) -- 主语句declare @strTmp varchar(110) -- 临时变量declare @strOrder varchar(400) -- 排序类型 if @doCount != 0 begin if @strWhere !='' set @strSQL = "select count(*) as Total from [" + @tblName + "] where "+@strWhere else set @strSQL = "select count(*) as Total from [" + @tblName + "]"end --以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况elsebegin if @OrderType != 0begin set @strTmp = "<(select min"set @strOrder = " order by [" + @fldName +"] desc"--如果@OrderType不是0,就执行降序,这句很重要!endelsebegin set @strTmp = ">(select max" set @strOrder = " order by [" + @fldName +"] asc"end if @PageIndex = 1begin if @strWhere != '' set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from [" + @tblName + "] where " + @strWhere + " " + @strOrder else set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from ["+ @tblName + "] "+ @strOrder--如果是第一页就执行以上代码,这样会加快执行速度endelsebegin--以下代码赋予了@strSQL以真正执行的SQL代码set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from [" + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["+ @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["+ @fldName + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"+ @strOrder if @strWhere != '' set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from [" + @tblName + "] where [" + @fldName + "]" + @strTmp + "([" + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " [" + @fldName + "] from [" + @tblName + "] where " + @strWhere + " " + @strOrder + ") as tblTmp) and " + @strWhere + " " + @strOrderend end print @strSql exec (@strSQL) GO
--2. 以前确实有整理好的存储过程(当然,没有像楼主那样加上排序)
http://community.csdn.net/Expert/topic/3147/3147548.xml?temp=.410763
http://community.csdn.net/Expert/topic/3181/3181570.xml?temp=.3937342
http://community.csdn.net/Expert/topic/3185/3185242.xml?temp=.9311487
http://community.csdn.net/Expert/topic/3308/3308140.xml?temp=.1725122--3. 我只是说明最早(对于我来说),是由j9988提供的资料,并不代表这种方法是j9988发现的,具体谁发现的反正我不知道,我只知道我自己最早从j9988那里获得此信息,所以前面我说的并未有指责楼主之意。--4. 在从j9988处获取这种方法后,通过事件探察器和其他一些网上资料的收集,发现这几个系统存储过程并不只限于分页处理,这是后话。
goIF EXISTS (SELECT name FROM sysobjects
WHERE name = 'cvt' AND type = 'P')
DROP PROCEDURE cvt
GOCREATE PROCEDURE cvt
@table varchar(50), --表名
@row varchar(50), --行字段
@col varchar(50), --列字段
@content varchar(50)
WITH ENCRYPTION
AS
declare
@sql1 varchar(8000),
@sql2 varchar(8000),
@sql3 varchar(8000),
@sql4 varchar(8000),
@sql5 varchar(8000),
@sql6 varchar(8000),
@i int,
@ic varchar(50),
@mc varchar(50)exec('select ID=Identity(int,1,1),COL=''sum(case '+@col+' when ''''''+'+@col+'+'''''' then '+@content+' else 0 end) as ''''''+'+@col+'+'''''','' ,GID=0 into ##tmp from (select distinct '+@col+'=replace('+@col+','''''''','''''''''''') from '+@table+')a')select @i=Max(len(COL)) from ##tmp
set @i=4000/@iupdate ##tmp set GID=ID/@i
select @i=Max(GID),@mc=cast(@i as varchar(50)) from ##tmp
select @sql1='',@sql2='',@sql3='',@sql4='',@sql5=''
while @i>=0
select @ic=cast(@i as varchar(50)),@i=@i-1,@sql1='@'+@ic+' as varchar(4000),'+@sql1,@sql2='@'+@ic+'='''','+@sql2,
@sql3='select @'+@ic+'=@'+@ic+'+COL from ##tmp where gid='''+@ic+''''+char(13)+@sql3,@sql4='@'+@ic+'+'+@sql4set @sql5=''' from '+@table+' group by '+@row+''''
select @sql1='declare '+left(@sql1,len(@sql1)-1)+char(13),@sql2='select '+left(@sql2,len(@sql2)-1)+char(13),@sql4=left(@sql4,len(@sql4)-1)exec(@sql1+@sql2+@sql3+
'set @'+@mc+'=left(@'+@mc+',len(@'+@mc+')-1)'+
'exec(''select '+@row+',''+'+@sql4+'+'+@sql5+')'
)drop table ##tmpGOEXEC cvt '[Product Sales for 1997]','CategoryName','ProductName','ProductSales'
>> 接受指正(只是以个人习惯)你给出的几个贴子中的例子相对来说已经是很完善了,如果在这之前我已经发现以上你所列出来的贴子的话,那我也不会费神让自己再整理了,今天也不会贴出来了。之所以贴出来,我只是感觉还是有点用,想与大家分享交流,因为自己感觉在 CSDN 上得到很多热心朋友的帮助和解答,其实我平时很少来CSDN,也只是有问题才来,如果每个人都只是因为有问题而来而没有去帮助那些需要有帮助的人话,那将会是件遗憾的事或说是有点自私,所以我感觉自己应该贴上点什么,仅此而已。
前提是表中有一个 ID (int)字段。我们可以采用以下的写法:
SELECT TOP 页大小 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id))
ORDER BY ID呵呵! 这种方法是不是很实用呢? 看下牛人是怎么分析的:
http://dev.csdn.net/article/37/37213.shtm
print @strSql
exec (@strSQL)
GO
http://community.csdn.net/Expert/topic/3035/3035833.xml?temp=.6057245