Moin,
was ich nicht so ganz verstehe ist der Zugriff. Warum über
SQL Query Analyzer?
Naja, ich habe mal eine Prozedur auf dem Server angelegt...
SQL-Code:
CREATE PROCEDURE [LoadTree] (@Aparent INTEGER = NULL, @Aebene INTEGER = 0) AS
SET NOCOUNT ON
DECLARE @id INTEGER
DECLARE @bez VARCHAR(100)
DECLARE @zeilen CURSOR
DECLARE @ebene INTEGER
SET @ebene = @Aebene
IF @Aebene = 0 BEGIN
CREATE TABLE ##temp (ID INTEGER, bez VARCHAR(100))
END
IF @Aparent IS NULL BEGIN
SET @zeilen = CURSOR FOR
SELECT id, bezeichnung
FROM tabelle
WHERE parent_id IS NULL
ORDER BY parent_id, bezeichnung
END
ELSE BEGIN
SET @zeilen = CURSOR FOR
SELECT id, bezeichnung
FROM tabelle
WHERE parent_id = @Aparent
ORDER BY parent_id, bezeichnung
END
OPEN @zeilen
FETCH NEXT FROM @zeilen INTO @id, @bez
WHILE @@FETCH_STATUS = 0 BEGIN
INSERT ##temp VALUES (@id, @bez)
SET @ebene = @ebene + 1
EXEC loadtree @id, @ebene
FETCH NEXT FROM @zeilen INTO @id, @bez
END
CLOSE @zeilen
DEALLOCATE @zeilen
IF @Aebene = 0 BEGIN
SELECT *
FROM ##temp
DROP TABLE ##temp
END
SET NOCOUNT OFF
Aufruf im
SQL Query Analyzer:
EXEC LoadTree
oder wenn ein Unterbaum geladen werden soll...
EXEC LoadTree 1
1 steht hier für: zeige alle Elemente die die ParentID = 1 haben und deren Unterelemente.
In Delphi würde das folgendermaßen aussehen (Zugriff über DBExpress)...
Delphi-Quellcode:
procedure TForm.LoadTree(ATree: TTreeView;
ASQLConnection:TCRSQLConnection;
ANode:TTreeNode;
AStream:TMemoryStream;
AID: integer);
var SDS:TSimpleDataSet;
Stream:TMemoryStream;
begin
Stream:=nil;
try
if not assigned(AStream) then
Stream:=TMemoryStream.Create
else
Stream:=AStream;
SDS:=TSimpleDataSet.Create(Self);
try
SDS.Connection:=ASQLConnection;
SDS.DataSet.CommandText:=
'SELECT *'#13 +
'FROM tabelle'#13 +
'ORDER BY parent_id, bezeichnung';
if not assigned(AStream) then
SDS.SaveToStream(Stream, dfXMLUTF8);
SDS.LoadFromStream(Stream);
SDS.Filtered:=false;
if AID >= 0 then
SDS.Filter:='parent_id = '+inttostr(AID)
else
SDS.Filter:='parent_id IS NULL';
SDS.Filtered:=true;
SDS.First;
while not SDS.Eof do begin
LoadTree(
ATree,
ASQLConnection,
ATree.Items.AddChild(ANode, SDS.FieldByName('bezeichnung').AsString),
Stream,
SDS.FieldByName('id').AsInteger
);
SDS.Next;
end;
finally
SDS.free;
end;
finally
if not assigned(AStream) and assigned(Stream) then
Stream.free;
end;
end;
Aufruf:
LoadTree(TreeView, SQLConnection);
MfG
Thorsten