sql server 树状结构表中,获取指定节点的所有父节点路径

CREATE PROCEDURE [dbo].[A_P_GetParentIds]
    (
      @IdValue NVARCHAR(36) ,-- 子节点值
      @tableName NVARCHAR(MAX) ,-- 表名
      @ParentIdColumnName NVARCHAR(MAX) ,-- 父节点列名
      @ChildIdColumnName NVARCHAR(MAX)-- 子节点列名
	)
AS
    DECLARE @sqlTemp NVARCHAR(MAX); --查询sql
    SET @sqlTemp = ' with cte_root as
(
 select ' + @ParentIdColumnName + ' from ' + @tableName + ' where '
        + @ChildIdColumnName + ' = ''' + @IdValue + ''' union all
  select a.' + @ParentIdColumnName + ' from ' + @tableName
        + ' a inner join cte_root b on a.' + @ChildIdColumnName + '=b.'
        + @ParentIdColumnName + ' ) ' + CHAR(10) + 'select * from cte_root '; 

------返回查询结果-----
    EXEC sp_executesql @sqlTemp;

GO
CREATE PROCEDURE [dbo].[A_P_GetParentInfo]
    (
      @IdValue NVARCHAR(36) ,-- 子节点值
      @tableName NVARCHAR(MAX) ,-- 表名
      @ParentIdColumnName NVARCHAR(MAX) ,-- 父节点列名
      @ChildIdColumnName NVARCHAR(MAX)-- 子节点列名
	)
AS
    DECLARE @sqlTemp NVARCHAR(MAX); --查询sql
    SET @sqlTemp = ' with cte_root as
(
 select *  from ' + @tableName + ' where '
        + @ChildIdColumnName + ' = ''' + @IdValue + ''' union all
  select a.*  from ' + @tableName
        + ' a inner join cte_root b on a.' + @ChildIdColumnName + '=b.'
        + @ParentIdColumnName + ' ) ' + CHAR(10) + 'select * from cte_root '; 

------返回查询结果-----
    EXEC sp_executesql @sqlTemp;

GO

调用测试:

DECLARE	@return_value int

EXEC	@return_value = [dbo].[A_P_GetParentIds]
		@IdValue = N'a29672f9-3d03-4cfc-9cb0-403ce729db5b',--子节点值
		@tableName = N'SystemMenu',--表名
		@ParentIdColumnName = N'ParentId',--父节点列名
		@ChildIdColumnName = N'Id'--子节点列名

SELECT	'Return Value' = @return_value

GO
时间: 2024-12-26 21:19:27

sql server 树状结构表中,获取指定节点的所有父节点路径的相关文章

树状结构 求和-sql 按树状结构 分组求和 父节点包括所有字节点的值

问题描述 sql 按树状结构 分组求和 父节点包括所有字节点的值 有一个表存树状结构: 值 上级节点 所属级数 001 * 1 00101 001 2 00102 001 2 0010203 00102 3 ... 00103 001 2 ... 在其他表中存储对应的数据,有[金额]和[数状表的字节点值]. 如: 100.00 / 0010203 现在想做出求和的效果如下 码值 合计 001 161 00101 61 0010101 50 0010101 11 00102 100 0010203

在SQL Server的try...catch语句中获取错误消息代码的的语句

本文为大家详细介绍下如何在SQL Server的try...catch语句中获取错误消息的代码,具体示例如下,感兴趣的朋友可以参考下哈,希望对大家有所帮助   复制代码 代码如下: BEGIN TRY ... ... END TRY BEGIN CATCH DECLARE @ErrorMessage NVARCHAR(4000); DECLARE @ErrorSeverity INT; DECLARE @ErrorState INT; SELECT @ErrorMessage = ERROR_M

SQL Server 2000 如何锁定表中的行,使其他线程读取该行时候发生sql异常,不能读取?

问题描述 SQL Server 2000 如何锁定表中的行,使其他线程读取该行时候发生sql异常,不能读取?以及锁定之后如何对该行数据进行释放? 解决方案 只能通过transaction和lock让别人读取这行的时候等待.如果真要做...高一点山寨也不是不行,不过非常恶心.首先,得在一个大transaction里面,我假设你的C#层已经做了transaction了,然后可以:DECLARE @exists INTSELECT @exists = 1 FROM myTable WITH (NOLO

Sql Server里删除数据表中重复记录的例子_MsSql

[项目] 数据库中users表,包含u_name,u_pwd两个字段,其中u_name存在重复项,现在要实现把重复的项删除! [分析] 1.生成一张临时表new_users,表结构与users表一样: 2.对users表按id做一个循环,每从users表中读出一个条记录,判断new_users中是否存在有相同的u_name,如果没有,则把它插入新表:如果已经有了相同的项,则忽略此条记录: 3.把users表改为其它的名称,把new_users表改名为users,实现我们的需要. [程序] 复制代

Sql Server里删除数据表中重复记录的例子

[项目] 数据库中users表,包含u_name,u_pwd两个字段,其中u_name存在重复项,现在要实现把重复的项删除! [分析] 1.生成一张临时表new_users,表结构与users表一样: 2.对users表按id做一个循环,每从users表中读出一个条记录,判断new_users中是否存在有相同的u_name,如果没有,则把它插入新表:如果已经有了相同的项,则忽略此条记录: 3.把users表改为其它的名称,把new_users表改名为users,实现我们的需要. [程序] 复制代

SQL Server批量替换所有表中内容sql语句

代码如下:  代码如下 复制代码 declare @t varchar(255),@c varchar(255) declare table_cursor cursor for select a.name,b.name from sysobjects a,syscolumns b ,systypes c where a.id=b.id and a.xtype='u' and c.name /*"u"为你要操作的数据类型,不改为全部数据类型,不想麻烦就不用修改了*/ in ('char'

Sql Server在建好的表中,新增一列

alter table 表名 add 列明 数据类型; 例子: alter tableMapping add XX nvarchar(50);

使用多中值排序基数实现大型树状结构

排序 使用多中值排序基数实现大型树状结构     在"中值排序基数法实现树状结构"中,为了解决回复限制的问题,我们可以增加第二(三.四--)基数字段.    其实在一般的BBS中,使用一个基数已经足够,因为一个贴子的回复太多或深度太大的时候,无论你的树状结构做得多好,由于屏幕的限制(显示折行),显示总会乱,因此不如象在<补充>一文中,达到一定深度或个数时,后面的贴子采用平行显示的方法,不过那部分已经不再是树状结构了.    原理:在贴子显示的order by子句中,如果排序

用中值排序基数法实现树状结构——让递归滚一边去

递归|排序 用中值排序基数法实现树状结构     在BBS的编写中,经常有人问怎样实现树状结构?一个比较不负责任的回答是:使用递归算法.当然,递归是一个可行的办法(二叉树的历遍也好象只能使用递归算法),但对于BBS来说,这样做势必要进行大量的Sql查询(虽然可以使用存储过程来做,但要从根本上加快速度,则应该考虑更快的算法).下面给出一个可行的彻底屏弃递的实现树状结构的算法.     下面给出另一种使用"使用中值排序基数法"实现树状结构:一.主要思想:增加一个排序基数字段ordernum