0

memberId を含むテーブルがありますが、それらは同時に実行されません。

それらをどのようにループする必要がありますか?

私はこれを持っています:

 select mm.memberid, mm.aspnetuserid, mm.email
 into #MemberIdsToDelete
   from membership.members as mm 
   left join aspnet_membership as asp
     on mm.aspnetuserid=asp.userid 
   left join trade.tradesmen as tr 
     on tr.memberid=mm.memberid  
   where asp.isapproved = 0 and tr.ImportDPN IS NOT NULL and tr.importDPN <> ''
   order by mm.memberid

 ALTER TABLE #MemberIdsToDelete ADD id int NOT NULL AUTO_INCREMENT

 DECLARE @MaxRownum int
 SET @MaxRownum = (SELECT MAX(id) FROM MemberIdsToDelete)

WHILE @Iter <= @MaxRownum
 -- do things
 SET @Iter = @Iter + 1
END  

上記は正しくありません。alter table 行で明らかにエラーが発生します: Incorrect syntax near 'AUTO_INCREMENT'

4

3 に答える 3

1

ALTER TABLEデータではなく、実際のテーブルを変更します。データを追加した後に列を追加しても意味がないため、おそらく目的とは異なります。

カーソルを使用して任意の結果セットをループできますが、カーソルに関する重要なルールが 2 つあります。

  1. セット操作が可能な場合は、カーソルを使用しないでください。
  2. 考えていることにはおそらくカーソルは必要ありません。しばらく考え直して、カーソルが必要であることを確認してください。CURSORは、手続き型コードの問題であるかのように SQL の問題について考えている兆候です。それが唯一の方法かもしれませんが、それを避けてください (set アプローチが表示されない場合は、他のことをして、昼食後に戻ってくることもできます)。

コメントでは、他のテーブルから削除する必要があると言っていますが、それは次のように行う方がはるかに良いでしょう:

delete from table1 where memberId in
(
select mm.memberid
   from membership.members as mm 
   left join aspnet_membership as asp
     on mm.aspnetuserid=asp.userid 
   left join trade.tradesmen as tr 
     on tr.memberid=mm.memberid  
   where asp.isapproved = 0 and tr.ImportDPN IS NOT NULL and tr.importDPN <> ''
)
delete from table2 where memberId in
(
select mm.memberid
   from membership.members as mm 
   left join aspnet_membership as asp
     on mm.aspnetuserid=asp.userid 
   left join trade.tradesmen as tr 
     on tr.memberid=mm.memberid  
   where asp.isapproved = 0 and tr.ImportDPN IS NOT NULL and tr.importDPN <> ''
)
delete from table3 where memberId in
(
select mm.memberid
   from membership.members as mm 
   left join aspnet_membership as asp
     on mm.aspnetuserid=asp.userid 
   left join trade.tradesmen as tr 
     on tr.memberid=mm.memberid  
   where asp.isapproved = 0 and tr.ImportDPN IS NOT NULL and tr.importDPN <> ''
)

本質的に高速な 3 つのセット ベースの操作は、クエリ アナライザーが最適化をより適切に実行できるものであり、何よりも簡単に記述できます。

于 2012-08-29T07:42:52.887 に答える
0

次のように、カーソルを使用してテーブルをループできます。

DECLARE db_cursor CURSOR FOR SELECT Col1, Col2, -- your select query 

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @Var1, @Var2, -- list of your variables based on select query

WHILE @@FETCH_STATUS = 0   
BEGIN

    -- do stuff

    FETCH NEXT FROM db_cursor INTO @Var1, @Var2, -- list of your variables based on select query
END   

CLOSE db_cursor   
DEALLOCATE db_cursor
于 2012-08-29T07:36:37.397 に答える
0

おそらく Row_Number() はあなたが望むものです + OP に対して行われた多くのコメントを反映しました:

    SELECT 
        IDENTITY(INT,1,1) AS ID,
        ROW_NUMBER() OVER (ORDER BY mm.memberid) AS RowN,
        mm.memberid,
        mm.aspnetuserid,
        mm.email  
    INTO #MemberIdsToDelete    
    FROM 
        membership.members  mm     
        INNER JOIN aspnet_membership  asp      
            ON mm.aspnetuserid=asp.userid     
        INNER JOIN trade.tradesmen  tr       
            ON tr.memberid=mm.memberid      
    WHERE 
        asp.isapproved <> 0 
        AND tr.importDPN <> ''    


    DECLARE @MaxRownum INT  = (SELECT MAX(RowN) FROM MemberIdsToDelete)  
    DECLARE @Iter INT = 0

    WHILE @Iter <= @MaxRownum  
       -- do things  
        SET @Iter = @Iter + 1 
    END 
于 2012-08-29T10:18:44.610 に答える