例如我们日常生活中用到最多的组织结构图。我们一般会用一个Employees表保存员工数据,而每个员工则又可能会有相应的上级。以前要得到某个员工的所有上级,或者所有下级,通常所采取的方法都是递归。SQL Server 2005开始支持的CTE从一定程序上方便了该工作的实现。
但SQL 2008的hierarchyid让这个工作更加简化和直接。而该类型其实是一个CLR自定义数据类型。

一般我们使用的时候,如下面的例子
--创建表CREATE TABLE Employees( Org_Id hierarchyid NOT NULL, EmployeeId INT NOT NULL, EmployeeName VARCHAR(50) NOT NULL, Title VARCHAR(50) NOT NULL)GO |
–插入一些员工,注意第一个列的格式,必须用/开始和结束。这是一个路径的符号。这是一个关键
INSERT INTO dbo.Employees VALUES('/',10000,'陈希章','CEO');INSERT INTO dbo.Employees VALUES('/1/',10001,'张三','CTO');INSERT INTO dbo.Employees VALUES('/2/',10002,'李四','CFO');INSERT INTO dbo.Employees VALUES('/1/1/',10003,'王五','IT Manager');INSERT INTO dbo.Employees VALUES('/1/2/',10004,'赵六','Manager');INSERT INTO dbo.Employees VALUES('/1/1/1/',10005,'洪七','Employee'); |
–查看所有的员工
SELECT * FROM dbo.Employees |
--查看所有的员工及其级别SELECT *,Org_Id.GetLevel() AS Level FROM Employees |
–查看陈希章的所有下属
DECLARE @BOSS hierarchyidSELECT @BOSS=Org_Id FROM Employees WHERE EmployeeID=10000SELECT *,Org_Id.GetLevel()AS Level FROM Employees WHERE Org_Id.IsDescendantOf(@BOSS)=1 |
--查看赵六及其所有上级DECLARE @Employee hierarchyidSELECT @Employee=Org_Id FROM Employees WHERE EmployeeID=10004SELECT *,Org_Id.GetLevel()AS Level FROM Employees WHERE @Employee.IsDescendantOf(Org_Id)=1 |
与hierarchyid有关的一些函数主要有
◆GetAncestor :取得某一个级别的祖先
◆GetDescendant :取得某一个级别的子代
◆GetLevel :取得级别
◆GetRoot :取得根
◆IsDescendantOf :判断某个节点是否为某个节点的子代
◆Parse :将字符串转换为hierarchyid。该字符串的格式通常都是/1/这样的
◆Read :从传入的 BinaryReader 读取 SqlHierarchyId 的二进制表示形式,并将 SqlHierarchyId 对象设置为该值。不能使用 Transact-SQL 调用。请改为使用 CAST 或 CONVERT。
◆GetReparentedValue :可以用来移动节点(或者子树)
◆ToString :将hierarchyid转换为字符串,与parse正好相反
◆Write将 SqlHierarchyId 的二进制表示形式写出到传入的 BinaryWriter 中。无法通过使用 Transact-SQL 来调用。请改为使用 CAST 或 CONVERT。
【编辑推荐】
sqlserver2008中在图形界面输入数据的时候如果违反约束又删不掉怎么办
方法一:先添加主键表,在添加外键表(这样就不会报错,保证了数据的完整性)方法二:可以临时禁用外键。alter database test nocheck constraint fk_t1_t2(这样不利于保证数据的完整性)
怎样快速检测与sql数据库是否能正常连接
1、右键计算机,点击管2113理。 2、如图找到5261SQL Server配置管理器。 3、如图找到SQL Server网络配置下的MSSQLSERVER,然4102后把TCP/IP状态1653改为启用。 4、打开SQL server数据库,按照图内进行操作,然后点击连接,那么就可以连接到别人(容或自己)的数据库
用友通服务无法启动.
答:用友通服务启动过程中此提示比较常见,出错原因情况较多,一般通过分析用友通日志文件(system32\)来确定问题所在,常见情况如下:
情况1:日志文件记录:[2008.6.13 11:36:26]不能找到UFSystem或Account表库,可能是安装没有正常完成,或没有进行初始化,请运行行系统管理进行安装后的初始化。
分析:由提示信息得知还未创建用友通系统数据库UFSystem,可通过查看企业管理器等数据库工具来查看是否存在UFSystem数据库,此系统数据库是安装用友通产品后第一次登录系统管理或重启计算机后自动创建系统数据库和演示账套过程中建立,启动用友通服务报此错误,很有可能还未登录系统管理或执行初始化操作,也可能执行过程中失败。解决:方法1:执行系统管理,做初始化操作方法2:若方法1未执行初始化,可能是这前做过初始化,删除注册表项:[Hkey_LOCAL_macHINE\SOFTWARE\UFSoft\UF2000\2.0\Setup],再登录系统管理做初始化操作方法3:若初始化操作建立系统数据库操作失败,可手工建立此系统数据库,还原用友通安装目录\Admin\ 文件,还原时数据库名称定义为UFSystem
情况2:[2008.6.14 9:55:33]PROVIDER=SQLOLEDB;DATA SOURCE=用友通-UFIDA;USER ID=SAASSWORD=…[2008.6.14 9:55:33]不能连接到SQL Server,可能是口令不正确。
分析:由提示得知是由于连接数据库失败,一般是指数据库口令问题,用友通服务调用的是系统管理设置SA的口令,一般查看系统管理能否正常运行,系统管理运行提示SA口令见[系统管理]页解决:配置SQL口令,正常运行系统管理, 操作见[系统管理]页
情况3:[2008.6.14 15:16:53]接收信息出错。 ……[2008.6.14 15:17:1]不能装订接口。
分析:提示中的接口可以理解为端口,用友通产品端口是4630,SQLServer默认端口是1433,日志中记录不能装订接口,很可能是产品端口被禁用或被别的占用,被禁用一般是由于防火墙引起,包括杀毒软件自带防火墙或XP2系统防火墙,被占用可能是别的应用软件需要调动自身端口或临时动态端口,导致4630端口不能被用友通服务正常调用。在DOS下用命令查看服务器端口开放情况,命令为:netstat –a –n,正常情况TCP协议类型4630端口状态为LISTENING
在服务器或客户端DOS下用命令查看服务器端口连接,命令为:telnet Ip地址 端口号(如4630),如果正常连接会跳出空白界面,如下图
如连接失败会提示:正在连接到机器名…不能打开到主机的连接,在端口4630:连接失败
解决:若检测端口确实有异常,可查看机器网络环境或防火墙配置情况,关于防火墙配置请参见[防火墙]页
情况4:提示:“..失败”分析:可能是因为数据访问组件版本不一致解决:安装SQL数据库最新补丁,MSDE用户打MSDE2000SP4补丁包,SQLServer2000用户打SQL Server 2000 SP4补丁包,通网站服务工具栏下载号分别是865和866,此补丁包比较大也可以考虑更新数据访问组件MDAC,通网站可下载MDAC2.7版本,工具号为678
情况5:提示:Server不能装入底层接口SGV
分析:可能是由于用友通服务和版本不兼容所致,用友通服务对应文件是System32\,此文件与当前用友通版本不一致。 原因可能是安装早版本时没卸载干净或打过加密狗方面的补丁引起。 解决:方法1:停止用友通服务,从别的机器上拷贝文件覆盖本机此文件,再启动用友通服务方法2:卸载用友通产品,如果System32\文件还存在,手工删除,再次安装用友通产品
问:财务通版本在WindowsXP环境下用友通服务(UF2000)开机后不能自动启动,需手工启动服务,如何配置做服务开机自动启动?答:在不更换操作系统情况可以通过批命令来实现此功能〖操作步骤〗(以财务通服务:UF2000管理软件为例)1.新建一文本文档,在第一行写入:net start UF2000财务软件 exit,保存退出2.将此文本文档后缀更改为bat后缀,文件名称不限,如更改为:财务通服务启动3.此文件存放于操作系统启动目录下,如:D:\Documents and Settings\peak\「开始」菜单\程序\启动\财务通服务启动
发表评论