[推荐] SQL SERVER 2008 新数据库类型hierarchyid 50ldslove]

发布时间:2017-4-26 0:39:05 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"[推荐] SQL SERVER 2008 新数据库类型hierarchyid 50ldslove]",主要涉及到[推荐] SQL SERVER 2008 新数据库类型hierarchyid 50ldslove]方面的内容,对于[推荐] SQL SERVER 2008 新数据库类型hierarchyid 50ldslove]感兴趣的同学可以参考一下。

/* --2010-05-27(东升)       SQL SERVER 2008 新数据库类型hierarchyid             SQL SERVER 2008引入了新的hierarchyid数据类型,可以用它来做本地存储并且在树层次 结构中管理其位置.只用这个函数能简洁地表示层次结构中的位置.该函数提供的一些内置的函 数方法可以操作和遍历层次结构,使得存储和查询分层数据更为容易,而不需要像那样通过 CTE递归来获得.       该类型其实是一个CLR自定义数据类型依次打开:数据库->系统数据库->master->可编程性 ->类型->系统数据类型->CLR数据类型->hierarchyid,可以看到该数据类型.          于hierarchyid有关的一些函数主要有:          GetAncestor :取得某一个级别的祖先     GetDescendant :取得某一个级别的子代     GetLevel :取得级别     GetRoot :取得根     IsDescendantOf :判断某个节点是否为某个节点的子代     Parse :将字符串转换为hierarchyid。该字符串的格式通常都是/1/这样的     Read :Read 从传入的BinaryReader 读取SqlHierarchyId 的二进制表示形式,并将            SqlHierarchyId 对象设置为该值。不能使用Transact-SQL 调用Read。请改            为使用CAST 或CONVERT。     GetReparentedValue :可以用来移动节点(或者子树)     ToString :将hierarchyid转换为字符串,与parse正好相反     Write : 将SqlHierarchyId 的二进制表示形式写出到传入的BinaryWriter 中。无法通            过使用Transact-SQL 来调用Write。请改为使用CAST 或CONVERT。         以下就该新类型做一些演示 */       USE TESTDB     GO          CREATE TABLE TEST(            [PHASE] hierarchyid NOT NULL,            LVL AS [PHASE].GetLevel(),            USERID INT NOT NULL,            USERNAME VARCHAR(50) NOT NULL            )          --接着插入一个根          INSERT TEST([PHASE],USERID,USERNAME)     VALUES('/',1001,'东升')--'/'被用来表示层次的根,会自动转换成二进制格式               SELECT * FROM TEST      /*  结果       PHASE  LVL    USERID     USERNAME     ------ ------ ---------  ----------     0x     0      1001       东升       (1 行受影响)          查询后应该发现'/'被重新定义成x十六进制值.          使用斜杠字符来表示层次路径,一个表示的是根,用斜杠分隔的整数值来组成连续的层次.               插入小弟 */     INSERT TEST([PHASE],USERID,USERNAME)     VALUES('/1/',1002,'土豆')          INSERT TEST([PHASE],USERID,USERNAME)     VALUES('/2/',1003,'红太狼')     --以上条数据时同级别的               SELECT * FROM TEST /*     PHASE      LVL    USERID      USERNAME     -------    ------ ---------  -----------     0x         0      1001        东升     0x58       1      1002        土豆     0x68       1      1003        红太狼       (3 行受影响)      */               --同样可以使用GetDescendant方法来填充[PHASE]     DECLARE    @PARENTPHASE hierarchyid, @Child1 hierarchyid     SELECT @PARENTPHASE= CONVERT(hierarchyid,'/1/')          INSERT TEST([PHASE],USERID,USERNAME)     VALUES(@PARENTPHASE.GetDescendant(NULL,NULL),1004,'土豆小弟1')          SELECT @Child1 = CAST('/1/1/' AS hierarchyid)     INSERT TEST([PHASE],USERID,USERNAME)     VALUES(@PARENTPHASE.GetDescendant(@Child1,NULL),1005,'土豆小弟2')          SELECT [PHASE].ToString() AS [PHASE] ,LVL,USERID,USERNAME FROM TEST     ORDER BY [PHASE]      /*     PHASE      LVL    USERID      USERNAME     ---------- ------ ---------  ---------     /          0      1001        东升     /1/        1      1002        土豆     /1/1/      2      1004        土豆小弟1     /1/2/      2      1005        土豆小弟2     /2/        1      1003        红太狼       (5 行受影响)       查询中的中ToString方法可以显示hierarchyid类型的字符串表示,而不是十六进制值.     该方法下面会经常用到.               下面演示一下上面提到的函数方法(注意方法的调用要注意大小写):           1 GetAncestor: child.GetAncestor ( n ) 返回指定的祖先.         用于测试输出中的每个节点是否将当前节点作为指定级别的祖先。        如果传递的数字大于GetLevel(),则返回NULL。        如果传递的是负数,则引发异常   */       SELECT PHASE.GetAncestor(2).ToString()AS Ancestor             --把对应的二级祖先的层次显示为字符串     ,PHASE.ToString() as CURPHASE     ,USERNAME     FROM TEST     WHERE LVL>=2 --去除级别小于的行              /*     Ancestor       CURPHASE   USERNAME     -----------   ---------  ----------     /              /1/1/      土豆小弟1     /              /1/2/      土豆小弟2       (2 行受影响)          注意GetAncestor(0)返回的是节点本身     2 GetDescendant: parent.GetDescendant ( child1 , child2 ) 返回子节点     child1:NULL 或当前节点的子节点的hierarchyid。     child2:NULL 或当前节点的子节点的hierarchyid。       如果父级为NULL,则返回NULL。     如果父级不为NULL,而child1 和child2 为NULL,则返回父级的子级。     如果父级和child1 不为NULL,而child2 为NULL,则返回一个大于child1 的父级的子级。     如果父级和child2 不为NULL,而child1 为NULL,则返回一个小于child2 的父级的子级。     如果父级、child1 和child2 都不为NULL,则返回一个大于child1 且小于child2 的父级的子级。     如果child1 不为NULL 且不是父级的子级,则引发异常。     如果child2 不为NULL 且不是父级的子级,则引发异常。     如果child1 >= child2,则引发异常。 */       --插入一行作为最低级别的后代节点,上面插入的时候就运用的这个特点     --不含参数的GetDescendant 方法插入新行,以将新行节点指定为/1/1/     --上面执行过,此处不执行     DECLARE    @PARENTPHASE hierarchyid     SELECT @PARENTPHASE= CONVERT(hierarchyid,'/1/')     INSERT TEST([PHASE],USERID,USERNAME)     VALUES(@PARENTPHASE.GetDescendant(NULL,NULL),1004,'土豆小弟1')          --插入一行作为较高级别的后代节点     --使用带有Child1 参数的GetDescendant 方法插入新行     --指定新行的节点将紧跟'/1/1/'节点,成为/1/2/     --上面执行过,此处不执行     DECLARE    @PARENTPHASE hierarchyid, @Child1 hierarchyid     SELECT @PARENTPHASE= CONVERT(hierarchyid,'/1/')     SELECT @Child1 = CAST('/1/1/' AS hierarchyid)     INSERT TEST([PHASE],USERID,USERNAME)     VALUES(@PARENTPHASE.GetDescendant(@Child1,NULL),1005,'土豆小弟2')          --在两个现有节点之间插入一行     --同时使用child1 参数和child2 参数指定新行的节点将成为节点/1/1.1/     DECLARE    @PARENTPHASE hierarchyid, @Child1 hierarchyid,@Child2 hierarchyid     SELECT @PARENTPHASE= CONVERT(hierarchyid,'/1/')     SELECT @Child1 = CAST('/1/1/' AS hierarchyid)     SELECT @Child2 = CAST('/1/2/' AS hierarchyid)     INSERT TEST([PHASE],USERID,USERNAME)     VALUES(@PARENTPHASE.GetDescendant(@Child1,@Child2),1006,'土豆小弟')          SELECT [PHASE].ToString() AS [PHASE] ,lvl,userid,username      FROM  test ORDER BY [PHASE]          /*     PHASE      lvl    userid      username     ------     ------ ---------- ------------     /          0      1001        东升     /1/        1      1002        土豆     /1/1.1/    2      1006        土豆小弟3     /1/1/      2      1004        土豆小弟1     /1/2/      2      1005        土豆小弟2     /2/        1      1003        红太狼       (6 行受影响)          节点/1/1.1/高于节点/1/1/低于节点/1/2/,但是属于同一级别           3 GetLevel (): node.GetLevel () 返回一个表示节点在树中的深度的整数。 */ 太多了请看博文:http://blog.csdn.net/ldslove/archive/2010/05/27/5628007.aspx  

sf 来

学习是必须的

这个此前我也有在整理,觉得查询方便,就是插入的时候麻烦。

我也感觉插入时麻烦点。。但是后期的管理比较方便。 我觉得对好的地方就是节点和子树的移动比较省事。

我是来鄙视东升哥的. 这回才放50

学习!

引用 5 楼 garnett_kg 的回复:我是来鄙视东升哥的. 这回才放50 又被你鄙视了。。。。。。。。哥你才放20分。。。都捐给我去赌一把。

jfjf 看完了 不错的数据类型 谢谢分享 同来享你的分 其中最欣赏你的那句插入小弟 反过来效果更佳 小弟插入

谢谢不错的数据类型

学习@@ 谢谢@

赞 .....

很好不错哦看看学习

ssssssssssss

dddddddd

这个有点麻烦,我觉得在程序里用datatable的特性做个递归就好了啊,而且字段只需要id,name,parentid就可以了,速度也很快的

收藏了 . ths

学习。。。

学习是必须的   

发现还需学习啊

学。。。

还需学习啊

hahahhaaaaaaaaaaaaaaaaa

努力学习

学习。

aaaaaaaaaaaaaaaaaaaaaaaaa

向东升哥致敬

对于  我这种菜鸟来说  有点困难

感觉插入时麻烦点。。

厉害啊 呵呵

good

学习学习

学习。。。

用SQL2005,学习中。。。

学习了

学习了,每太看懂。

感觉不是太好用 这个数据类型 http://topic.csdn.net/u/20080514/15/af788986-0ef6-4d83-8e9d-4cb97e2831c8.html

还是要 膜拜下 东升哥

受教了

不错的啊 新东西 JF

新东东!学习学习!

来看看,学习下。

引用 36 楼 feixianxxx 的回复:感觉不是太好用 这个数据类型 http://topic.csdn.net/u/20080514/15/af788986-0ef6-4d83-8e9d-4cb97e2831c8.html

学习是必须的

ooooooo。。。。。。

学习数据库,很有用

dtg

hhhhhh

赞一个。。。。

相当的不错,谢谢!

高手,人才

学习学习

收藏,学习。

该回复于2010-12-02 14:13:36被版主删除

学习是必须的

不错,可惜试不了,还没装sql server2008

该回复于2012-08-28 09:07:46被版主删除

mark

学习,先看看

XUEXI

顶了先

SQL SERVER 2008 新数据库类型hi... [新技术前沿]

学习学习。。。

我是来看我的楼上的

学习中 , 受教了 

http://bbs.windows7en.com/?fromuser=hb19910107

来看看学习下~~

顶一个

看不太明白全是技术流

呵呵  好东东 

路过了一下 顺便知道了下

好的,非常不错

插入时麻烦. 管理方便.

回帖是美德

看帖更是美德

学习一下!

路过,来看看!

好的,非常不错

学习了  谢谢lz

学习学习,非常不错.

2005还没有学习好呢。

我来晚了 

貌似我是你小弟喽

继续努力

路过。。。。看看

引用 82 楼 bancxc 的回复:貌似我是你小弟喽 借用你一下。。。送你个老婆

不错,可惜试不了,还没装sql server2008

学习了,谢谢

学习了,谢谢

厉害,学习了

DFSDFSDFD V

不错...............

多谢分享

该回复于2010-09-07 14:39:01被版主删除

嗯,不错。。。。。

学习是必须的

学习一下

学习一下

学习一下

不了解数据量大的时候,性能怎么样,哪位给做个测试啊。。。

上一篇:一个SQL 语句的写法 40t240034137]
下一篇:MSSQL配置为分发服务器失败 100Jia_Ma]

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款