Microsoft Docs > SQL Server > Transact-SQL

T-SQL Syntax: Node Data Types

This document details the T-SQL data types related to representing hierarchical or graph-like data structures, commonly referred to as "Node Data Types" in certain contexts, although SQL Server primarily uses built-in types that can be adapted for this purpose.

Understanding Node Data Concepts in SQL Server

SQL Server does not have a distinct built-in "Node" data type. Instead, the representation of hierarchical or graph data is typically achieved through a combination of existing data types and specific modeling techniques.

Common Modeling Techniques

Relevant Data Types for Node Representation

When implementing these models, the following data types are frequently used:

Data Type Description Use Case
INT, BIGINT Integer types for unique identifiers (primary keys) and foreign keys to link nodes. Primary keys, foreign keys for parent/child relationships.
UNIQUEIDENTIFIER Globally unique identifiers. Alternative to integer primary keys, especially in distributed systems.
VARCHAR, NVARCHAR String types for node names, labels, or descriptive attributes. Node names, descriptions, tags.
XML Stores XML data, which can represent hierarchical structures natively. Complex hierarchical data, configuration.
HIERARCHYID (Deprecated in favor of modeling) A specialized data type for representing hierarchical data. While still supported, it's often recommended to use relational models. Historically used for hierarchical queries.

Example: Adjacency List Model

Consider a table representing employees in an organization, where each employee has a manager:

CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    EmployeeName VARCHAR(100) NOT NULL,
    ManagerID INT NULL, -- NULL for the top-level manager
    FOREIGN KEY (ManagerID) REFERENCES Employees(EmployeeID)
);

INSERT INTO Employees (EmployeeID, EmployeeName, ManagerID) VALUES
(1, 'CEO', NULL),
(2, 'VP Engineering', 1),
(3, 'VP Sales', 1),
(4, 'Lead Developer', 2),
(5, 'Developer', 4),
(6, 'Sales Manager', 3);

Querying Hierarchical Data (Recursive CTE)

You can traverse this hierarchy using Common Table Expressions (CTEs):

WITH EmployeeHierarchy AS (
    -- Anchor member: Select the top-level employee
    SELECT
        EmployeeID,
        EmployeeName,
        ManagerID,
        0 AS Level
    FROM Employees
    WHERE ManagerID IS NULL

    UNION ALL

    -- Recursive member: Join to find subordinates
    SELECT
        e.EmployeeID,
        e.EmployeeName,
        e.ManagerID,
        eh.Level + 1
    FROM Employees e
    INNER JOIN EmployeeHierarchy eh ON e.ManagerID = eh.EmployeeID
)
SELECT *
FROM EmployeeHierarchy
ORDER BY Level, EmployeeID;
Note: The HIERARCHYID data type, though powerful for its intended purpose, can sometimes be less flexible than relational models when integrating with other parts of a relational database. Modern SQL Server development often favors relational modeling with CTEs or graph database extensions when extreme scalability or complex graph traversals are needed.

Related Topics