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  

以上不正确,我在更改表行上明显出错:'AUTO_INCREMENT'附近的语法不正确

4

3 回答 3

1

ALTER TABLE更改实际表,而不是数据。添加数据后添加列是没有意义的,因此它可能不是您想要的。

您可以使用游标遍历任何结果集,但是关于游标有两个重要规则:

  1. 当您可以进行设置操作时,切勿使用光标。
  2. 您可能不需要光标来处理您正在考虑的事情,请重新考虑一段时间以确保您需要它。CURSOR表示您正在考虑一个 SQL 问题,就像它是一个程序代码问题一样 - 这可能是唯一的方法,但要避免它(如果您没有看到设置的方法,甚至可以做其他事情并在午餐后回来)。

在您说您需要从其他表中删除的评论中,这样做会更好:

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 <> ''
)

三个基于集合的操作本质上更快,是查询分析器可以更好地为您优化的工作,最重要的是,它们更易于编写。

于 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 回答