【问题标题】:Polling data in chunk轮询数据块
【发布时间】:2012-02-01 18:16:07
【问题描述】:

我有如下的存储过程。

CREATE procedure [dbo].[Poll_EDI834_5010]
AS
BEGIN
select
    Header.ST01,
    Header.ST02,
    Header.ST03 ,
    Header.SE02,
    Line.INS01__InsuredIndicator ,
    Line.PER04__CommunicationNumber ,
      Line.PER05_CommunicationNumberQualifier ,
      Line.DMG06_CitizenshipStatusCode ,
         (select Member_Ref.REF01_ReferenceIdentificationQualifier ,Member_Ref.REF02_MemberSupplementalIdentifier
   from EDI834_5010_2000_RefLoop Member_Ref        
   where Member_Ref.Id_Header = Header.BGN02__TransactionSetIdentifierCode
   and Member_Ref.Id_Loop2000 = Line.Member_Id         
   for xml auto, elements, type) ,
    (select Member_DTP.DTP01_DateTimeQualifier , Member_DTP.DTP02_DateTimePeriodFormatQualifier , Member_DTP.DTP03_StatusInformationEffectiveDate
   from EDI834_5010_2000DTP Member_DTP        
   where Member_DTP.Header_Id = Header.BGN02__TransactionSetIdentifierCode
   and Member_DTP.Member_Id = Line.Member_Id         
   for xml auto, elements, type) ,
   VLine.HD01_MaintenanceTypeCode,
   VLine.HD03_InsuranceLineCode ,
    VLine.N402_ProviderStateCode ,
   VLine.N403_ProviderPostalZoneorZIPCode ,
      (select ClaimDTP.DTP01__DateTimeQualifier , ClaimDTP.DTP02__DateTimePeriodFormatQualifier , ClaimDTP.DTP03__StatusInformationEffectiveDate
     from EDI834_5010_2300_DTPLoop ClaimDTP
     where ClaimDTP.Id_Header = Header.BGN02__TransactionSetIdentifierCode
     and ClaimDTP.Id_Loop2000 = Line.Member_Id
     and ClaimDTP.Id_Loop2300 = VLine.Id_Claim
     for xml auto, elements, type)
from EDI834_5010_Header Header 
join EDI834_5010_2000 Line  on Header.BGN02__TransactionSetIdentifierCode = Line.Header_Id
join EDI834_5010_2300Loop VLine on Header.BGN02__TransactionSetIdentifierCode = VLine.Id_Header_Id andVLine.Id_Loop2000=Line.Member_Id
for xml auto,ELEMENTS
END
GO

它可以获取大约 100,000 条记录。我需要分块获取数据。就像先是 10000,然后是 10000……我需要在存储过程中进行哪些更改才能以块的形式获取数据。

【问题讨论】:

  • 这是 MySql 还是 SQL Server?该 FOR 语句不是有效的 TSQL。

标签: mysql sql sql-server tsql stored-procedures


【解决方案1】:

您的数据中需要某种索引、序列列或可排序的 ID 列。我们称之为keyColumn。然后,您需要将最大潜在行数拆分为每次迭代所需的行数。我不知道您的架构,所以让我们像您在问题中所说的那样使用 10000 行。

然后您需要在每次迭代中选择尽可能多的行并执行...无论您想做什么。

SELECT @minID = Min(keyColumn) FROM table WHERE condition
SELECT @maxID = Max(keyColumn) FROM table WHERE condition
SELECT @potentialRows = 10000

WHILE @minID < @maxID
BEGIN
    SET @breakID = @minID + @potentialRows
    SELECT columns FROM table WITH (NOLOCK, ...)
    WHERE condition AND keyColumn BETWEEN @minID AND @breakID

    -- Do what you want with the selected rows here...

    SET @minID = @breakID + 1
END

如果您的 keyColumn 值稀疏,您将不得不更改潜在的行计算。

【讨论】:

  • 您必须发布代码和错误消息;我看不到你的屏幕。
猜你喜欢
  • 1970-01-01
  • 2016-01-08
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多