2010-03-21 2 views
1

У меня есть таблица в SQL Server 2005.Как показывают иерархические данные в DropDownList

alt text http://www.techpint.com/sites/default/files/images/table.JPG

Я хочу, чтобы показать все доменное имя в DropDownList сохранением ту же иерархию. т.е.

Закон
Engineering
--civil
--Механические
Медицинский
--Dental
---- Полость
--MBBS

мне нужно добавить «-» в соответствии с уровнем домена. Можно ли использовать sql-запрос. или, альтернативно, я могу использовать любой другой элемент управления для отображения этих данных.

ответ

2

В SQL Server 2005 и выше, вы можете использовать рекурсивный КТР (пример основанный на this article):

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; 
+0

@Cade Roux: Спасибо за запрос. Не могли бы вы дать мне знать, какова роль SortCol здесь. –

+1

@vaibhav Посмотрите на него без ORDER BY. Без ORDER BY вам не гарантируется какой-либо конкретный порядок. Если вы добавите SortCol в SELECT, вы увидите, что он делает. Он просто использует шестнадцатеричное представление с фиксированной шириной, чтобы сделать сортировку правильной. Если бы вы не заполняли конкатенированные числа вообще (скажем, в десятичной форме, с простой конкатенацией), 1,21 - 121 и 12,1 - 121, и, разумеется, сортировка была бы беспорядочной. –

1

1), необходимо написать запрос, чтобы выбрать все узлы, с его уровнем (имя, уровень) 2) преобразование уровня ряда «-» и сцепить с именем строкой

запроса (я знаю о с), чтобы выбрать DomainId, уровень

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 (уровень) и вернуть NVARCHAR «-» * уровень и объединить оба запроса, чтобы получить результат вы хотите

+0

@Nagg: Что такое уровень? Вы можете написать запрос. –

+0

возьмите запрос, но он может содержать некоторые ошибки :) – Nagg

0

вы также можете написать его в коде

код 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, ""); 

regardes

Джеймс Лин ([email protected])

Смежные вопросы