10

TSQL では、ハード コーディングされた dhome を使用する必要がある次のコードを、最適化のためにループを使用するように変更したいと考えています。ループを追加しようとして失敗した試みも含まれています。

Declare  @dhome Tinyint, @bp smallint, @lr smallint, @q smallint

    // Set @dhome = 1
  While(@dhome <= 3) // My attempt to add a loop

  SELECT @lr = MAX(NQdDate), @q = NQd
  FROM NQdHistory
  WHERE dhomeId = @dhome 
  GROUP BY NQdDate, NQd

  SELECT @bd = COUNT(*)
  FROM bdhome
  WHERE NQdDate= @lr AND dhomeID= @dhome 

  DELETE FROM ND1 WITH(XLOCK)
  WHERE dhomeID= @dhome  AND NQdDate= @lr

  UPDATE NQdHistory
  SET Nbd = @q - @@RowCount - @bp, NBd = @bp
  WHERE NQdDate= @lr AND dhomeID= @dhome 

  Set @dhome = @dhome +1 //My attempt to end a loop
4

3 に答える 3

17

あなたは正しい軌道に乗っています。始まりと終わりがありません。また、必ず@dhome値を指定してください。3行目でコメントアウトし始めたようです:

Declare  @dhome Tinyint, @bp smallint, @lr smallint, @q smallint

    // Set @dhome = 1
While(@dhome <= 3) // My attempt to add a loop
begin
  SELECT @lr = MAX(NQdDate), @q = NQd
  FROM NQdHistory
  WHERE dhomeId = @dhome 
  GROUP BY NQdDate, NQd

  SELECT @bd = COUNT(*)
  FROM bdhome
  WHERE NQdDate= @lr AND dhomeID= @dhome 

  DELETE FROM ND1 WITH(XLOCK)
  WHERE dhomeID= @dhome  AND NQdDate= @lr

  UPDATE NQdHistory
  SET Nbd = @q - @@RowCount - @bp, NBd = @bp
  WHERE NQdDate= @lr AND dhomeID= @dhome 

  Set @dhome = @dhome +1 //My attempt to end a loop
end  

{C/C#/C++ に精通している場合は、T-SQL の BeginとEnd を中かっこのように考えて}ください。または、パスカルと. あなたはアイデアを得る:)ThenEnd IfBeginEnd

于 2013-04-02T17:59:29.667 に答える
2

途中で開始と終了がありません。

WHILE (Transact-SQL)

于 2013-04-02T17:59:29.863 に答える
2

例 1

DECLARE @I INT,@COUNTVAR INT
SET @I = 1
DECLARE @Parent_Child TABLE(ID INT IDENTITY(1,1),ParentPositionID INT NULL,ChildPositionId Int)

INSERT INTO @Parent_Child(ParentPositionID,ChildPositionId) 
SELECT DISTINCT PARENT_POSITION_ID,CHILD_POSITION_ID from tblPOSITION_HIERARCHY 
--WHERE CHILD_POSITION_ID IN (--YOUR CONDITION IF ANY)
SELECT @COUNTVAR =COUNT(*) FROM @PTS_Parent_Child
DECLARE @int_SUPE_POSITION_ID INT, @int_CHILD_POSITION_ID INT
 --loop through records here 
WHILE @I <= @COUNTVAR
BEGIN
SELECT @int_SUPE_POSITION_ID=ParentPositionID,@int_CHILD_POSITION_ID=ChildPositionId  FROM @Parent_Child WHERE ID=@I   
--Whatever you want to do with records
SET @I=@I+1
END

例 2

一時テーブルを使用しても問題ない場合の別のアプローチです。私は個人的にこれをテストしましたが、例外は発生しません (一時テーブルにデータがない場合でも)。

CREATE TABLE #TempTable
    (
      ROWID int identity(1,1) primary key,
      HIERARCHY_ID_TO_UPDATE int,
    )
    --INSERT DATA INTO TEMP TABLE USING INSERT INTO CLAUSE OR FOR EAXMPLE BELOW
    --INSERT INTO #TempTable VALUES(1)
    --INSERT INTO #TempTable VALUES(2)
    --INSERT INTO #TempTable VALUES(4)
    --INSERT INTO #TempTable VALUES(6)
    --INSERT INTO ##TempTable VALUES(8)


    DECLARE @MAXID INT
    SET @COUNTER =1
    SELECT @MAXID=COUNT(*) FROM #TempTable
    --PRINT @MAXID
    WHILE (@MAXID > 0)
    BEGIN
         --DO THE PROCESSING HERE 
         SELECT @HIERARCHY_ID_TO_UPDATE =PT.HIERARCHY_ID_TO_UPDATE FROM      #TempTable  PT WHERE ROWID=@COUNTER
         --PRINT '@MAXID VALUE '
         --PRINT  @MAXID
        SET @MAXID=@MAXID-1
        SET @COUNTER =@COUNTER + 1
    End


    If(OBJECT_ID('tempdb..#TempTable') IS NOT NULL)
    BEGIN
        DROP TABLE #TempTable
    END
于 2015-12-01T18:22:39.233 に答える