Skip to content
Back to Blog
1 min read

Azure SQL Edge for IoT and Edge Computing

I wrote “Azure SQL Edge for IoT and Edge Computing” to share practical, production-minded guidance on this topic.

What is Azure SQL Edge?

Azure SQL Edge is a containerized SQL database engine optimized for IoT and edge deployments. It includes:

  • Full SQL Server engine capabilities
  • Built-in streaming analytics
  • Time-series optimizations
  • Machine learning inference with ONNX
  • Small container footprint

Deploying Azure SQL Edge

Using Docker

# Pull the Azure SQL Edge image
docker pull mcr.microsoft.com/azure-sql-edge:latest

# Run the container
docker run -d \
    --name sql-edge \
    -e 'ACCEPT_EULA=Y' \
    -e 'MSSQL_SA_PASSWORD=YourStrong!Passw0rd' \
    -e 'MSSQL_PID=Premium' \
    -p 1433:1433 \
    mcr.microsoft.com/azure-sql-edge:latest

# For ARM64 devices (like Raspberry Pi 4)
docker run -d \
    --name sql-edge-arm \
    -e 'ACCEPT_EULA=Y' \
    -e 'MSSQL_SA_PASSWORD=YourStrong!Passw0rd' \
    -p 1433:1433 \
    mcr.microsoft.com/azure-sql-edge:latest

Using Azure IoT Edge

{
    "modulesContent": {
        "$edgeAgent": {
            "properties.desired": {
                "modules": {
                    "AzureSQLEdge": {
                        "type": "docker",
                        "status": "running",
                        "restartPolicy": "always",
                        "settings": {
                            "image": "mcr.microsoft.com/azure-sql-edge:latest",
                            "createOptions": {
                                "HostConfig": {
                                    "PortBindings": {
                                        "1433/tcp": [{"HostPort": "1433"}]
                                    }
                                }
                            }
                        },
                        "env": {
                            "ACCEPT_EULA": {"value": "Y"},
                            "MSSQL_SA_PASSWORD": {"value": "YourStrong!Passw0rd"}
                        }
                    }
                }
            }
        }
    }
}

Built-in Streaming Analytics

-- Create an input stream from IoT Hub
CREATE EXTERNAL STREAM SensorInput
WITH (
    DATA_SOURCE = IoTHub,
    FILE_FORMAT = JsonFormat,
    LOCATION = N'sensors'
);

-- Create an output table for processed data
CREATE TABLE ProcessedReadings (
    SensorId INT,
    WindowStart DATETIME2,
    WindowEnd DATETIME2,
    AvgTemperature FLOAT,
    MaxTemperature FLOAT,
    ReadingCount INT
);

-- Create a streaming job
CREATE STREAMING JOB TempAggregation AS
SELECT
    SensorId,
    System.Timestamp() AS WindowEnd,
    DATEADD(minute, -5, System.Timestamp()) AS WindowStart,
    AVG(Temperature) AS AvgTemperature,
    MAX(Temperature) AS MaxTemperature,
    COUNT(*) AS ReadingCount
INTO ProcessedReadings
FROM SensorInput
TIMESTAMP BY EventTime
GROUP BY SensorId, TumblingWindow(minute, 5);

-- Start the streaming job
EXEC sys.sp_start_streaming_job @name = 'TempAggregation';

Time-Series Optimization

-- Create a table with time-series optimization
CREATE TABLE SensorData (
    SensorId INT NOT NULL,
    ReadingTime DATETIME2 NOT NULL,
    Temperature FLOAT,
    Humidity FLOAT,
    INDEX IX_SensorData_Time CLUSTERED COLUMNSTORE,
    INDEX IX_SensorData_Sensor NONCLUSTERED (SensorId, ReadingTime)
);

-- Use Date_Bucket for time-series aggregation
SELECT
    SensorId,
    Date_Bucket(minute, 15, ReadingTime) AS TimeBucket,
    AVG(Temperature) AS AvgTemp,
    AVG(Humidity) AS AvgHumidity
FROM SensorData
WHERE ReadingTime >= DATEADD(hour, -24, GETUTCDATE())
GROUP BY SensorId, Date_Bucket(minute, 15, ReadingTime);

Machine Learning with ONNX

-- Load an ONNX model
CREATE EXTERNAL MODEL AnomalyDetector
FROM 'https://storage.blob.core.windows.net/models/anomaly_detector.onnx'
WITH (RUNTIME = ONNX);

-- Create a prediction function
CREATE FUNCTION dbo.DetectAnomaly(@temperature FLOAT, @humidity FLOAT, @pressure FLOAT)
RETURNS TABLE
AS
RETURN (
    SELECT * FROM PREDICT(MODEL = AnomalyDetector, DATA =
        SELECT @temperature AS temperature,
               @humidity AS humidity,
               @pressure AS pressure
    ) WITH (anomaly_score FLOAT)
);

-- Use in queries
SELECT
    s.*,
    a.anomaly_score
FROM SensorData s
CROSS APPLY dbo.DetectAnomaly(s.Temperature, s.Humidity, s.Pressure) a
WHERE a.anomaly_score > 0.8;

Python Integration for Edge Processing

import pyodbc
import time
from datetime import datetime

class EdgeDataProcessor:
    def __init__(self):
        self.conn_str = (
            "Driver={ODBC Driver 18 for SQL Server};"
            "Server=localhost,1433;"
            "Database=EdgeDB;"
            "UID=sa;"
            "PWD=YourStrong!Passw0rd;"
            "TrustServerCertificate=yes;"
        )

    def insert_reading(self, sensor_id, temperature, humidity):
        """Insert a sensor reading"""
        with pyodbc.connect(self.conn_str) as conn:
            cursor = conn.cursor()
            cursor.execute("""
                INSERT INTO SensorData (SensorId, ReadingTime, Temperature, Humidity)
                VALUES (?, GETUTCDATE(), ?, ?)
            """, sensor_id, temperature, humidity)
            conn.commit()

    def get_anomalies(self, threshold=0.8):
        """Get recent anomalies"""
        with pyodbc.connect(self.conn_str) as conn:
            cursor = conn.cursor()
            cursor.execute("""
                SELECT SensorId, ReadingTime, Temperature, Humidity
                FROM SensorData s
                CROSS APPLY dbo.DetectAnomaly(s.Temperature, s.Humidity, 1.0) a
                WHERE a.anomaly_score > ?
                AND ReadingTime >= DATEADD(hour, -1, GETUTCDATE())
            """, threshold)
            return cursor.fetchall()

# Usage
processor = EdgeDataProcessor()
processor.insert_reading(1, 25.5, 60.0)
anomalies = processor.get_anomalies()

Data Synchronization with Cloud

-- Configure data retention for edge-to-cloud sync
ALTER DATABASE EdgeDB
SET DATA_RETENTION ON;

ALTER TABLE SensorData
SET (DATA_RETENTION_PERIOD = 7 DAYS);

-- Data older than 7 days is automatically cleaned up
-- after being synced to the cloud

Azure SQL Edge enables intelligent edge computing with the familiar SQL Server programming model.\n\n## Takeaways\n\nAdd a concise, personal takeaway and recommended next steps here.\n

Michael John Peña

Michael John Peña

Senior Data Engineer based in Sydney. Writing about data, cloud, and technology.