2013-04-19 15 views
6

Ví dụ về dữ liệu:Sql Stored Procedure trong khi vòng lặp

ID Name  ParentID 
1 parent-1 NULL 
2 parent-2 NULL 
3 sub  1 
4 child-1-1 3 
5 child-1-2 1 
6 child-2-1 2 

Bây giờ Nếu tôi tìm kiếm danh như '% trẻ em 1%', tôi muốn các hồ sơ sau: Row-1, Row-3, Row -4 và hàng-5 trong dữ liệu trên. Tôi có thể viết loại nào nếu thủ tục lưu sẵn có thể trả lại cho tôi hàng không rõ ràng?

Ý tưởng của tôi là Nếu tôi tìm kiếm văn bản, nó sẽ tiếp tục chọn các bản ghi từ bảng cho đến khi parentID rỗng. Vì vậy, nếu tôi thực hiện tìm kiếm giống như 'child-1', truy vấn sql cơ bản sẽ trả về Row-4 và Row-5. Nhưng thủ tục của tôi shud kiểm tra trong một vòng lặp mà Row-4 có parentid mà không phải là null, do đó, nó được một hàng với ID = parentid của hàng-4 đó là 3. Bây giờ nó được một hàng với ID = parentid của hàng-3 mà là 1 và nhận hàng-1. Bây giờ parentd của hàng-1 là NULL nên nó dừng lại.

Tôi đang sử dụng quy trình được lưu trữ này để triển khai chức năng tìm kiếm trong chế độ xem dạng cây mà tôi muốn giữ thứ bậc cha-con sau khi tìm kiếm.

cho đến nay tôi đã cố gắng này, nhưng tôi mới để làm thủ tục lưu trữ:

USE DBname 
Go 
DECLARE @ParentID int 
Declare @myresultset Cursor 
Set @myresultset = CURSOR for Select ParentID from mytable where Name like 'child-1%' 
OPEN @myresultset 
Fetch NEXT from @myresultset 
into @ParentID 
While @@Fetch_Status=0 
Begin 
While @ParentID is not NULL 
    Begin 
    Select @ParentID = ParentID from mytable where [email protected] 
    Select distinct * from mytable where [email protected] 
    End 
Fetch Next from @myresultset 
into @ParentID 
End 
close @myresultset 

Trả lời

4

Thay vì mã hóa này sử dụng mã thủ tục, tôi recoded sử dụng theo định hướng thiết lập SQL này. Tôi đang sử dụng CTE đệ quy để tìm "cha mẹ" của những đứa trẻ đã cho. Đây là thủ tục lưu trữ của tôi:

CREATE PROC find_parents (@childname varchar(20)) as 

;WITH heirarchy_cte (ID, Name, ParentID, Level) as 
(SELECT e.ID, e.Name, e.ParentID, 0 as Level 
    FROM mytable as e 
    where e.Name like @childname 
UNION ALL 
SELECT e.ID, e.Name, e.ParentID, Level+1 
    FROM mytable as e 
    INNER JOIN heirarchy_cte as h 
    ON h.ParentID=e.ID 
    ) 
SELECT DISTINCT ID, Name, ParentID 
FROM heirarchy_cte 
ORDER BY ID 

sau đó tôi chạy nó với:

exec find_parents @childname='child-1%' 

Nếu kết quả của tôi là chính xác, sau đó giải pháp này nên quy mô tốt hơn cho một số lượng lớn dữ liệu. Tôi cũng mã hóa nó như là một thủ tục lưu trữ như bạn đã chỉ ra.

Để xem mã đầy đủ, vui lòng xem Fiddle SQL tại địa chỉ: Find Parents SQL Fiddle Demo

Nếu giải pháp của tôi là đúng, hãy đánh dấu nó như là câu trả lời. Cảm ơn.

+0

Cảm ơn Michael Harmon..Thanks cho mã. Nó hoạt động hoàn hảo. Cảm ơn một lần nữa vì sự giúp đỡ. – user2272865

0

Hãy thử ví dụ đơn giản này

CREATE PROCEDURE proc (
    IN i INTEGER, 
    IN j INTEGER) 
BEGIN 
    DECLARE z integer; 
    set z=i; 
    while (z<j) do 
    begin 
     set z=z+1; 
    end; 
    end while; 
END;