导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

这个问题问了好几天。虽然问题我解决了,但算法效率感觉不是很好.

My_first 2002-12-28 02:31:35
declare @i int --当查询结果小于100条记录的时候就不添加空行,如果小于100行的时候添加100-Count(*)条记录到#table2里面.
select @i=count(khbh) from #table2
if @i<100
Begin
(select identity(int,1,1) as khbh,null as A,null as B,null as C, null as D,Null as E into #temp1 from (select top 100 * from sysobjects) a)
select khbh,类型,单号,限定日期,欠款金额,ordertype From #table2
union all
SELECT khbh,null,null,null,null,Null From #temp1
where #temp1.khbh>@i
drop table #temp1
end else
select * from #table2

能不能用while @i<100
begin

end; 为替代。或者有更好的办法。因为我上面的写法还要借助sysobjects
先谢谢各位朋友。
这个题目上,判断#table2的记录数是否小于100, 如果小于则用空行填补后面的行。 如果大于则什么都不做. 照样输出。

再次感谢!!! , 从上星期三到现在呀!!.

...全文
3 点赞 收藏 16
写回复
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝天 2002-12-29
关于固定表,你可能没明白我的意思,我的意思固定表就是一个只读表。里面就100条数据。
从1,null,null,null,null,Null
到100,null,null,null,null,Null
免除你每次生成之苦

不过因为只有100条,用循环生成也可以
那就是

declare @i int
declare @temp table (a int ,b int, c int, d int, e int , f int )
select @i=count(khbh) from #table2
while @i<100
begin
insert @temp values ( @i,null,null,null,null,Null )
select @i=i+1
end;
select khbh,类型,单号,限定日期,欠款金额,ordertype From #table2
union all select * from @temp



回复
My_first 2002-12-29
while @i<100
begin
select @i=i+1//这条应该放在这里,生成的是1..100//放在下面是1..99
insert @temp values ( @i,null,null,null,null,Null )
end;
回复
My_first 2002-12-29

上次写的行呀,上面那段程序就是上次你写的我改过之后的程序,
可以用,我现在想改进一下呀,因为上次那个借助了sysobjects表,或其它的表,但这个表必须有100条记录。 移植不太好干, 昨天我想来想去的,就来问问还有没有较好的办法,
固定表提高速度,但有并发问题, 就大力说的这点,我最后决定还是用表变量了。今天晚上就改。

各位谢谢了。
回复
pengdali 2002-12-28
对!固定表提高速度,但有并发问题,我上次写的那个不行吗??
回复
pengdali 2002-12-28
哈哈!找了半天,在这里呀!!!!
回复
My_first 2002-12-28
两位大侠讲都有理。
因为我有非常多的查询都要这么做。 但查询最多也只添加100条空行,用固定的表,速度很快,就是我一开始做的用sysobjects,这个表, 或者是我在数据库里另外建 表, 我不想用的原因是,一个查询还必须依懒一个额外的表 .
直接在里面控制更好,
速度我想也应该没什么影响。不就是一百条吗?<---我问自己?
回复
j9988 2002-12-28
我也觉得老纳说得对,用固定表好,快多了。
回复
蓝天 2002-12-28
我觉得还是有个固定表好,省得你每次都要产生那么多行空数据。
回复
My_first 2002-12-28
谢谢老纳的讲解.

我理解了。那我还是改用你的做法。用表变量。我想应该比我上面那样写来得快。对于每个用户调用时这个变量都是不一样的,就像定义的i,int类型一样,用完了就释放掉了。是这样的吧。

说一个笑话,我一开始用临时表的时候,用while做了1000个临时表。占内存20多M, 所以在以前写的程序里都用的是临时表。

以后做那都改为表变量了。又让我进弯路子了。

回复
蓝天 2002-12-28
可将函数和变量声明为 table 类型。table 变量可用于函数、存储过程和批处理中。

尽可能使用表变量而不使用临时表。table 变量有以下优点:

table 变量的行为类似于局部变量,有明确定义的作用域。该作用域为声明该变量的函数、存储过程或批处理。
在其作用域内,table 变量可像常规表那样使用。该变量可应用于 SELECT、INSERT、UPDATE 和 DELETE 语句中用到表或表的表达式的地方。但是,table 不能用在下列语句中:

INSERT INTO table_variable EXEC 存储过程。

SELECT select_list INTO table_variable 语句。

在定义 table 变量的函数、存储过程或批处理结束时,自动清除 table 变量。

在存储过程中使用表变量与使用临时表相比,减少了存储过程的重新编译量。


涉及表变量的事务只在表变量更新期间存在。这样就减少了表变量对锁定和记录资源的需求。
不支持在表变量之间进行赋值操作。另外,由于表变量作用域有限,并且不是持久数据库的一部分,因而不受事务回滚的影响。

回复
My_first 2002-12-28
不对,听大力以前讲是表变量。 我对这个概念不了解。他是怎样释放的。

就样普通的i int 一样定义和释放吗?

能讲一下表变量的故事吗?

晚上一定来结贴。
回复
My_first 2002-12-28
仔细一看代码 @temp, 是内存表是吧。我以前没有用过。
回复
My_first 2002-12-28
不好意思,下午出去了。
为什么用循环?
我是为了考虑速度呀 。
我看了上面这段代码,照这样做,速度还没有一开始的快
是吧.
回复
蓝天 2002-12-28
????
为什么用循环?
declare @i int
declare @temp table (a int ,b int, c int, d int, e int , f int )
select @i=count(khbh) from #table2
while @i<100
begin
insert @temp values ( @i,null,null,null,null,Null )
select @i=i+1
end;
select khbh,类型,单号,限定日期,欠款金额,ordertype From #table2
union all select * from @temp



回复
My_first 2002-12-28
sky_blue(老衲)
可以这么写吗?
while @i<100
begin
select khbh,类型,单号,限定日期,欠款金额,ordertype From #table2
union all
SELECT @i,null,null,null,null,Null From #temp1
end;

回复
蓝天 2002-12-28
建一个固定表
比如temp
select identity(int,1,1) as khbh,null as A,null as B,null as C, null as D,Null as E into temp1 from (select top 100 * from sysobjects) a
------------------------------------------
每次查询的时候只需要这么做:
select khbh,类型,单号,限定日期,欠款金额,ordertype From table2 union
select * from temp where khbh >
(select count(khbh) from table2)
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告