在家学习下MSSQL的零食表玩法 经过一个存储过程 由于不知道怎么怎么在存储过程里动态调用SQL 因此不得不想另想办法 因此想到了临时表的办法 其关键点就是在获得的条数数据储存到临时表中而后再读取临时表 从而达到获取所有条数的目的 其中也学到了很多新东西sql
1.临时表的判断存在的写法 (临时表表名 #tt)函数
if(exists(select * from tempdb..sysobjects where id = OBJECT_ID('tempdb..#tt') ) ) 学习
2.临时表的概念table
能够建立本地和全局临时表。本地临时表仅在当前会话中可见;全局临时表在全部会话中均可见。
本地临时表的名称前面有一个编号符 (#table_name),而全局临时表的名称前面有两个编号符 (##table_name)。变量
通常都是用本地临时的(#) 其余人看不到 建立方法和建立表同样只是表名前面有个#object
3.存储过程当中动态执行SQL的函数 sp_executesql 记得动态SQL的变量类型不能为varchar 必须是N开头的 例如nvarcharselect
exec sp_executesql @sqllen, N'@TotleCount int output',@TotleCount output 方法
原版用临时表实现的结果im
if(exists(select * from sysobjects where id= OBJECT_ID('procTest') ))
begin
drop proc procTest
end 数据
go
create proc procTest
@FeeID varchar(100),
@Money varchar(100),
@Index int,
@Size int,
@TotleCount int output
as
if(exists(select * from tempdb..sysobjects where id = OBJECT_ID('tempdb..#tt') ) )
begin
truncate table #tt
end
else
begin
create table #tt
(
tLen int
)
end
declare @sql varchar(max)
declare @sqllen varchar(max)
set @sql='select ROW_NUMBER() over(order by main_time) as rowIndex ,* from main where 1=1 '
if(ISNULL( @FeeID,'')!='')
begin
set @sql+= ' and main_feeId='+@FeeID
end
if(ISNULL( @Money,'')!='')
begin
set @sql+= ' and main_money='+@Money
end
declare @start int
declare @end int
set @start= (@Index-1)*@Size+1
set @end=@Size*@Index
set @sqllen=' insert into #tt select count(1) from ('+@sql+') t '
--print(@sqllen)
exec(@sqllen)
select @TotleCount=tLen from #tt
set @sql= 'select * from ( '+@sql+') t where rowIndex between '+ CONVERT(varchar(10), @start) +' and '+ CONVERT(varchar(10), @end)
exec(@sql)
改写后的结果
if(exists(select * from sysobjects where id= OBJECT_ID('procTest') ))
begin
drop proc procTest
end
go
create proc procTest
@FeeID varchar(100),
@Money varchar(100),
@Index int,
@Size int,
@TotleCount int output
as
declare @sql varchar(max)
declare @sqllen nvarchar(max)
set @sql='select ROW_NUMBER() over(order by main_time) as rowIndex ,* from main where 1=1 '
if(ISNULL( @FeeID,'')!='')
begin
set @sql+= ' and main_feeId='+@FeeID
end
if(ISNULL( @Money,'')!='')
begin
set @sql+= ' and main_money='+@Money
end
declare @start int
declare @end int
set @start= (@Index-1)*@Size+1
set @end=@Size*@Index
set @sqllen=' select @TotleCount= count(1) from ('+@sql+') t '
exec sp_executesql @sqllen, N'@TotleCount int output',@TotleCount output
set @sql= 'select * from ( '+@sql+') t where rowIndex between '+ CONVERT(varchar(10), @start) +' and '+ CONVERT(varchar(10), @end)
exec(@sql)
调用
declare @aa int exec procTest '7','',1,40, @aa output select @aa