多语句表值函数获取指定节点Id及其所有子节点Id

多语句表值函数

定义:

多语句表值函数也称为多声明表值型函数,可以看作标量型和内联表值型函数的结合体。 它的返回值是一个表,但它和标量型函数一样有一个用BEGIN-END 语句括起来的函数体,返回值的表中的数据是由函数体中的语句插入的。 可以进行多次查询,对数据进行多次筛选与合并弥补了内嵌表值型函数的不足。

语法:

CREATE FUNCTION [ owner_name.] function_name 


  ( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )

  RETURNS @return_variable TABLE < table_type_definition >

  [ WITH < function_option > [ [,] ...n ] ]

  [ AS ]

  BEGIN

  function_body

  RETURN

  END

  < function_option > ::=

  { ENCRYPTION | SCHEMABINDING }

  < table_type_definition > ::=


  ( { column_definition | table_constraint } [ ,...n ] )

数据库设计:

CREATE TABLE [dbo].[JetCms_Article_Column](
[ColumnTypeId] [int] IDENTITY(1,1) NOT NULL,
[ColumnTypeName] [varchar](30) NOT NULL,
[ColumnTypeUrlName] [varchar](30) NOT NULL,
[ColumnTypeParentId] [int] NOT NULL,
[ColumnTypeLevel] [int] NOT NULL

函数实现:

IF EXISTS(SELECT * FROM sys.objects WHERE TYPE='TF' AND NAME='fnGetAllChildColumnIds')
DROP FUNCTION fnGetAllChildColumnIds
GO
CREATE FUNCTION fnGetAllChildColumnIds
(@ColumnTypeUrlName varchar(30))
RETURNS @AllChildColumnIds TABLE(ColumnTypeId int,ColumnTypeLevel int)
AS
BEGIN
DECLARE @ColumnTypeId INT
DECLARE @ColumnTypeLevel INT
SELECT @ColumnTypeId=ColumnTypeId,@ColumnTypeLevel=ColumnTypeLevel FROM JetCms_Article_Column WHERE ColumnTypeUrlName =@ColumnTypeUrlName
INSERT INTO @AllChildColumnIds SELECT @ColumnTypeId,@ColumnTypeLevel
WHILE @@ROWCOUNT>0
BEGIN
SELECT @ColumnTypeLevel=MAX(ColumnTypeLevel) FROM @AllChildColumnIds
INSERT INTO @AllChildColumnIds SELECT A.ColumnTypeId,A.ColumnTypeLevel FROM JetCms_Article_Column AS A INNER JOIN @AllChildColumnIds B
ON A.ColumnTypeParentId=B.ColumnTypeId
WHERE B.ColumnTypeLevel =@ColumnTypeLevel AND A.ColumnTypeLevel=@ColumnTypeLevel+1
END
RETURN
END

函数调用:

SELECT * FROM dbo.fnGetAllChildColumnIds('jiankang')

 

本文基于署名-非商业性使用 3.0许可协议发布,欢迎转载,演绎,但是必须保留本文的署名JetWu技术博客(包含链接),且不得用于商业目的。
如您有任何疑问或者授权方面的协商,请与我联系。
posted @ 2011-10-02 13:19  JetWu  阅读(377)  评论(0编辑  收藏  举报