Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何在dropdownlist中显示层次结构数据_.net_Asp.net_Sql_Sql Server - Fatal编程技术网

.net 如何在dropdownlist中显示层次结构数据

.net 如何在dropdownlist中显示层次结构数据,.net,asp.net,sql,sql-server,.net,Asp.net,Sql,Sql Server,我在SQLServer2005中有一个表 我想在一个维护相同层次结构的dropdownlist中显示所有域名。i、 e 法律 工程 --民用 --机械式 医学 --牙科 ----空腔 --MBBS 我需要根据域级别追加“---”。是否可以使用sql查询。 或者,我可以使用任何其他控件来显示此数据。1)您需要编写一个查询,以选择其级别(名称、级别)的所有节点 2) 将级别转换为一个“-”数字,并用名称字符串连接 一个用于选择DomainID、Level的查询(我知道) CREATE PROCED

我在SQLServer2005中有一个表

我想在一个维护相同层次结构的dropdownlist中显示所有域名。i、 e

法律
工程
--民用
--机械式
医学
--牙科
----空腔
--MBBS

我需要根据域级别追加“---”。是否可以使用sql查询。 或者,我可以使用任何其他控件来显示此数据。

1)您需要编写一个查询,以选择其级别(名称、级别)的所有节点 2) 将级别转换为一个“-”数字,并用名称字符串连接

一个用于选择DomainID、Level的查询(我知道)

CREATE PROCEDURE [GetDomainTree]
(
@topDomainID int
) with encryption
AS
BEGIN
DECLARE @level int
DECLARE @count int

DECLARE @tempTable TABLE (DomainID int, [Level] int)

INSERT INTO @tempTable
(DomainID, [Level])
VALUES
(@topDomainID, 0)
SET @count = 1
SET @level = 0
WHILE @count > 0
 BEGIN
  INSERT INTO @tempTable
  (DomainID, [Level] )
  (
   SELECT DomainsRealTable.DomainID,
       @level + 1,
     @topDomainID
   FROM  @tempTable domains, DomainsRealTable
   WHERE domains.[Level] = @level
      AND DomainsRealTable.ParentDomainID = domains.DomainID
  )
  SELECT @count = COUNT(*)
  FROM   @tempTable
  WHERE  [Level] = @level + 1
  SET @level = @level + 1
 END
SELECT *
FROM   @tempTable
ORDER BY [Level]
END

现在,您可以编写一个sql函数,该函数将接受int参数(level)并返回nvarchar'-'*level,然后组合两个查询以获得所需的结果

您还可以用代码编写它

psudo代码,你明白了吗

function createlist(parent_id, indent) { if parent_id is null { select children_name, children_id from table where parent is null } else { indent += "--"; select children_name, children_id from table where parent = parent_id } foreach result { write option value="children_id" +indent+children_name+ /option createlist(children_id, indent) } } createlist(null, ""); 函数createlist(父项id,缩进) { 如果父项id为空 { 从父项为空的表中选择子项名称、子项id } 其他的 { 缩进+=“--”; 从parent=parent\u id的表中选择children\u name、children\u id } 每个结果 { 写入选项value=“children\u id”+缩进+children\u name+/option createlist(子项id,缩进) } } createlist(空,“”); 富豪


林书豪(guanfenglin@gmail.com)

在SQL Server 2005及更高版本中,可以使用递归CTE(示例基于):


@纳格:什么是水平?你能写一个查询吗?接受一个查询,但它可能包含一些错误:)@Cade Roux:谢谢你的查询,你能告诉我SortCol在这里的角色是什么吗。@vaibhav在没有订单的情况下查看一下。如果没有订单,您将无法保证任何特定订单。如果将SortCol添加到SELECT,您可以看到它在做什么。它只是使用一个固定宽度的十六进制表示来正确排序。如果你根本没有填充连接的数字(比如,在十进制形式中,使用简单的连接),1,21将是121,12,1将是121,不用说,排序将是一团混乱。
DECLARE @t AS TABLE (domainid INT NOT NULL, domainname VARCHAR(25) NOT NULL, parentdomainid INT NULL);
INSERT INTO @t VALUES (1, 'Law', NULL);
INSERT INTO @t VALUES (3, 'Engineering', NULL);
INSERT INTO @t VALUES (4, 'Medical', NULL);
INSERT INTO @t VALUES (6, 'Civil', 3);
INSERT INTO @t VALUES (7, 'Mechanical', 3);
INSERT INTO @t VALUES (8, 'Dental', 4);
INSERT INTO @t VALUES (9, 'MBBS', 4);
INSERT INTO @t VALUES (12, 'Cavity', 8);

-- SELECT * FROM @t;

WITH CTE(domainid, parentdomainid, domainname, Depth, SortCol)
            AS
            (
              SELECT domainid, parentdomainid, domainname, 0, CAST(domainid AS varbinary(max))
              FROM @t
              WHERE parentdomainid IS NULL
              UNION ALL
              SELECT d.domainid, d.parentdomainid, d.domainname, p.Depth + 1,
                        CAST(SortCol + CAST(d.domainid AS binary(4)) AS varbinary(max))
              FROM @t AS d
                        JOIN CTE AS p
                          ON d.parentdomainid = p.domainid
            )
            SELECT domainid, parentdomainid, domainname, Depth, REPLICATE('--', Depth) + domainname as displayname
            FROM CTE
            ORDER BY SortCol;