--1.存储过程和自定义函数都可以实现递归调用,函数定义时,参数需要放在括号内,并且有返回值,函数调用时,需要通过设定变量值或者在查询语句中,参数放在括号内,存储过程则使用exec uspName params...,参数不需要放在括号内。 --函数定义和使用 Create function [dbo].[GetBitNumber] ( @s varchar(4) ) returns int as begin set @s = upper(@s) declare @r int = 0; if(CHARINDEX('A',@s)>0) set @r+=1; if(CHARINDEX('B',@s)>0) set @r+=2; if(CHARINDEX('C',@s)>0) set @r+=4; if(CHARINDEX('D',@s)>0) set @r+=8; return @r end go select dbo.GetBitNumber('ABD') --或者 declare @result int set @result = dbo.GetBitNumber('ABD') --存储过程的定义和使用 Create proc [dbo].[usp_SyncDBSQL] @catalog varchar(50)= 'EES_CSLSOUT', --数据库名称 @serverIP varchar(50)='192.168.0.102', --数据库服务器地址 @userId varchar(20)='sa', --登录用户名 @password varchar(50)='HX1q2w3e4r' --登录密码 as begin create table #tmp ( name varchar(200), network_name varchar(200), status varchar(200), id int, collation_name varchar(200), connect_timeout int, query_timeout int ) insert into #tmp exec sp_helpserver declare @count int = 0 select @count = COUNT(*) from #tmp where name='syncDBLink' if(@count>0) begin exec sp_dropserver 'syncDBLink','droplogins' end drop table #tmp exec sp_addlinkedserver 'syncDBLink','','SQLOLEDB',@serverIP,'','',@catalog exec sp_addlinkedsrvlogin 'syncDBLink','false',null,@userId,@password exec sp_serveroption 'syncDBLink', 'rpc out', 'true' declare @sql varchar(max) = ' declare @name varchar(200),@typeKey varchar(20) declare cur cursor for select name, case type when ''p'' then ''proc'' else ''function'' end as typeKey from sysobjects where type in(''fn'',''tf'',''p'') open cur fetch next from cur into @name,@typeKey while @@FETCH_STATUS=0 begin exec(''drop '' + @typeKey + ''['' + @name + '']'') fetch next from cur into @name,@typeKey end close cur deallocate cur' exec(@sql) at syncDBLink declare @id int declare cur0 cursor for select id from sysobjects where type in ('fn','tf','p') order by crdate open cur0 fetch next from cur0 into @id while @@FETCH_STATUS=0 begin set @sql = object_definition(@id); exec(@sql) at syncDBLink fetch next from cur0 into @id end close cur0 deallocate cur0 exec sp_dropserver 'syncDBLink','droplogins' end go --调用方式 exec usp_SyncDBSQL 'EESSP1','192.168.0.101','sa','hx123456' --2.如果在递归调用中,使用了游标,则需要声明为Local,如: declare cur cursor local for select id,dirName from AllFolder where parentId = @dirId --3.递归的CTE有两部分组成,一部分是原查询,然后用union all 关联结合CTE的递归查询。如: ;with cte as ( select DIRNAME,PARENTID,ID,0 as level,DIRNAME+CONVERT(varchar(max),'') as fPath,RESTYPEID from RESDIR where PARENTID=0 union all select r.DIRNAME,r.PARENTID,r.ID,cte.level + 1,cte.fPath + '/' + r.DIRNAME,r.RESTYPEID from RESDIR r inner join cte on r.PARENTID = cte.ID ) select cte.ID,cte.DIRNAME,m.value + '/' +cte.fPath as fPath,cte.level into dm from cte inner join MATECONTENTS m on m.ID = cte.RESTYPEID order by fPath --4.exec()查询结果可以直接插入表格 Create table Demo_Values ( PKID int not null identity(1, 1) primary key ,DName Nvarchar(20) null ,DCode NVarchar(30) null ,DDate datetime null ) go --this SQL is only for SQL Server 2008 Insert into Demo_Values (DName, DCode, DDate) values ('DemoA', 'AAA', GETDATE()) ,('DemoB', 'BBB', GETDATE()) ,('DemoC', 'CCC', GETDATE()) ,('DemoD', 'DDD', GETDATE()) ,('DemoE', 'EEE', GETDATE()) select * from Demo_Values insert into Demo_Values(DName, DCode, DDate) exec('select DName, DCode, DDate from Demo_Values')