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

  • 问题

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

    遍历表: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列”。。。

        


    Science and technology is my lover.


    2012年7月9日 3:06

答案

  • 存储过程里面是做的什么样的处理?貌似游标可以满足你的要求。

    2012年7月9日 3:17
    版主
  • 我也是觉得利用CURSOR可以符合你的需求,程序代码类似下列的样子:

    use tempdb
    go
    
    IF EXISTS (select * from sys.objects where type = 'U' and name = 'linshidaList')
    	DROP TABLE linshidaList
    GO
    
    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
    )
    
    insert into linshidaList values ('DANo1',getdate(),getdate(),'TP1','MNo1',100,101,102,103,104,106,'A')
    ,('DANo2',getdate(),getdate(),'TP2','MNo2',200,201,202,203,204,206,'B')
    ,('DANo3',getdate(),getdate(),'TP3','MNo3',300,301,302,303,304,306,'C')
    
    GO
    
    IF EXISTS (select * from sys.objects where type = 'P' and name = 'Usp_DAListForEnergyDataDetail')
    	DROP PROCEDURE [Usp_DAListForEnergyDataDetail]
    GO
    
    CREATE PROCEDURE  [dbo].[Usp_DAListForEnergyDataDetail] (
    @DANo             Char(32),
    @DATime           Datetime,
    @LogTime          Datetime,
    @MeterType        Char(4),
    @MeterNo          Char(20),
    @Qty              Decimal(18,6)
    )
    AS
    BEGIN
    		SELECT @DANo,@DaTime,@LogTime,@MeterType,@MeterNo,@Qty
    END
    
    GO
    
    --使用cursor來取得每一筆資料
    DECLARE @DANo             Char(32),
    @DATime           Datetime,
    @LogTime          Datetime,
    @MeterType        Char(4),
    @MeterNo          Char(20),
    @Qty              Decimal(18,6)
    
    DECLARE cur CURSOR FOR
    SELECT DANo,DaTime,LogTime,MeterType,MeterNo,Qty
    FROM linshidaList
    
    OPEN cur
    FETCH NEXT FROM cur INTO @DANo,@DaTime,@LogTime,@MeterType,@MeterNo,@Qty
    
    WHILE (@@FETCH_STATUS = 0)
    	BEGIN
    		exec [Usp_DAListForEnergyDataDetail] @DANo,@DaTime,@LogTime,@MeterType,@MeterNo,@Qty
    		FETCH NEXT FROM cur INTO @DANo,@DaTime,@LogTime,@MeterType,@MeterNo,@Qty
    	END
    
    CLOSE cur
    DEALLOCATE cur
    
    


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年7月9日 4:17

全部回复

  • 存储过程里面是做的什么样的处理?貌似游标可以满足你的要求。

    2012年7月9日 3:17
    版主
  • 存储过程里面是做的什么样的处理?貌似游标可以满足你的要求。

    能写写么???

    Science and technology is my lover.

    2012年7月9日 3:48
  • 我也是觉得利用CURSOR可以符合你的需求,程序代码类似下列的样子:

    use tempdb
    go
    
    IF EXISTS (select * from sys.objects where type = 'U' and name = 'linshidaList')
    	DROP TABLE linshidaList
    GO
    
    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
    )
    
    insert into linshidaList values ('DANo1',getdate(),getdate(),'TP1','MNo1',100,101,102,103,104,106,'A')
    ,('DANo2',getdate(),getdate(),'TP2','MNo2',200,201,202,203,204,206,'B')
    ,('DANo3',getdate(),getdate(),'TP3','MNo3',300,301,302,303,304,306,'C')
    
    GO
    
    IF EXISTS (select * from sys.objects where type = 'P' and name = 'Usp_DAListForEnergyDataDetail')
    	DROP PROCEDURE [Usp_DAListForEnergyDataDetail]
    GO
    
    CREATE PROCEDURE  [dbo].[Usp_DAListForEnergyDataDetail] (
    @DANo             Char(32),
    @DATime           Datetime,
    @LogTime          Datetime,
    @MeterType        Char(4),
    @MeterNo          Char(20),
    @Qty              Decimal(18,6)
    )
    AS
    BEGIN
    		SELECT @DANo,@DaTime,@LogTime,@MeterType,@MeterNo,@Qty
    END
    
    GO
    
    --使用cursor來取得每一筆資料
    DECLARE @DANo             Char(32),
    @DATime           Datetime,
    @LogTime          Datetime,
    @MeterType        Char(4),
    @MeterNo          Char(20),
    @Qty              Decimal(18,6)
    
    DECLARE cur CURSOR FOR
    SELECT DANo,DaTime,LogTime,MeterType,MeterNo,Qty
    FROM linshidaList
    
    OPEN cur
    FETCH NEXT FROM cur INTO @DANo,@DaTime,@LogTime,@MeterType,@MeterNo,@Qty
    
    WHILE (@@FETCH_STATUS = 0)
    	BEGIN
    		exec [Usp_DAListForEnergyDataDetail] @DANo,@DaTime,@LogTime,@MeterType,@MeterNo,@Qty
    		FETCH NEXT FROM cur INTO @DANo,@DaTime,@LogTime,@MeterType,@MeterNo,@Qty
    	END
    
    CLOSE cur
    DEALLOCATE cur
    
    


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年7月9日 4:17
  • 存储过程里面是做的什么样的处理?貌似游标可以满足你的要求。

    能写写么???

    Science and technology is my lover.

    TerryChuang 已经给出了游标的相关详细代码。
    2012年7月9日 5:29
    版主