以前在sql里还没有调用过自定义函数,今天刚用过,所以想把他记录下来,以防以后忘记。
一、函数定义
sql 调用自定义函数方法--将档案IDS的字符串转换成名字的字符串
sql 调用自定义函数方法ALTER FUNCTION GetArchivesNameStr(@SourceSql nvarchar(
500),@StrSeprate nvarchar(10))    --字符串格式41,56,77,
sql 调用自定义函数方法RETURNS nvarchar(
500)
sql 调用自定义函数方法AS
sql 调用自定义函数方法begin
sql 调用自定义函数方法    declare @names nvarchar(
500)
sql 调用自定义函数方法    declare @i 
int
sql 调用自定义函数方法    
set @names=''
sql 调用自定义函数方法    
set @SourceSql=rtrim(ltrim(@SourceSql))
sql 调用自定义函数方法    
set @i=charindex(@StrSeprate,@SourceSql)
sql 调用自定义函数方法    
while @i>=1
sql 调用自定义函数方法    begin        
sql 调用自定义函数方法        
set @names=@names+(select name from Archives where ArchivesID=convert(int,left(@SourceSql,@i-1)))+','
sql 调用自定义函数方法        
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)  --已经转换好的去掉
sql 调用自定义函数方法        
set @i=charindex(@StrSeprate,@SourceSql)       --重新定位
sql 调用自定义函数方法    end    
sql 调用自定义函数方法    
--return @names
sql 调用自定义函数方法    
if @SourceSql<>''and @i>=1   --最后一个
sql 调用自定义函数方法    begin
sql 调用自定义函数方法         
set @names=@names+(select name from Archives where ArchivesID=convert(int,left(@SourceSql,@i-1)))
sql 调用自定义函数方法    end
  if(right(@names,1)=',') --去掉后面的逗号
        set @names=substring(@names,1,len(@names)-1) 

sql 调用自定义函数方法    
return @names
sql 调用自定义函数方法end
sql 调用自定义函数方法    
sql 调用自定义函数方法

二、调用的函数
sql 调用自定义函数方法
sql 调用自定义函数方法
--根据组织,岗位和档案ID返回该用户可见的日报列表
sql 调用自定义函数方法
sql 调用自定义函数方法ALTER proc dbo.GetDailyList @orgid 
int,@postid int,@ArchivesID int
sql 调用自定义函数方法
as
sql 调用自定义函数方法    declare @a table(orgid 
int)
sql 调用自定义函数方法    insert @a select orgid from organize where orgid 
= @orgid
sql 调用自定义函数方法    
while @@rowcount > 0   --中间有一递归,有点难懂啊
sql 调用自定义函数方法        insert @a select a.orgid from organize 
as a inner join @a as b
sql 调用自定义函数方法        on a.fatherorgid 
= b.orgid and a.orgid not in(select orgid from @a)
sql 调用自定义函数方法
sql 调用自定义函数方法    declare @b table(postid 
int)
sql 调用自定义函数方法    insert @b select postid from post where postid 
= @postid
sql 调用自定义函数方法    
while @@rowcount > 0
sql 调用自定义函数方法        insert @b select a.postid from post 
as a inner join @b as b
sql 调用自定义函数方法        on a.fatherpostid 
= b.postid and a.postid not in(select postid from @b)
sql 调用自定义函数方法
sql 调用自定义函数方法
--declare @ArchivesID nvarchar(20)
sql 调用自定义函数方法
--select @ArchivesID=ArchivesID from Users where UserID=@userid
sql 调用自定义函数方法
--print @ArchivesID
sql 调用自定义函数方法
sql 调用自定义函数方法
sql 调用自定义函数方法SELECT a.DailyID, a.TaskTitle,a.AuthorID,b.Name 
as AuthorName,a.DispathchManID,
sql 调用自定义函数方法        dbo.GetArchivesNameStr(a.DispathchManID,
',') AS DispatchManName, 
sql 调用自定义函数方法        a.AddDate, a.hit,dbo.GetCommentCount(a.DailyID) AS commentcount,
sql 调用自定义函数方法        
'StateStr'=case 
sql 调用自定义函数方法                    when a.StateID
=1 then '未执行'
sql 调用自定义函数方法                    when a.StateID
=2 then '执行中'
sql 调用自定义函数方法                    when a.StateID
=3 then '执行完成'
sql 调用自定义函数方法                end,
sql 调用自定义函数方法        
'ImportTypeName'=case 
sql 调用自定义函数方法                    when a.ImportTypeID
=1 then '普通'
sql 调用自定义函数方法                    when a.ImportTypeID
=2 then '紧急'
sql 调用自定义函数方法                    when a.ImportTypeID
=3 then '非常紧急'
sql 调用自定义函数方法                end, dbo.GetArchivesNameStr(FinishManID,
','as FinishManName,
sql 调用自定义函数方法                dbo.GetArchivesNameStr(FactDispatchManID,
','as FactDispatchManName
sql 调用自定义函数方法FROM DailyList a LEFT  JOIN  Archives b on a.AuthorID
=b.ArchivesID 
sql 调用自定义函数方法WHERE (a.DailyType 
= 1) AND 
sql 调用自定义函数方法    b.orgid IN (select orgid from @a) and 
sql 调用自定义函数方法    
','+a.DispathchManID like '%,'+convert(nvarchar,@ArchivesID)+',%'

没想到函数的功能这么强大,可以方便好多工作啊,以后多用点,呵呵!

相关文章: