常用sql自定义函数以及存储过程

原创 2011年01月14日 00:25:00
------------------------------------

--用途:返回给定类别id的树路径[取其名称]

--说明:父节点与子节点路径以>>联结,改为自定义后使用该函数

--时间:2011-1-13 16:40:28

------------------------------------

CREATE      FUNCTION Getpath

               (@id INT)

RETURNS VARCHAR(1000)

AS

  BEGIN

    DECLARE

      @re_str  AS VARCHAR(1000)

    SET @re_str = ''

    SELECT @re_str = classname

    FROM   uds_class

    WHERE  classid = @id

    WHILE EXISTS (SELECT 1

                  FROM   uds_class

                  WHERE  classid = @id

                         AND classparentid <> classid)

      BEGIN

        SELECT @id = b.classid,

               @re_str = b.classname + '>>' + @re_str

        FROM   uds_class a,

               uds_class b

        WHERE  a.classid = @id

               AND a.classparentid = b.classid

      END

    RETURN @re_str

  END



------------------------------------

--用途:返回当前文档多个关键词构造的参照表@tb


--说明:原始关键词以空格分割,改为自定义后使用该函数

--时间:2011-1-13 16:40:28

------------------------------------

CREATE FUNCTION GetRelaTag(@docid int)  

RETURNS @tb table([name] varchar(20)) AS

begin

declare @index int

declare @name varchar(20),@tagstr varchar(500)

select @tagstr=tagnamestr from tss_document where docid=@docid

if @tagstr<>'' set @tagstr=@tagstr+space(1)

while(@tagstr<>'')

begin

set @index = charindex(space(1),@tagstr)

set @name = substring(@tagstr,1,@index-1)

set @tagstr = substring(@tagstr,@index+1,len(@tagstr)-@index)

insert into @tb values(@name)

end

return

end

------------------------------------

--用途:获得与当前资料相关的资源


--说明:关键词改为自定义后使用该过程,用到自定义函数GetRelaTag

--时间:2011-1-13 16:40:28

------------------------------------

CREATE  PROCEDURE usp_getrelakey3(

               @docid INT,

               @topN  INT)

AS

SELECT IDENTITY(INT,1,1) as tid,* INTO #tmp FROM GetRelaTag(@docid)

DECLARE @relatable TABLE (

    docid INT,

    tagnamestr  varchar(500))

  DECLARE @resulttable TABLE (

    docid INT,

    score INT) --依据关键词匹配度加分

  INSERT INTO @relatable  SELECT   docid,tagnamestr  FROM  tss_document          
   WHERE   docid<>@docid and status='发布' and tagnamestr is not null  ORDER BY docid

  DECLARE  @min INT

  SELECT @min = Min(docid)  FROM   @relatable

  WHILE @min IS NOT NULL

    BEGIN

      BEGIN        

        DECLARE @mininner INT

        SELECT @mininner = Min(tid)  FROM   #tmp

        WHILE @mininner IS NOT NULL

          BEGIN

            IF EXISTS (SELECT *  FROM   #tmp  WHERE tid=@mininner and  [name] IN (SELECT *  FROM   GetRelaTag(@min)))

              BEGIN

                IF EXISTS (SELECT *  FROM  @resulttable  WHERE  docid = @min) --已存在则更新分数

                  UPDATE @resulttable  SET score = Isnull(score,0) + 1  WHERE  docid = @min

                 ELSE

                  INSERT INTO @resulttable   VALUES(@min,1)

              END

            SELECT @mininner = Min(tid)  FROM   #tmp  WHERE  tid> @mininner

          END

      END

      SELECT @min = Min(docid)   FROM   @relatable   WHERE  docid > @min --更新“指针”内容,使之移到下一记录

    END

  SET ROWCOUNT  @topN

  SELECT   b.*

  FROM     @resulttable a

           LEFT JOIN tss_document b

             ON a.docid = b.docid

  WHERE b.status='发布'

  ORDER BY a.score DESC

GO



------------------------------------

--用途: 获得给定类别id的所有父类包括其本身

--说明:注意自联结的使用

--时间:2011-1-13 16:40:28

------------------------------------



CREATE  FUNCTION getallparentInfor

              (@id INT)

RETURNS @t TABLE(classid INT,className varchar(300))

AS

  BEGIN

    declare @CName as varchar(300)

    select top 1 @CName=className from uds_class where classid=@id

    INSERT INTO @t

    VALUES     (@id,@CName)

    WHILE EXISTS (SELECT 1

                  FROM   uds_class

                  WHERE  classid = @id

                         AND classparentid <> classid)

      BEGIN

        SELECT @id = b.classid,@CName=b.className

        FROM   uds_class a,

               uds_class b

        WHERE  a.classid = @id

               AND a.classparentid = b.classid

        INSERT INTO @t

        VALUES     (@id,@CName)

      END

    RETURN

  END

------------------------------------

--用途: 获得给定类别id的所有子类但不包括其本身

--时间:2011-1-13 16:40:28

------------------------------------

create function GetChildren (@id int)

returns @t table(classid int)

as

begin

    insert @t select classid from uds_class where classparentid = @id

    while @@rowcount > 0

        insert @t select a.ClassID from uds_class as a inner join @t as b

        on a.classparentid = b.classid and a.ClassID not in(select classid from @t)

   return

end

------------------------------------

--用途: 获得给定类别id的所有子类包括其本身

--说明:用到GetChildren 函数

--时间:2011-1-13 16:40:28

------------------------------------



CREATE  function GetChildrenIncSelf(@ClassID int)

Returns table

AS

Return (select * from GetChildren(@ClassID)

union

select @ClassID ) --包含本身的类别id表



相关文章推荐

SQL中存储过程和自定义函数的区别

SQL中存储过程和自定义函数的区别 存储过程: 存储过程可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并...

SQL中自定义函数的存储过程的区别

SQL中的存储过程和自定义函数都是经常用到的,那么,它们之间究竟有何区别呢?下文将为您分别分析二者的异同点,供您参考,希望对您有所启迪。 存储过程: 存储过程可以使得对数据库的管理、以及显示关于数...

SQL自定义函数与存储过程

存储过程: 存储过程可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。存储过程是 SQL语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据...

存储过程与用户自定义函数(SQL SERVER)

二者本质上没有什么区别。当存储过程和函数被执行的时候,SQL Manager会到procedure cache中去取相应的查询语句,如果在procedure cache里没有相应的查询语句,SQL M...

存储过程,自定义函数

  • 2013年04月07日 16:35
  • 1.66MB
  • 下载

sql server 2005 几个常用的存储过程或函数

--------------------------------------------------------功能:十六进制转换为文件号 --使用:SELECT dbo.convert_page_n...

常用SQL工具存储过程与函数.rar

  • 2011年05月22日 11:14
  • 156KB
  • 下载

MySQL学习笔记 4:自定义函数和MySQL存储过程

一、自定义函数UDF 1.  语法结构 CREATE FUNCTION functon_name([参数名 参数类型,...]) RETURNS 返回值类型 函数体 2.例子 DELIMI...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:常用sql自定义函数以及存储过程
举报原因:
原因补充:

(最多只允许输入30个字)