遍历表:linshidaList
表linshidaList对应的列:
CREATE TABLE [dbo].[linshidaList](
[DANo] [char](32) NOT NULL,
[DATime] [datetime] NOT NULL,
[LogTime] [datetime] NOT NULL,
[DAType] [char](3) NULL,
[MeterType] [char](4) NOT NULL,
[MeterNo] [char](20) NOT NULL,
[Qty] [decimal](18, 6) NULL,
[Qty01] [decimal](18, 6) NULL,
[Qty02] [decimal](18, 6) NULL,
[Qty11] [decimal](18, 6) NULL,
[Qty12] [decimal](18, 6) NULL,
[lable] [char](1) NOT NULL
)
遍历每一条记录执行的存储过程参数如下:
ALTER PROCEDURE [dbo].[Usp_DAListForEnergyDataDetail] (
@DANo Char(32),
@DATime Datetime,
@LogTime Datetime,
@MeterType Char(4),
@MeterNo Char(20),
@Qty Decimal(18,6)
)
“@DANo参数”对应表linshidaList“DANo列”,“@DATime参数”对应表linshidaList“DATime列”,“@LogTime参数”对应表linshidaList“LogTime列”,“@MeterType参数”对应表linshidaList“MeterType列”,“@MeterNo参数”对应表linshidaList“MeterNo列”,“@Qty参数”对应表linshidaList“Qty列”。。。
13 个解决方案
#1
declare @Row int,
@Rows int,
@DANo char(23),
@DATime datetime,
@LogTime datetime,
@MeterType char(4),
@MeterNo char(20),
@Qty decimal(18,6)
declare @t table (
Row int identity(1,1) not null,
DANo char(23) not null,
DATime datetime not null,
LogTime datetime not null,
MeterType char(4) not null,
MeterNo char(20) not null,
Qty decimal(18,6) null
)
insert into @t
select DANo,DATime,LogTime,MeterType,MeterNo,Qty
set @Rows = @@ROWCOUNT
set @Row = 1
while (@Row <=@Rows)
begin
select @DANo = DANo,@DATime= DATime,@LogTime= LogTime,@MeterType = MeterType,@MeterNo = MeterNo ,@Qty = Qty
from @T where row = @Row
exec Usp_DAListForEnergyDataDetail @DANo,@DATime,@LogTime,@MeterType,@MeterNo,@Qty
set @Row = @Row + 1
end
#2
谢谢您,您的思想是这样的吧,如下。还有几个问题想请教下。。。
1、声明变量,用来存储遍历数据
2、创建表,存储在变量中。
问题一:像这样的在脚本创建的表,叫做什么表呢???它不是临时表吧???
3、填充表@t,设置行数。
问题二:“set @Rows = @@ROWCOUNT”,“@@ROWCOUNT”从哪里来的呢???为什么可以表示“@t表”的行数???
4、循环执行存储过程
#3
问题1:这个叫表变量
问题2:@@ROWCOUNT 是SQL Server全局变量,表示执行上一语句所影响的行数
当你插入数据为10行时 @@ROWCOUNT =10
问题2:@@ROWCOUNT 是SQL Server全局变量,表示执行上一语句所影响的行数
当你插入数据为10行时 @@ROWCOUNT =10
#4
好的,非常感谢。。。非常感谢。。。
不知道用“游标”可以实现吗???
#5
--当然可以
declare cursor_test cursor local forward_only static read_only
for
select DANo,DATime,LogTime,MeterType,MeterNo,Qty from table_name
open cursor_test
fetch next from cursor_test into @DANo,@DATime,@LogTime,@MeterType,@MeterNo,@Qty
while(@@fetch_status=0)
begin
exec Usp_DAListForEnergyDataDetail @DANo,@DATime,@LogTime,@MeterType,@MeterNo,@Qty
fetch next from cursor_test into @DANo,@DATime,@LogTime,@MeterType,@MeterNo,@Qty
end
close cursor_test
deallocate cursor_test
#6
谢谢您,谢谢。。。
您的思路是:
1、定义静态制度游标
2、打开游标并为其赋初值。
3、循环游标,并执行存储过程。
问题:
“@@fetch_status”这个变量表示什么???
“deallocate cursor_test”是销毁游标???
#7
不建议使用游标
1:游标效率低
2:游标会造成锁表
3:除非在很难处理的地方,否则不使用游标
1:游标效率低
2:游标会造成锁表
3:除非在很难处理的地方,否则不使用游标
#8
谢谢大家,但还是有点疑问。
1、游标为什么效率低???
2、游标为什么造成锁表???
1、游标为什么效率低???
2、游标为什么造成锁表???
#9
谢谢大家,但还是有点疑问。
1、游标为什么效率低???
2、游标为什么造成锁表???
1、游标为什么效率低???
2、游标为什么造成锁表???
#10
建议你自己查看搜索一下,现在不到万不得已,都不会推荐使用游标的
#11
我看了你的写法,有点想法,就是为什么要创建表变量@t,我觉得,可以通过select count(1) from table
来获取总行书,然后再用开始设置的变量等执行你后面的循环,这样会不会好点,反正都是要遍历表。
#12
不好意思哦……我问了一个愚蠢的问题,嘻嘻……那个表变量的作用我明白了……
#13
我一直用游标
#1
declare @Row int,
@Rows int,
@DANo char(23),
@DATime datetime,
@LogTime datetime,
@MeterType char(4),
@MeterNo char(20),
@Qty decimal(18,6)
declare @t table (
Row int identity(1,1) not null,
DANo char(23) not null,
DATime datetime not null,
LogTime datetime not null,
MeterType char(4) not null,
MeterNo char(20) not null,
Qty decimal(18,6) null
)
insert into @t
select DANo,DATime,LogTime,MeterType,MeterNo,Qty
set @Rows = @@ROWCOUNT
set @Row = 1
while (@Row <=@Rows)
begin
select @DANo = DANo,@DATime= DATime,@LogTime= LogTime,@MeterType = MeterType,@MeterNo = MeterNo ,@Qty = Qty
from @T where row = @Row
exec Usp_DAListForEnergyDataDetail @DANo,@DATime,@LogTime,@MeterType,@MeterNo,@Qty
set @Row = @Row + 1
end
#2
谢谢您,您的思想是这样的吧,如下。还有几个问题想请教下。。。
1、声明变量,用来存储遍历数据
2、创建表,存储在变量中。
问题一:像这样的在脚本创建的表,叫做什么表呢???它不是临时表吧???
3、填充表@t,设置行数。
问题二:“set @Rows = @@ROWCOUNT”,“@@ROWCOUNT”从哪里来的呢???为什么可以表示“@t表”的行数???
4、循环执行存储过程
#3
问题1:这个叫表变量
问题2:@@ROWCOUNT 是SQL Server全局变量,表示执行上一语句所影响的行数
当你插入数据为10行时 @@ROWCOUNT =10
问题2:@@ROWCOUNT 是SQL Server全局变量,表示执行上一语句所影响的行数
当你插入数据为10行时 @@ROWCOUNT =10
#4
好的,非常感谢。。。非常感谢。。。
不知道用“游标”可以实现吗???
#5
--当然可以
declare cursor_test cursor local forward_only static read_only
for
select DANo,DATime,LogTime,MeterType,MeterNo,Qty from table_name
open cursor_test
fetch next from cursor_test into @DANo,@DATime,@LogTime,@MeterType,@MeterNo,@Qty
while(@@fetch_status=0)
begin
exec Usp_DAListForEnergyDataDetail @DANo,@DATime,@LogTime,@MeterType,@MeterNo,@Qty
fetch next from cursor_test into @DANo,@DATime,@LogTime,@MeterType,@MeterNo,@Qty
end
close cursor_test
deallocate cursor_test
#6
谢谢您,谢谢。。。
您的思路是:
1、定义静态制度游标
2、打开游标并为其赋初值。
3、循环游标,并执行存储过程。
问题:
“@@fetch_status”这个变量表示什么???
“deallocate cursor_test”是销毁游标???
#7
不建议使用游标
1:游标效率低
2:游标会造成锁表
3:除非在很难处理的地方,否则不使用游标
1:游标效率低
2:游标会造成锁表
3:除非在很难处理的地方,否则不使用游标
#8
谢谢大家,但还是有点疑问。
1、游标为什么效率低???
2、游标为什么造成锁表???
1、游标为什么效率低???
2、游标为什么造成锁表???
#9
谢谢大家,但还是有点疑问。
1、游标为什么效率低???
2、游标为什么造成锁表???
1、游标为什么效率低???
2、游标为什么造成锁表???
#10
建议你自己查看搜索一下,现在不到万不得已,都不会推荐使用游标的
#11
我看了你的写法,有点想法,就是为什么要创建表变量@t,我觉得,可以通过select count(1) from table
来获取总行书,然后再用开始设置的变量等执行你后面的循环,这样会不会好点,反正都是要遍历表。
#12
不好意思哦……我问了一个愚蠢的问题,嘻嘻……那个表变量的作用我明白了……
#13
我一直用游标