如何调用每一行的程序?

时间:2013-01-29 16:29:18

标签: sql sql-server sql-server-2008

我有一个Microsoft SQL Server R2 2008.我在生命中第一次看到它 我有sql程序:

DECLARE @RC int
DECLARE @Id uniqueidentifier
DECLARE @Segment_ID uniqueidentifier
DECLARE @SDate datetime
DECLARE @EDate datetime
DECLARE @withBig bit
DECLARE @withKm bit
DECLARE @withGeo bit
DECLARE @withDescr bit

-- TODO: задайте здесь значения параметров.

EXECUTE @RC = [Request_BusStation] 
   @Id
  ,@Segment_ID
  ,@SDate
  ,@EDate
  ,@withBig
  ,@withKm
  ,@withGeo
  ,@withDescr
GO

我如何理解它只是调用程序而不是自己。但程序太过于难以复制。 并有一张桌子:

   CREATE TABLE [BusStation](
[Id] [uniqueidentifier] NOT NULL,
[Segment_ID] [uniqueidentifier] NOT NULL,
[Dist] [decimal](18, 4) NOT NULL,
[Kod_Spr012] [smallint] NOT NULL,
[Square] [decimal](18, 6) NULL,
[OperationStartDate] [date] NULL,
[BallanceCost] [decimal](18, 6) NULL,
[DepreciatedCost] [decimal](18, 6) NULL,
[ChargesNorm] [decimal](18, 6) NULL,
[DocumentName] [varchar](100) NULL,
[DocumentNum] [varchar](100) NULL,
[DocumentDate] [date] NULL,
[Authority] [varchar](100) NULL,
[Kod_Spr091] [smallint] NOT NULL,
[HasWaysideStop] [bit] NOT NULL,
[HasLanding] [bit] NOT NULL,
[HasSpeedTransitArea] [bit] NOT NULL,
[LenSpeedTransitArea] [decimal](18, 6) NULL,
[YearBuilt] [smallint] NULL,
[YearMajorOverhaul] [smallint] NULL,
[Kod_Spr019] [smallint] NOT NULL,
[TechCond] [varbinary](max) NULL,
[LandCont] [varbinary](max) NULL,
[LandContDate] [date] NULL,
[LandContStartDate] [date] NULL,
[LandContEndDate] [date] NULL,
[Kod_Spr120] [smallint] NULL,
[E_Date_Begin] [datetime] NOT NULL,
[E_Date_End] [datetime] NULL,
[E_Date_Stop] [datetime] NULL,

现在我想为每一行表调用此程序 可能吗?

2 个答案:

答案 0 :(得分:3)

是的,你可以使用一个游标来选择表中的所有行,并迭代地调用存储过程。

我建议你在走这条路之前可能遇到设计问题。如果需要为表中的每一行调用存储过程,则可以编写一个存储过程,该存储过程只执行当前sp对所有行执行的操作,而不是单行操作。

你没有提供sp正在做的事情所以我只能在这里推测。

答案 1 :(得分:1)

正如我的评论中提到的,我知道如何做到这一点的唯一方法是使用CURSOR。以下是一些示例代码(当然未经测试):

DECLARE @ID INT
DECLARE @Segment_ID uniqueidentifier

DECLARE @getAccountID CURSOR
SET @BusStationCursor = CURSOR FOR
SELECT Id, Segment_ID --(etc: all the fields you need)
FROM BusStation

OPEN @BusStationCursor
FETCH NEXT    FROM @BusStationCursor INTO @ID, @Segment_ID
WHILE @@FETCH_STATUS = 0
BEGIN

--CALL YOUR SP HERE
PRINT @ID 
PRINT @Segment_ID

FETCH NEXT    FROM @BusStationCursor INTO @ID, @Segment_ID
END
CLOSE @BusStationCursor
DEALLOCATE @BusStationCursor

这也应该有所帮助:

http://msdn.microsoft.com/en-us/library/ms180169.aspx

祝你好运。