查询指定节点及其父节点

CREATE TABLE TCity
(
    ID VARCHAR(10), 
    ParentId VARCHAR(10), 
    Name VARCHAR(10)
)
GO

INSERT INTO TCity VALUES('001', NULL, '广东省')
INSERT INTO TCity VALUES('002', '001', '东莞市')
INSERT INTO TCity VALUES('003', '001', '深圳市')

INSERT INTO TCity VALUES('004', '002', '南城')

INSERT INTO TCity VALUES('005', '003', '罗湖区')
INSERT INTO TCity VALUES('006', '003', '福田区')
INSERT INTO TCity VALUES('007', '003', '宝安区')

INSERT INTO TCity VALUES('008', '007', '西乡镇')
INSERT INTO TCity VALUES('009', '007', '龙华镇')

GO

 

SELECT * FROM TCity

 

DECLARE @Id VARCHAR(10) 
SET @Id='008'

--递归
;WITH cte AS 
(
    SELECT ID,ParentId,Name FROM TCity
    WHERE ID=@Id
    UNION ALL
    SELECT a.ID,a.ParentId,a.Name FROM TCity a
    INNER JOIN cte b ON b.ParentId=a.ID
)

SELECT * FROM cte 
ORDER BY ID

 

--查询各节点的父路径函数(从父到子)
CREATE FUNCTION fun_ParentToChildPath
(
    --参数
    @id VARCHAR(10)
)
--返回值
RETURNS VARCHAR(100)
AS
BEGIN
    DECLARE @result AS VARCHAR(100)
    SET @result=''

    SELECT @result = Name FROM dbo.TCity WHERE ID=@id
    WHILE EXISTS(SELECT 1 FROM dbo.TCity WHERE ID=@id AND ParentId IS NOT NULL)
    BEGIN
        SELECT    @id=b.ID, 
                @result = b.Name + ',' + @result    --广东省,深圳市,宝安区
                --@result = @result + ',' + b.Name  --宝安区,深圳市,广东省
        FROM dbo.TCity a,dbo.TCity b
        WHERE a.ID=@id AND a.ParentId=b.ID
    END

    RETURN @result
END

GO 

--查询各节点的父路径函数(从子到父)
CREATE FUNCTION fun_ChildToParentPath
(
    --参数
    @id VARCHAR(10)
)
--返回值
RETURNS VARCHAR(100)
AS
BEGIN
    DECLARE @result AS VARCHAR(100)
    SET @result=''

    SELECT @result = Name FROM dbo.TCity WHERE ID=@id
    WHILE EXISTS(SELECT 1 FROM dbo.TCity WHERE ID=@id AND ParentId IS NOT NULL)
    BEGIN
        SELECT    @id=b.ID, 
                --@result = b.Name + ',' + @result  --广东省,深圳市,宝安区 
                @result = @result + ',' + b.Name    --宝安区,深圳市,广东省
        FROM dbo.TCity a,dbo.TCity b
        WHERE a.ID=@id AND a.ParentId=b.ID
    END

    RETURN @result
END

GO


DECLARE @Id VARCHAR(10) 
SET @Id='008'

SELECT *
    ,dbo.fun_ParentToChildPath(ID) AS 'ParentToChildPath'
    ,dbo.fun_ChildToParentPath(ID) AS 'ChildToParentPath'
FROM dbo.TCity
--WHERE ID=@Id
ORDER BY ID

 

DECLARE @str VARCHAR(100)
SET @str = '0102030405060708091000232'

--计算字符串里面有多少个零(0)
SELECT  LEN(@str),
LEN(REPLACE(@str,'0','')), LEN(@str)-LEN(REPLACE(@str,'0',''))

 

25 - 13 = 12 

posted @ 2017-12-14 23:10  茗::流  阅读(275)  评论(0)    收藏  举报
如有雷同,纯属参考。如有侵犯你的版权,请联系我。