SAS to Microsoft Fabric Connectivity Diagrams¶
Third-party references — publicly sourced, good-faith comparison
This page references non-Microsoft products and services. That information is drawn from each vendor's publicly available documentation and is offered for honest, good-faith comparison only. This is a personal project written from a Microsoft Fabric and Azure perspective; it does not claim expertise in, or authority over, any third-party product, and nothing here is an official statement by, or endorsed by, those vendors. Capabilities, pricing, and features change often — always verify against the vendor's current official documentation. Where a third-party offering is the stronger choice, we say so plainly.
1. High-Level Connectivity Architecture¶
flowchart TB
subgraph SAS["🖥️ SAS Environment"]
SAS_BASE[SAS Base]
SAS_EG[SAS Enterprise Guide]
SAS_STUDIO[SAS Studio]
SAS_VIYA[SAS Viya]
end
subgraph Drivers["🔌 Connection Layer"]
ODBC[ODBC Driver 18+]
OLEDB[OLE DB Driver]
end
subgraph Auth["🔐 Authentication"]
ENTRA[Microsoft Entra ID]
INTERACTIVE[Interactive<br/>Browser Login]
SPN[Service Principal<br/>Client ID + Secret]
MSI[Managed Identity<br/>Azure-Hosted]
end
subgraph Fabric["☁️ Microsoft Fabric"]
LH_SQL[(Lakehouse<br/>SQL Endpoint<br/>Read-Only)]
WH[(Data Warehouse<br/>Read/Write)]
end
SAS_BASE --> ODBC
SAS_BASE --> OLEDB
SAS_EG --> ODBC
SAS_STUDIO --> ODBC
SAS_VIYA --> ODBC
ODBC --> ENTRA
OLEDB --> ENTRA
ENTRA --> INTERACTIVE
ENTRA --> SPN
ENTRA --> MSI
INTERACTIVE --> LH_SQL
INTERACTIVE --> WH
SPN --> LH_SQL
SPN --> WH
MSI --> LH_SQL
MSI --> WH
style SAS fill:#1d4ed8,color:#fff
style Auth fill:#059669,color:#fff
style Fabric fill:#7c3aed,color:#fff 2. Authentication Flow Diagrams¶
Interactive Authentication¶
sequenceDiagram
participant SAS as SAS Application
participant ODBC as ODBC Driver
participant Browser as Web Browser
participant Entra as Microsoft Entra ID
participant Fabric as Microsoft Fabric
SAS->>ODBC: LIBNAME with ActiveDirectoryInteractive
ODBC->>Browser: Open login.microsoftonline.com
Browser->>Entra: User enters credentials
Entra->>Entra: Validate + MFA (if required)
Entra->>Browser: Return authorization code
Browser->>ODBC: Pass auth code
ODBC->>Entra: Exchange for access token
Entra-->>ODBC: Access token
ODBC->>Fabric: Connect with token
Fabric-->>ODBC: Connection established
ODBC-->>SAS: LIBNAME assigned successfully
Note over SAS,Fabric: Connection ready for queries Service Principal Authentication¶
sequenceDiagram
participant SAS as SAS Batch Job
participant ENV as Environment
participant ODBC as ODBC Driver
participant Entra as Microsoft Entra ID
participant Fabric as Microsoft Fabric
SAS->>ENV: Read FABRIC_CLIENT_ID
ENV-->>SAS: Client ID
SAS->>ENV: Read FABRIC_CLIENT_SECRET
ENV-->>SAS: Client Secret
SAS->>ODBC: LIBNAME with credentials
ODBC->>Entra: Request token (client credentials flow)
Entra->>Entra: Validate client ID + secret
Entra-->>ODBC: Access token
ODBC->>Fabric: Connect with token
Fabric-->>ODBC: Connection established
ODBC-->>SAS: LIBNAME assigned
Note over SAS,Fabric: Automated job can now run 3. Data Flow Patterns¶
Read Pattern (Lakehouse → SAS)¶
flowchart LR
subgraph Fabric["Microsoft Fabric"]
GOLD[(Gold Layer<br/>Delta Tables)]
SQL_EP[SQL Analytics<br/>Endpoint]
end
subgraph Network["Network"]
TLS[TLS 1.2+<br/>Port 1433]
end
subgraph SAS["SAS Environment"]
LIBNAME[LIBNAME fabric ODBC]
DATASET[work.analysis]
PROC[PROC SQL /<br/>DATA Step]
end
GOLD --> SQL_EP
SQL_EP -->|Read-Only| TLS
TLS --> LIBNAME
LIBNAME --> PROC
PROC --> DATASET
style Fabric fill:#7c3aed,color:#fff
style SAS fill:#1d4ed8,color:#fff Write Pattern (SAS → Warehouse)¶
flowchart LR
subgraph SAS["SAS Environment"]
WORK[work.predictions]
LIBNAME[LIBNAME output ODBC]
end
subgraph Network["Network"]
TLS[TLS 1.2+<br/>Port 1433]
end
subgraph Fabric["Microsoft Fabric"]
WH[(Data Warehouse)]
TABLE[sas_output.table]
end
WORK --> LIBNAME
LIBNAME -->|Bulk Insert| TLS
TLS --> WH
WH --> TABLE
style Fabric fill:#7c3aed,color:#fff
style SAS fill:#1d4ed8,color:#fff 4. Casino Analytics Workflow¶
flowchart TB
subgraph Fabric["Microsoft Fabric Data Platform"]
BRONZE[(Bronze<br/>Raw Data)]
SILVER[(Silver<br/>Cleansed)]
GOLD[(Gold<br/>Analytics)]
WH[(Warehouse<br/>SAS Output)]
end
subgraph SAS["SAS Analytics"]
READ[1. Read Gold Data<br/>LIBNAME ODBC]
FEATURE[2. Feature Engineering<br/>DATA Step]
MODEL[3. Build Model<br/>PROC LOGISTIC]
SCORE[4. Score Players<br/>PROC LOGISTIC SCORE]
WRITE[5. Write Results<br/>DATA output.table]
end
subgraph Reports["Outputs"]
PRED[Churn<br/>Predictions]
CTR[CTR<br/>Report]
SAR[SAR<br/>Candidates]
end
BRONZE --> SILVER --> GOLD
GOLD -->|ODBC Read| READ
READ --> FEATURE --> MODEL --> SCORE --> WRITE
WRITE -->|ODBC Write| WH
WH --> PRED
WH --> CTR
WH --> SAR
style Fabric fill:#7c3aed,color:#fff
style SAS fill:#1d4ed8,color:#fff
style Reports fill:#059669,color:#fff 5. LIBNAME Configuration Matrix¶
flowchart TD
START([Need Fabric<br/>Connection]) --> Q1{Read or<br/>Write?}
Q1 -->|Read Only| LAKEHOUSE[Use Lakehouse<br/>SQL Endpoint]
Q1 -->|Read/Write| WAREHOUSE[Use Data<br/>Warehouse]
LAKEHOUSE --> Q2{Interactive<br/>or Batch?}
WAREHOUSE --> Q2
Q2 -->|Interactive| INTERACTIVE[ActiveDirectory<br/>Interactive]
Q2 -->|Batch Job| SERVICE_PRINCIPAL[ActiveDirectory<br/>ServicePrincipal]
INTERACTIVE --> CONFIG1[LIBNAME fabric ODBC<br/>DSN='Fabric_LH'<br/>Auth=Interactive]
SERVICE_PRINCIPAL --> CONFIG2[LIBNAME fabric ODBC<br/>NOPROMPT=...<br/>Auth=ServicePrincipal]
CONFIG1 --> CONNECT([Connection<br/>Established])
CONFIG2 --> CONNECT
style LAKEHOUSE fill:#10b981,color:#fff
style WAREHOUSE fill:#3b82f6,color:#fff
style CONNECT fill:#22c55e,color:#fff 6. Pass-Through SQL Decision¶
flowchart TD
START([SAS Query]) --> Q1{Simple<br/>SELECT?}
Q1 -->|Yes| Q2{Filters<br/>Applied?}
Q1 -->|No| PASSTHROUGH[Use Pass-Through<br/>SQL]
Q2 -->|SAS WHERE| IMPLICIT[Implicit<br/>Pass-Through<br/>May Work]
Q2 -->|No Filters| DIRECT[Direct<br/>Table Read]
IMPLICIT --> CHECK{Check<br/>SASTRACE}
CHECK -->|Optimized| OK([Good<br/>Performance])
CHECK -->|Not Optimized| PASSTHROUGH
PASSTHROUGH --> EXPLICIT[PROC SQL<br/>CONNECT USING<br/>CONNECTION TO]
EXPLICIT --> OK
DIRECT --> OK
style PASSTHROUGH fill:#f59e0b,color:#fff
style OK fill:#22c55e,color:#fff 7. Troubleshooting Flowchart¶
flowchart TD
ERROR([Connection<br/>Error]) --> E1{Driver<br/>Found?}
E1 -->|No| FIX1[Install ODBC<br/>Driver 18+]
E1 -->|Yes| E2{DSN<br/>Configured?}
E2 -->|No| FIX2[Create DSN in<br/>ODBC Administrator]
E2 -->|Yes| E3{Network<br/>Access?}
E3 -->|No| FIX3[Open Port 1433<br/>Check Firewall]
E3 -->|Yes| E4{Auth<br/>Failed?}
E4 -->|Yes| FIX4[Verify Credentials<br/>Check Workspace Access]
E4 -->|No| E5{Database<br/>Found?}
E5 -->|No| FIX5[Verify Database Name<br/>Case Sensitive]
E5 -->|Yes| E6{Permission<br/>Denied?}
E6 -->|Write Error| FIX6[Use Warehouse<br/>Not Lakehouse]
E6 -->|Read Error| FIX7[Check Schema Name<br/>Grant SELECT]
FIX1 --> RETRY([Retry<br/>Connection])
FIX2 --> RETRY
FIX3 --> RETRY
FIX4 --> RETRY
FIX5 --> RETRY
FIX6 --> RETRY
FIX7 --> RETRY
style ERROR fill:#ef4444,color:#fff
style RETRY fill:#22c55e,color:#fff 8. Performance Optimization¶
flowchart LR
subgraph Slow["❌ Slow Pattern"]
S1[Read All Rows]
S2[Filter in SAS]
S3[Process Subset]
end
subgraph Fast["✅ Fast Pattern"]
F1[Pass-Through SQL<br/>with WHERE]
F2[Read Subset Only]
F3[Process in SAS]
end
S1 --> S2 --> S3
F1 --> F2 --> F3
style Slow fill:#ef4444,color:#fff
style Fast fill:#22c55e,color:#fff Performance Settings¶
┌─────────────────────────────────────────────────────────────┐
│ SAS LIBNAME Performance Options │
├─────────────────────┬───────────────────────────────────────┤
│ Option │ Recommendation │
├─────────────────────┼───────────────────────────────────────┤
│ READBUFF= │ 10000-50000 (rows per fetch) │
│ INSERTBUFF= │ 10000 (rows per insert batch) │
│ DBCOMMIT= │ 0 (commit after all rows) │
│ BULKLOAD= │ YES (enable bulk operations) │
│ DIRECT_SQL= │ ALLOW (enable pass-through) │
│ PRESERVE_COL_NAMES= │ YES (keep original names) │
│ PRESERVE_TAB_NAMES= │ YES (keep original names) │
└─────────────────────┴───────────────────────────────────────┘
9. Security Architecture¶
flowchart TB
subgraph OnPrem["On-Premises"]
SAS[SAS Server]
ENV[Environment<br/>Variables]
KV[Credential<br/>Store]
end
subgraph Azure["Azure"]
ENTRA[Microsoft<br/>Entra ID]
FABRIC[Microsoft<br/>Fabric]
RBAC[Workspace<br/>RBAC]
end
subgraph Security["Security Controls"]
TLS[TLS 1.2+<br/>Encryption]
AUDIT[Entra ID<br/>Audit Logs]
ROTATE[Secret<br/>Rotation]
end
SAS --> ENV
ENV --> KV
KV -->|Credentials| TLS
TLS --> ENTRA
ENTRA --> RBAC
RBAC --> FABRIC
ENTRA --> AUDIT
KV --> ROTATE
style Security fill:#059669,color:#fff 10. Complete Integration Example¶
sequenceDiagram
participant Scheduler as Job Scheduler
participant SAS as SAS Server
participant Fabric as Microsoft Fabric
participant Users as Business Users
Note over Scheduler,Users: Daily Analytics Pipeline
Scheduler->>SAS: Trigger nightly job
SAS->>SAS: Load environment credentials
SAS->>Fabric: Connect via Service Principal
SAS->>Fabric: Read Gold player data
Fabric-->>SAS: Return 100K player records
SAS->>SAS: Feature engineering
SAS->>SAS: Apply churn model
SAS->>SAS: Generate predictions
SAS->>Fabric: Write to Warehouse
Note over Fabric: sas_output.churn_predictions
SAS->>SAS: Generate CTR report
SAS->>Fabric: Write compliance data
SAS->>SAS: Disconnect
Fabric->>Users: Refresh Power BI reports
Users->>Users: Review analytics
Note over Scheduler,Users: Pipeline complete