--方法一:嵌套游标 --表名 字段名 --TableD AStr BStr CStr --TableM AStr BStr --TableResult AllStr --符合条件的数据放到表TheSameRecord Select TableD.AStr,TableD.BStr,TableD.CStr Into TheSameRecord From TableM,TableD Where TableM.AStr = TableD.AStr And TableM.BStr = TableD.BStr Declare@AStrVarChar(50) Declare@BStrVarChar(50) Declare@CStrVarChar(50) Declare@AllCStrVarChar(500) Set@AllCStr='' Declare@iNextBit Set@iNext=0 --外层游标 Declare Outer_Cursor CursorFor SelectDistinct AStr,BStr From TheSameRecord Open Outer_Cursor FetchNextFrom Outer_Cursor Into@AStr, @BStr While@@Fetch_Status=0 Begin --内层游标 Declare Inner_Cursor CursorFor Select CStr From TheSameRecord Where AStr =@AStrAnd BStr =@BStr Set@AllCStr='' Open Inner_Cursor FetchNextFrom Inner_Cursor Into@CStr While@@Fetch_Status=0 Begin Set@AllCStr=@AllCStr+@CStr+',' FetchNextFrom Inner_Cursor Into@CStr End if (@iNext=0) Begin Delete TableResult Set@iNext=1 End InsertInto TableResult (AllStr) Values (SubString( @AllCStr,1, Len(@AllCStr)-1)) PrintSubString( @AllCStr,1, Len(@AllCStr)-1 ) Close Inner_Cursor DealLocate Inner_Cursor FetchNextFrom Outer_Cursor Into@AStr, @BStr End Close Outer_Cursor DealLocate Outer_Cursor --删除表TheSameRecord DropTable TheSameRecord Select*From TableResult
结果如下:
但是马上又想到了另外一种方法实现,因为函数本身就可以对数据进行循环,那么如果用函数来实现的话,
一则效率高,
二则代码量少
那么就有如下实现了:
--方法二:函数 CreateFunction AddStr(@AStrVarChar(50), @BStrVarChar(50)) ReturnsVarChar(8000) As Begin Declare@ALLStrVarchar(8000) Set@ALLStr='' Select@ALLStr=@ALLStr+','+Cast(CStr AsVarChar) From TheSameRecord Where AStr =@AStrAnd BStr =@BStr Set@ALLStr=Right(@ALLStr,Len(@ALLStr)-1) Return(@ALLStr) End Go Select TableD.AStr,TableD.BStr,TableD.CStr Into TheSameRecord From TableM,TableD Where TableM.AStr = TableD.AStr And TableM.BStr = TableD.BStr Go SelectDistinct AStr,BStr,dbo.AddStr(AStr,BStr) As AllStr From TheSameRecord DropTable TheSameRecord