游标 with例子

ALTER PROCEDURE  [dbo].[flt_join_table]
    
    @Tables varchar(8000)=null ,          
    @pattern varchar(10)=',',
    @JoinStr VARCHAR(8000) OUTPUT
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;    

    --筛选所有联接表
    DECLARE @SINGLE_TABLE VARCHAR(50);
    DECLARE @TEMPS_TABLE_FILTER TABLE
    (    
        ID INT,
        LT VARCHAR(50),
        LC VARCHAR(50),
        RT VARCHAR(50),
        RC VARCHAR(50)
    )
    
    DECLARE FindTree_cursor CURSOR FOR
    SELECT * FROM dbo.str_split(@Tables,@pattern);
    OPEN FindTree_cursor;
    FETCH NEXT FROM FindTree_cursor INTO @SINGLE_TABLE;
    WHILE @@FETCH_STATUS = 0
    BEGIN
        --调用递归函数  dbo.flt_Joins_T()
        INSERT INTO @TEMPS_TABLE_FILTER
        SELECT * FROM dbo.flt_Joins_T(@SINGLE_TABLE) AS FJT
        WHERE FJT.ID NOT IN (SELECT ID FROM @TEMPS_TABLE_FILTER);        
        FETCH NEXT FROM FindTree_cursor INTO @SINGLE_TABLE;            
    END
    CLOSE FindTree_cursor;
    DEALLOCATE FindTree_cursor;    
    --SELECT  * FROM @TEMPS_TABLE_FILTER;    
    
    --拼接Join字符串
    DECLARE @TEMPS_TABLE_SORTED TABLE
    (    
        ID INT,
        LT VARCHAR(50),
        LC VARCHAR(50),
        RT VARCHAR(50),
        RC VARCHAR(50),
        [Level] INT
    );
    
    WITH Table_Join_Relation_With_Order (ID, LT, LC, RT, RC,Level)
    AS
    (
        -- U_Profile根表
        SELECT flt.ID, flt.LeftTable, flt.LeftColumn, flt.RightTable, flt.RightColumn ,0 AS Level
        FROM Flt_Join AS flt WHERE LeftTable='U_Profile'
       
        UNION ALL
        -- 递归查找其下所有联接表
        SELECT flt.ID, flt.LeftTable, flt.LeftColumn, flt.RightTable, flt.RightColumn, Level + 1
        FROM Flt_Join AS flt    
        INNER JOIN Table_Join_Relation_With_Order AS TJRWO
            ON flt.RightTable = TJRWO.LT
        WHERE flt.ID IN (SELECT ID FROM @TEMPS_TABLE_FILTER )
    )    
    INSERT INTO @TEMPS_TABLE_SORTED
    SELECT * FROM Table_Join_Relation_With_Order WHERE LT<>'U_Profile';    
    --SELECT * FROM @TEMPS_TABLE_SORTED
    
    DECLARE @ID INT;
    DECLARE @LT VARCHAR(50);
    DECLARE @LC VARCHAR(50);
    DECLARE @RT VARCHAR(50);
    DECLARE @RC VARCHAR(50);
    SET @JoinStr ='';
    
    --游标读取@TEMPS_TABLE_SORTED, 逐行拼接Join字符串
    DECLARE JoinTable_cursor CURSOR FOR
    SELECT ID, LT, LC, RT, RC FROM @TEMPS_TABLE_SORTED;
    
    OPEN JoinTable_cursor;
    FETCH NEXT FROM JoinTable_cursor INTO @ID, @LT, @LC, @RT, @RC;
    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @JoinStr=@JoinStr+' JOIN '+@LT+' ON '+ @RT+'.'+@RC+'='+@LT+'.'+@LC;                
        FETCH NEXT FROM JoinTable_cursor INTO  @ID, @LT, @LC, @RT, @RC;        
    END
    
    CLOSE JoinTable_cursor;
    DEALLOCATE JoinTable_cursor;    
    
END

posted on 2012-10-09 10:14  _Totti_  阅读(237)  评论(0)    收藏  举报