如何遍历表,根据表的每一条记录,执行下存储过程

时间:2021-02-14 05:59:22
如何遍历表,根据表的每一条记录,执行下存储过程。

遍历表: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 楼  的回复:
SQL code


declare @Row    int,
        @Rows    int,
        @DANo    char(23),
        @DATime    datetime,
        @LogTime datetime,
        @MeterType char(4),
        @MeterNo    char(20),
   ……


谢谢您,您的思想是这样的吧,如下。还有几个问题想请教下。。。

1、声明变量,用来存储遍历数据

2、创建表,存储在变量中。

问题一:像这样的在脚本创建的表,叫做什么表呢???它不是临时表吧???

3、填充表@t,设置行数。

问题二:“set @Rows = @@ROWCOUNT”,“@@ROWCOUNT”从哪里来的呢???为什么可以表示“@t表”的行数???

4、循环执行存储过程

#3


问题1:这个叫表变量
问题2:@@ROWCOUNT 是SQL Server全局变量,表示执行上一语句所影响的行数
        当你插入数据为10行时 @@ROWCOUNT =10

#4


引用 3 楼  的回复:
问题1:这个叫表变量
问题2:@@ROWCOUNT 是SQL Server全局变量,表示执行上一语句所影响的行数
        当你插入数据为10行时 @@ROWCOUNT =10
 

好的,非常感谢。。。非常感谢。。。

不知道用“游标”可以实现吗???

#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


引用 5 楼  的回复:
SQL code
--当然可以
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 ……


谢谢您,谢谢。。。

您的思路是:
1、定义静态制度游标

2、打开游标并为其赋初值。

3、循环游标,并执行存储过程。

问题:
    “@@fetch_status”这个变量表示什么???
    “deallocate cursor_test”是销毁游标???
   

#7


不建议使用游标
1:游标效率低
2:游标会造成锁表
3:除非在很难处理的地方,否则不使用游标

#8


谢谢大家,但还是有点疑问。

1、游标为什么效率低???

2、游标为什么造成锁表???

#9


谢谢大家,但还是有点疑问。

1、游标为什么效率低???

2、游标为什么造成锁表???

#10


建议你自己查看搜索一下,现在不到万不得已,都不会推荐使用游标的

#11


引用 3 楼  的回复:
问题1:这个叫表变量
问题2:@@ROWCOUNT 是SQL Server全局变量,表示执行上一语句所影响的行数
  当你插入数据为10行时 @@ROWCOUNT =10

我看了你的写法,有点想法,就是为什么要创建表变量@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 楼  的回复:
SQL code


declare @Row    int,
        @Rows    int,
        @DANo    char(23),
        @DATime    datetime,
        @LogTime datetime,
        @MeterType char(4),
        @MeterNo    char(20),
   ……


谢谢您,您的思想是这样的吧,如下。还有几个问题想请教下。。。

1、声明变量,用来存储遍历数据

2、创建表,存储在变量中。

问题一:像这样的在脚本创建的表,叫做什么表呢???它不是临时表吧???

3、填充表@t,设置行数。

问题二:“set @Rows = @@ROWCOUNT”,“@@ROWCOUNT”从哪里来的呢???为什么可以表示“@t表”的行数???

4、循环执行存储过程

#3


问题1:这个叫表变量
问题2:@@ROWCOUNT 是SQL Server全局变量,表示执行上一语句所影响的行数
        当你插入数据为10行时 @@ROWCOUNT =10

#4


引用 3 楼  的回复:
问题1:这个叫表变量
问题2:@@ROWCOUNT 是SQL Server全局变量,表示执行上一语句所影响的行数
        当你插入数据为10行时 @@ROWCOUNT =10
 

好的,非常感谢。。。非常感谢。。。

不知道用“游标”可以实现吗???

#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


引用 5 楼  的回复:
SQL code
--当然可以
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 ……


谢谢您,谢谢。。。

您的思路是:
1、定义静态制度游标

2、打开游标并为其赋初值。

3、循环游标,并执行存储过程。

问题:
    “@@fetch_status”这个变量表示什么???
    “deallocate cursor_test”是销毁游标???
   

#7


不建议使用游标
1:游标效率低
2:游标会造成锁表
3:除非在很难处理的地方,否则不使用游标

#8


谢谢大家,但还是有点疑问。

1、游标为什么效率低???

2、游标为什么造成锁表???

#9


谢谢大家,但还是有点疑问。

1、游标为什么效率低???

2、游标为什么造成锁表???

#10


建议你自己查看搜索一下,现在不到万不得已,都不会推荐使用游标的

#11


引用 3 楼  的回复:
问题1:这个叫表变量
问题2:@@ROWCOUNT 是SQL Server全局变量,表示执行上一语句所影响的行数
  当你插入数据为10行时 @@ROWCOUNT =10

我看了你的写法,有点想法,就是为什么要创建表变量@t,我觉得,可以通过select count(1) from table
来获取总行书,然后再用开始设置的变量等执行你后面的循环,这样会不会好点,反正都是要遍历表。

#12


不好意思哦……我问了一个愚蠢的问题,嘻嘻……那个表变量的作用我明白了……

#13


我一直用游标