.net 如何在dropdownlist中显示层次结构数据
我在SQLServer2005中有一个表 我想在一个维护相同层次结构的dropdownlist中显示所有域名。i、 e 法律.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
工程
--民用
--机械式
医学
--牙科
----空腔
--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;