游标 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
浙公网安备 33010602011771号