Is there a tool that works with SQL Server to generate tree-like diagrams from a hierachical data model?
I am working with a large geographical hierarchy, and would like to visualize it.
Here is an example.
I have a NodeHierarchy table that stores a hierarchical relationship among nodes. Each row in the table represents a node. Each node but one has a parent node. The node that has no parent is the root if the hierarchy.
Here is how I create my table:
CREATE DATABASE HierarchyTest;
GO
USE HierarchyTest;
GO
CREATE TABLE NodeHierarchy (
PK_NodeID INT NOT NULL
CONSTRAINT PK_NodeHierarchy PRIMARY KEY,
FK_ParentNodeID INT NULL
CONSTRAINT FK_NodeHierarchy_NodeHierarchy FOREIGN KEY
REFERENCES NodeHierarchy(PK_NodeID),
Name NVARCHAR(255) NOT NULL
);
I have an example hierachy of Scottish cities and venues. Scotland is the root of the hierachy. The descendants of Scotland are cities and venues. In this hiearchy, a parent ‘contains’ a child, so we say that e.g. “The Barrowlands is in Glasgow, and Glasgow is in Scotland”.
This statement populates the NodeHierachy table with eample data:
INSERT INTO NodeHierarchy(PK_NodeID, FK_ParentNodeID, Name)
VALUES
(1, NULL, N'Scotland'),
(2, 1, N'Glasgow'),
(3, 1, N'Edinburgh'),
(4, 1, N'St Andrews'),
(5, 2, N'The Barrowlands'),
(6, 2, N'The Cathouse'),
(7, 2, N'Carling Academy'),
(8, 2, N'SECC'),
(9, 2, N'King Tut''s Wah-Wah Hut'),
(10, 3, N'Henry''s Cellar Bar'),
(11, 3, N'The Bongo Club'),
(12, 3, N'Sneaky Pete''s'),
(13, 3, N'The Picture House'),
(14, 3, N'Potterrow'),
(15, 4, N'Aikman''s'),
(16, 4, N'The Union'),
(17, 4, N'Castle Sands');
Output of SELECT * FROM NodeHierarchy;:
PK_NodeID FK_ParentNodeID Name
----------- --------------- ---------------------------------
1 NULL Scotland
2 1 Glasgow
3 1 Edinburgh
4 1 St Andrews
5 2 The Barrowlands
6 2 The Cathouse
7 2 Carling Academy
8 2 SECC
9 2 King Tut's Wah-Wah Hut
10 3 Henry's Cellar Bar
11 3 The Bongo Club
12 3 Sneaky Pete's
13 3 The Picture House
14 3 Potterrow
15 4 Aikman's
16 4 The Union
17 4 Castle Sands
(17 row(s) affected)
In Freemind I drew this equivalent diagram:

What tool can do this for me with a minimum of manual effort?
EDIT: Originally I said that I wanted to visualize “all or part” of the hierarchy. The solution posted here visualizes the entire hierarchy unconditionally. This is fine for the small example hierarchy, but for a larger one, it may be more useful to visualize only part of it.
Because I didn’t specify what I meant by “part”, I have removed this from the question. I have asked about partial visualization in another question.
I researched the leads in Cade Roux’s answer and developed a solution using GraphViz.
To understand GraphViz, first I read this introductory article and the Command-line Invocation documentation. After successfully generating graphs from the example code listing in the article, I felt confident to work with my own data.
As Cade suggested, the best way to learn GraphViz’s DOT language is to write it out myself. I studied the article’s examples (Listings 1, 2, and 6) and then came up with this
venues.gvto describe my own data:I fed this to
circo, just one of the many graph-drawing commands that are part of GraphViz, and got pleasing output:Output of
circo -Tpng venues.gv -o venues.png:The GraphViz file is structured in two blocks. One block declares a label for each node, and the other block declares the edges of the graph.
To provide the data for each of these blocks, I created a view of
NodeHierarchy.This view provides the data to declare labels for nodes:
This view provides the data to declare edges between nodes:
This Powershell script called
generate-graph.ps1selects the data from the views, transforms it into a GraphViz input, and pipes it tocircoto produce a visualization of the full hierarchy like the one above:The script must be run in
sqlpsinstead ofpowershellso that theInvoke-Sqlcmdcmdlet is available. The default working directory ofsqlpsisSQLSERVER, so I have to specify the drive when I run the script throughsqlps.This is the command I use to generate a graph like the one above:
This outputs a file called
venues.pngin the C working directory.This Powershell solution feels a little inelegant, but this does what I need it to do. A more experienced Powershell programmer might be able to come up with something cleaner.