Telemetry — MANDATORY. Every api.fabric.microsoft.com call must carry
x-ms-fabric-skill: sqldw-authoring-cli (az rest: --headers "x-ms-fabric-skill=sqldw-authoring-cli"),
including every LRO poll, fabric_lro and retry. Snippets omit it — add it anyway.
Update Check — ONCE PER SESSION (mandatory)
The first time this skill is used in a session, run the check-updates skill before proceeding.
- GitHub Copilot CLI / VS Code: invoke the
check-updates skill.
- Claude Code / Cowork / Cursor / Windsurf / Codex: compare local vs remote package.json version.
- Skip if the check was already performed earlier in this session.
CRITICAL NOTES
- To find the workspace details (including its ID) from workspace name: list all workspaces and, then, use JMESPath filtering
- To find the item details (including its ID) from workspace ID, item type, and item name: list all items of that type in that workspace and, then, use JMESPath filtering
SQL Endpoint Authoring — CLI Skill
⚠️ SQL Execution Override: For SQL data-plane execution, this skill supersedes COMMON-CLI SQL/TDS guidance. Use MCP fabric-sqlendpoint-execute_query (see Tool Stack) unless explicitly using Legacy CLI Fallback.
Table of Contents
| Task |
Reference |
Notes |
| Finding Workspaces and Items in Fabric |
COMMON-CLI.md § Finding Workspaces and Items in Fabric |
Mandatory — READ link first [needed for finding workspace id by its name or item id by its name, item type, and workspace id] |
| Fabric Topology & Key Concepts |
COMMON-CORE.md § Fabric Topology & Key Concepts |
|
| Environment URLs |
COMMON-CORE.md § Environment URLs |
|
| Authentication & Token Acquisition |
COMMON-CORE.md § Authentication & Token Acquisition |
Wrong audience = 401; read before any auth issue |
| Core Control-Plane REST APIs |
COMMON-CORE.md § Core Control-Plane REST APIs |
Includes pagination, LRO polling, and rate-limiting patterns |
| OneLake Data Access |
COMMON-CORE.md § OneLake Data Access |
Requires storage.azure.com token, not Fabric token |
| Definition Envelope |
ITEM-DEFINITIONS-CORE.md § Definition Envelope |
Definition payload structure |
| Per-Item-Type Definitions |
ITEM-DEFINITIONS-CORE.md § Per-Item-Type Definitions |
Support matrix, decoded content, part paths — REST specs, CLI recipes |
| Job Execution |
COMMON-CORE.md § Job Execution |
|
| Capacity Management |
COMMON-CORE.md § Capacity Management |
|
| Gotchas, Best Practices & Troubleshooting (Platform) |
COMMON-CORE.md § Gotchas, Best Practices & Troubleshooting |
|
| Tool Selection Rationale |
COMMON-CLI.md § Tool Selection Rationale |
|
| Authentication Recipes |
COMMON-CLI.md § Authentication Recipes |
az login flows and token acquisition |
Fabric Control-Plane API via az rest |
COMMON-CLI.md § Fabric Control-Plane API via az rest |
Always pass --resource; includes pagination and LRO helpers |
OneLake Data Access via curl |
COMMON-CLI.md § OneLake Data Access via curl |
Use curl not az rest (different token audience) |
| SQL / TDS Data-Plane Access |
COMMON-CLI.md § SQL / TDS Data-Plane Access |
Legacy sqlcmd reference (MCP is primary — see Tool Stack) |
| Job Execution (CLI) |
COMMON-CLI.md § Job Execution |
|
| OneLake Shortcuts |
COMMON-CLI.md § OneLake Shortcuts |
|
| Capacity Management (CLI) |
COMMON-CLI.md § Capacity Management |
|
| Composite Recipes |
COMMON-CLI.md § Composite Recipes |
|
| Gotchas & Troubleshooting (CLI-Specific) |
COMMON-CLI.md § Gotchas & Troubleshooting (CLI-Specific) |
az rest audience, shell escaping, token expiry |
| Quick Reference |
COMMON-CLI.md § Quick Reference |
az rest template + token audience/tool matrix |
| Item-Type Capability Matrix |
SQLDW-CONSUMPTION-CORE.md § Item-Type Capability Matrix |
Shows read-only (SQLEP) vs read-write (DW) |
| Connection Fundamentals |
SQLDW-CONSUMPTION-CORE.md § Connection Fundamentals |
TDS, port 1433, Entra-only, no MARS |
| Supported T-SQL Surface Area (Consumption Focus) |
SQLDW-CONSUMPTION-CORE.md § Supported T-SQL Surface Area |
Read before writing T-SQL — includes data types (no nvarchar/datetime/money) |
| Read-Side Objects You Can Create |
SQLDW-CONSUMPTION-CORE.md § Read-Side Objects You Can Create |
Views, TVFs, scalar UDFs, procedures |
| Temporary Tables |
SQLDW-CONSUMPTION-CORE.md § Temporary Tables |
|
| Cross-Database Queries |
SQLDW-CONSUMPTION-CORE.md § Cross-Database Queries |
3-part naming, same workspace only |
| Security for Consumption |
SQLDW-CONSUMPTION-CORE.md § Security for Consumption |
GRANT/DENY, RLS, CLS, DDM |
| Monitoring and Diagnostics |
SQLDW-CONSUMPTION-CORE.md § Monitoring and Diagnostics |
Includes query labels; DMVs (live) + queryinsights.* (30-day history) |
| Performance: Best Practices and Troubleshooting |
SQLDW-CONSUMPTION-CORE.md § Performance: Best Practices and Troubleshooting |
Statistics, caching, clustering, query tips |
| REST API: Refresh SQL Endpoint Metadata |
SQLDW-CONSUMPTION-CORE.md § REST API: Refresh SQL Endpoint Metadata |
Force metadata sync when SQLEP is stale after ETL |
| System Catalog Queries (Metadata Exploration) |
SQLDW-CONSUMPTION-CORE.md § System Catalog Queries |
sys.tables, sys.columns, sys.views, sys.stats |
| Common Consumption Patterns |
SQLDW-CONSUMPTION-CORE.md § Common Consumption Patterns |
Reporting views, cross-DB analytics, temp table staging |
| Gotchas and Troubleshooting (Consumption) |
SQLDW-CONSUMPTION-CORE.md § Gotchas and Troubleshooting Reference |
18 numbered issues with cause + resolution |
| Quick Reference: Consumption Capabilities |
SQLDW-CONSUMPTION-CORE.md § Quick Reference: Consumption Capabilities |
|
| Authoring Capability Matrix |
SQLDW-AUTHORING-CORE.md § Authoring Capability Matrix |
Read first — DW vs SQLEP authoring scope |
| Table DDL (DW Only) |
SQLDW-AUTHORING-CORE.md § Table DDL (DW Only) |
CREATE, CTAS, ALTER, sp_rename, DROP, constraints, schema evolution, IDENTITY |
| DML Operations (DW Only) |
SQLDW-AUTHORING-CORE.md § DML Operations (DW Only) |
INSERT...SELECT, UPDATE, DELETE, TRUNCATE, MERGE |
| Data Ingestion (DW Only) |
SQLDW-AUTHORING-CORE.md § Data Ingestion (DW Only) |
COPY INTO, OPENROWSET, method comparison |
| Transactions (DW Only) |
SQLDW-AUTHORING-CORE.md § Transactions (DW Only) |
Snapshot isolation only; write-write conflict rules |
| Stored Procedures (Authoring Patterns) |
SQLDW-AUTHORING-CORE.md § Stored Procedures (Authoring Patterns) |
ETL procs, upsert, CTAS swap, cursor replacement |
| Time Travel and Warehouse Snapshots |
SQLDW-AUTHORING-CORE.md § Time Travel and Warehouse Snapshots (DW Only) |
FOR TIMESTAMP AS OF; 30-day retention; snapshots GA |
| Source Control and CI/CD |
SQLDW-AUTHORING-CORE.md § Source Control and CI/CD (DW Only — Preview) |
Git integration, SQL DB projects, deployment pipelines |
| Authoring Permission Model |
SQLDW-AUTHORING-CORE.md § Authoring Permission Model |
Contributor minimum for DDL/DML; Admin for GRANT |
| Authoring Gotchas and Troubleshooting |
SQLDW-AUTHORING-CORE.md § Authoring Gotchas and Troubleshooting |
17-row issue/cause/resolution table |
| Common Authoring Patterns |
SQLDW-AUTHORING-CORE.md § Common Authoring Patterns |
Incremental load, SCD Type 1, SQLEP view layer |
| Quick Reference: Authoring Decision Guide |
SQLDW-AUTHORING-CORE.md § Quick Reference: Authoring Decision Guide |
Scenario → recommended approach lookup |
| Core Authoring via MCP |
authoring-cli-quickref.md § Core Authoring via MCP |
Table DDL, DML, data ingestion via execute_query |
| Advanced Authoring Patterns via MCP |
authoring-cli-quickref.md § Advanced Authoring Patterns via MCP |
Transactions, schema evolution, stored procedures, time travel |
| MCP Workflow Templates |
authoring-script-templates.md § MCP Workflow Templates |
COPY INTO, ELT pipeline, upsert with retry, schema migration, time travel recovery |
| Tool Stack |
SKILL.md § Tool Stack |
fabric-sqlendpoint-execute_query MCP tool + az CLI; verify before first op |
| Connection |
SKILL.md § Connection |
workspaceId/itemId discovery, execute example |
| Query Execution |
authoring-cli-quickref.md § Query Execution |
MCP tool call format, batch considerations |
| Agentic Workflows |
SKILL.md § Agentic Workflows |
Start here — discover schema before any write |
| Monitoring Authoring Operations |
authoring-cli-quickref.md § Monitoring Authoring Operations |
Active DML/DDL, recent ETL, failed writes |
| Gotchas, Rules, Troubleshooting |
SKILL.md § Gotchas, Rules, Troubleshooting |
MUST DO / AVOID / PREFER checklists |
| Agent Integration Notes |
authoring-cli-quickref.md § Agent Integration Notes |
Platform-specific tips (Copilot CLI, Claude Code) |
Tool Stack
| Tool |
Role |
Install |
fabric-sqlendpoint-execute_query MCP tool |
Primary: Execute DDL/DML T-SQL queries against Fabric SQL Endpoints. Returns CSV results. Auth handled by MCP protocol. |
No install — server-side. Requires MCP server registration. |
az CLI |
Auth (az login), Fabric REST for workspace/item discovery, snapshot management. |
Pre-installed in most dev environments |
jq |
Parse JSON from az rest |
Pre-installed or trivial |
IMPORTANT — MCP vs sqlcmd:
This skill uses the fabric-sqlendpoint-execute_query MCP tool for all T-SQL execution. Do not use COMMON-CLI SQL/TDS/sqlcmd sections for query execution.
Agent preflight — verify before first operation:
- Confirm the
fabric-sqlendpoint-execute_query tool is available in your tool list. This tool is provided by the fabric-sqlendpoint MCP server, which is registered either by installing a Fabric skills plugin (the path for end users) or via this repo's .mcp.json — other MCP clients may register it through their own configuration.
- If no matching tool is found, the user must register the Fabric SQL Endpoint MCP server. See mcp-setup/.
- Global URL:
https://api.fabric.microsoft.com/v1/mcp/dataPlane/sqlEndpoint
- Item-scoped URL:
https://api.fabric.microsoft.com/v1/mcp/dataPlane/workspaces/{workspaceId}/items/{itemId}/sqlEndpoint
MCP Tool Signature
fabric-sqlendpoint-execute_query(workspaceId, itemId, query)
Tool name may differ: execute_query is the logical operation. Depending on how the server is
registered, the concrete tool name in your tool list may be prefixed (e.g.
fabric-sqlendpoint-execute_query or sqlendpoint-global-execute_query). Invoke the concrete name
shown in your tool list, always passing workspaceId, itemId, and query.
| Parameter |
Type |
Description |
workspaceId |
string (UUID) |
The workspace GUID containing the target item |
itemId |
string (UUID) |
The Fabric item GUID to target. For a Warehouse, use the item id. For a Lakehouse, use its SQL analytics endpoint id (properties.sqlEndpointProperties.id) — not the Lakehouse item id. |
query |
string |
T-SQL query text (single batch — no GO separators or sqlcmd meta-commands) |
Returns: CSV resource (RFC 4180) with tabular results + metadata text.
Batch guidance: Multiple statements without GO are allowed in one call (e.g., CREATE TABLE ...; INSERT INTO ...). However, only the last result set is returned, and an error in any statement fails the entire batch. Prefer separate fabric-sqlendpoint-execute_query calls for independent DDL/DML operations — this gives clearer error messages and lets you verify each step succeeded before proceeding.
MCP Limits
| Limit |
Value |
Notes |
| Max rows returned |
10,000 |
For DDL/DML, row count metadata indicates affected rows |
| Query timeout |
300 seconds |
Long-running operations may timeout |
| Rate limit |
20 requests/min per identity |
HTTP 429 returned when exceeded |
These values are observed defaults, not a documented contract — the MCP service can change them. Treat them as guidance and confirm the current behavior from live 429 / timeout / truncation responses (or Microsoft Learn, if/when published) rather than relying on the exact numbers.
Authoring Scope by Item Type
| Capability |
Warehouse (DW) |
Lakehouse/Mirrored DB SQLEP |
| Table DDL (CREATE/ALTER/DROP) |
✅ |
❌ |
| DML (INSERT/UPDATE/DELETE/MERGE) |
✅ |
❌ |
| COPY INTO, OPENROWSET (ingest) |
✅ |
OPENROWSET read-only |
| Transactions |
✅ |
❌ |
| Time travel, snapshots |
✅ |
❌ |
| CREATE VIEW/FUNCTION/PROCEDURE |
✅ |
✅ |
| CREATE SCHEMA |
✅ |
✅ |
Fabric DW DDL Constraints
These constraints are hard requirements — violating them produces errors:
| Constraint |
Details |
No DEFAULT in CREATE TABLE |
Default values not supported. Set defaults in application/INSERT logic. |
No PRIMARY KEY inside CREATE TABLE |
Must add via ALTER TABLE ... ADD CONSTRAINT ... PRIMARY KEY NONCLUSTERED (col) NOT ENFORCED |
DATETIME2 requires precision |
Always use DATETIME2(6), never bare DATETIME2 |
| Unsupported data types |
NCHAR, NVARCHAR, TEXT, IMAGE, MONEY, SMALLMONEY, DATETIME — use VARCHAR, DECIMAL, DATETIME2(6) instead |
No WITH DISTRIBUTION |
Distribution is automatic in Fabric |
Constraints must be NOT ENFORCED |
PRIMARY KEY NONCLUSTERED NOT ENFORCED, UNIQUE NONCLUSTERED NOT ENFORCED, FOREIGN KEY NOT ENFORCED |
PK columns must be NOT NULL |
Declare PK columns as NOT NULL in CREATE TABLE before adding PK constraint |
ALTER TABLE scope |
Add/drop nullable columns (must specify NULL) and add/drop constraints (NOT ENFORCED only) are GA; ALTER COLUMN type changes are in preview (see note below) |
MERGE and ALTER COLUMN are NOT hard errors. Per T-SQL surface area, MERGE is a generally available Warehouse feature and ALTER TABLE ... ALTER COLUMN is in preview. Prefer an explicit DELETE+INSERT when snapshot-conflict isolation matters, and CTAS + sp_rename for production-critical column-type changes — as a robustness choice, not because the syntax is blocked.
Correct CREATE TABLE pattern:
CREATE TABLE dbo.Orders (
OrderID INT NOT NULL,
CustomerName VARCHAR(100) NULL,
Amount DECIMAL(19,4) NULL,
CreatedAt DATETIME2(6) NULL
)
ALTER TABLE dbo.Orders ADD CONSTRAINT PK_Orders PRIMARY KEY NONCLUSTERED (OrderID) NOT ENFORCED
Additional supported patterns:
CREATE TABLE [dbo].[clone] AS CLONE OF [dbo].[source] — duplicate table structure + data
COPY INTO — highest-throughput ingestion from external storage
Connection
Discover workspaceId and itemId
You need the workspace GUID and item GUID to call fabric-sqlendpoint-execute_query:
# 1. Find workspace ID by name (capture into WS_ID for the next call)
WS_ID=$(az rest --method get \
--resource "https://api.fabric.microsoft.com" \
--url "https://api.fabric.microsoft.com/v1/workspaces" \
--query "value[?displayName=='MyWorkspace'].id" --output tsv)
echo "Workspace ID: $WS_ID"
# 2. Find warehouse item ID by name
az rest --method get \
--resource "https://api.fabric.microsoft.com" \
--url "https://api.fabric.microsoft.com/v1/workspaces/$WS_ID/warehouses" \
--query "value[?displayName=='MyWarehouse'].id" --output tsv
# For a Lakehouse SQL endpoint, pass its SQL analytics endpoint id — NOT the lakehouse item id
az rest --method get \
--resource "https://api.fabric.microsoft.com" \
--url "https://api.fabric.microsoft.com/v1/workspaces/$WS_ID/lakehouses" \
--query "value[?displayName=='MyLakehouse'].properties.sqlEndpointProperties.id" --output tsv
Execute a Query
fabric-sqlendpoint-execute_query(
workspaceId: "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
itemId: "11111111-2222-3333-4444-555555555555",
query: "CREATE TABLE dbo.FactSales (SaleID bigint NOT NULL, Amount decimal(19,4) NOT NULL)"
)
No additional connection setup needed — authentication is handled transparently by the MCP protocol.
Verifying DDL/DML Results
For DDL (CREATE/ALTER/DROP), the tool returns success with metadata. Always verify:
# After CREATE TABLE, verify it exists
fabric-sqlendpoint-execute_query(workspaceId, itemId, "SELECT table_schema, table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_name = 'FactSales'")
# After DML, check row count
fabric-sqlendpoint-execute_query(workspaceId, itemId, "SELECT COUNT(*) AS row_count FROM dbo.FactSales")
Agentic Workflows
Schema Discovery Before Authoring
Before any write operation, discover the target schema:
# 1. List tables
fabric-sqlendpoint-execute_query(workspaceId, itemId, "SELECT table_schema, table_name FROM INFORMATION_SCHEMA.TABLES ORDER BY 1,2")
# 2. Check columns
fabric-sqlendpoint-execute_query(workspaceId, itemId, "SELECT column_name, data_type, is_nullable FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='FactSales' ORDER BY ordinal_position")
# 3. Sample data
fabric-sqlendpoint-execute_query(workspaceId, itemId, "SELECT TOP 5 * FROM dbo.FactSales")
# 4. Check constraints
fabric-sqlendpoint-execute_query(workspaceId, itemId, "SELECT constraint_name, constraint_type FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE table_name='FactSales'")
# 5. Row counts
fabric-sqlendpoint-execute_query(workspaceId, itemId, "SELECT s.name AS [schema], t.name AS [table], SUM(p.rows) AS row_count FROM sys.tables t JOIN sys.schemas s ON t.schema_id=s.schema_id JOIN sys.partitions p ON t.object_id=p.object_id AND p.index_id IN (0,1) GROUP BY s.name, t.name ORDER BY row_count DESC")
# 6. Programmability objects
fabric-sqlendpoint-execute_query(workspaceId, itemId, "SELECT name, type_desc FROM sys.objects WHERE type IN ('V','FN','IF','P','TF') ORDER BY type_desc, name")
Agentic Workflow
- Discover → Run steps 1–4 to understand available tables/columns.
- Sample →
SELECT TOP 5 on relevant tables.
- Formulate → Select pattern from SQLDW-AUTHORING-CORE.md (Table DDL through Common Authoring Patterns).
- Execute → Call
fabric-sqlendpoint-execute_query(workspaceId, itemId, query). For multi-batch operations (e.g., CREATE PROCEDURE with BEGIN/END), use a single batch without GO.
- Verify → Query affected table (
SELECT COUNT(*), SELECT TOP 5).
- Optionally follow up → Run additional queries to confirm schema changes.
Gotchas, Rules, Troubleshooting
For full authoring gotchas: SQLDW-AUTHORING-CORE.md Authoring Gotchas and Troubleshooting.
For CLI-specific issues: COMMON-CLI.md Gotchas & Troubleshooting (CLI-Specific).
MUST DO
- Verify workspace has capacity before creating warehouse — call
GET /v1/workspaces/{id} and check capacityId.
- Verify
fabric-sqlendpoint-execute_query MCP tool is available — check the tool list before the first operation. If unavailable, instruct the user to register the MCP server.
- Discover
workspaceId and itemId first — resolve the target Warehouse via az rest; the tool takes GUIDs, not an FQDN or -d <DatabaseName>.
az login first (for discovery) — the az rest workspace/warehouse lookups need an Azure CLI session. The fabric-sqlendpoint MCP server itself ships headerless and authenticates via your MCP client's native Fabric session, not the Azure CLI token; no signed-in session → auth failure on either path.
SET NOCOUNT ON; in scripts — suppresses row-count messages that corrupt output.
- Send a single T-SQL batch per call — no
GO separators and no -i file.sql; split multi-batch work (CREATE PROCEDURE, multi-step transactions) into separate fabric-sqlendpoint-execute_query calls.
- Label authoring queries with
OPTION (LABEL = 'ETL_description').
- Use explicit
CAST() in CTAS to control output types.
- Keep transactions short — long transactions increase conflict window.
AVOID
GO separators — the MCP tool accepts only a single T-SQL batch. Combine related DDL in one statement or call fabric-sqlendpoint-execute_query multiple times.
- sqlcmd meta-commands (
:setvar, :r, -i) — not available in MCP tool. Inline all SQL in the query parameter.
- Unbounded
SELECT * — 10,000 row limit. Always use TOP N or WHERE to limit result sets.
- Singleton
INSERT ... VALUES at scale — creates tiny Parquet files. Use INSERT...SELECT, CTAS, or COPY INTO.
DROP TABLE IF EXISTS + CREATE TABLE to refresh — loses time-travel history. Use TRUNCATE TABLE + INSERT INTO.
- MERGE in production — GA, but table-level snapshot-conflict detection makes concurrent writers likely to fail. Prefer DELETE + INSERT when isolation matters.
- ALTER COLUMN in production — in preview; prefer CTAS +
sp_rename for production-critical column-type changes (Schema Evolution).
- Variables in CTAS — not allowed. Wrap in dynamic SQL:
EXEC sp_executesql N'CREATE TABLE ...'.
- DML on Lakehouse/Mirrored DB SQLEP — read-only for table data. Only views/funcs/procs can be authored.
- Concurrent UPDATE/DELETE on same table — snapshot isolation conflicts at table level. Serialize writes.
- Rapid-fire MCP calls — rate limit is 20 req/min. Consolidate multiple statements into one batch where possible.
- MARS — not supported. Remove
MultipleActiveResultSets from connection strings.
PREFER
- CTAS over
CREATE TABLE + INSERT — parallel, single-operation.
INSERT ... SELECT over singleton INSERTs.
COPY INTO for external file ingestion — highest throughput.
- DELETE + INSERT over MERGE for upserts in production.
TRUNCATE TABLE over DELETE FROM without WHERE — faster, preserves history.
- Consolidating related DDL into a single
fabric-sqlendpoint-execute_query call when no GO is required between statements.
- CTAS + sp_rename for large-scale transforms instead of UPDATE.
fabric-sqlendpoint-execute_query MCP tool over sqlcmd for all T-SQL operations.
SET NOCOUNT ON; prefix — reduces metadata noise in results.
TOP N or WHERE clauses — stay within 10K row limit.
TROUBLESHOOTING
| Symptom |
Fix |
| Error 24556/24706 snapshot conflict |
Serialize writes to same table; retry with backoff |
| COPY INTO auth error |
Grant Storage Blob Data Reader on ADLS; or SAS in CREDENTIAL |
| COPY INTO from OneLake fails |
Provision workspace identity; check firewall rules |
| CTAS unexpected types |
Use explicit CAST() in SELECT |
| Singleton INSERT poor perf |
Remediate: CTAS + drop + rename to consolidate Parquet |
fabric-sqlendpoint-execute_query tool not available |
MCP server not registered — user must add Fabric SQL Endpoint MCP server |
| HTTP 429 rate limit exceeded |
Wait 60s and retry; consolidate queries into fewer calls |
| Query timeout (300s) |
Break into smaller operations; for COPY INTO, check source file sizes |
| sp_rename on SQLEP fails |
Only available on Warehouse, not Lakehouse/Mirrored DB |
| Deploy drops/recreates table |
Avoid ALTER TABLE in DB project; apply manually |
| Only last result set returned |
MCP returns only the final SELECT. Split multi-SELECT batches into separate calls. |
| Binary columns unreadable |
Columns with [base64] suffix are base64-encoded. Decode if needed. |
1---2name: sqldw-authoring-cli3description: Execute authoring T-SQL (DDL, DML, data ingestion, transactions, schema changes) against Microsoft Fabric Data Warehouse and SQL endpoints via the MCP `fabric-sqlendpoint-execute_query` tool. Use when the user wants to: (1) create/alter/drop tables, (2) insert/update/delete/merge data, (3) run COPY INTO or OPENROWSET ingestion, (4) manage transactions or stored procedures, (5) perform schema evolution, (6) use time travel or snapshots, (7) generate ETL/ELT workflows, (8) create views/functions/procedures on Lakehouse SQLEP. Triggers: "create table in warehouse", "insert data via T-SQL", "load from ADLS", "COPY INTO", "run ETL with T-SQL", "alter warehouse table", "upsert with T-SQL", "merge into warehouse", "create T-SQL procedure", "warehouse time travel", "recover deleted warehouse data", "create warehouse schema", "deploy warehouse", "transaction conflict", "snapshot isolation error".4---56> **Telemetry — MANDATORY.** Every `api.fabric.microsoft.com` call must carry7> `x-ms-fabric-skill: sqldw-authoring-cli` (`az rest`: `--headers "x-ms-fabric-skill=sqldw-authoring-cli"`),8> including every LRO poll, `fabric_lro` and retry. Snippets omit it — add it anyway.910> **Update Check — ONCE PER SESSION (mandatory)**11> The first time this skill is used in a session, run the **check-updates** skill before proceeding.12> - **GitHub Copilot CLI / VS Code**: invoke the `check-updates` skill.13> - **Claude Code / Cowork / Cursor / Windsurf / Codex**: compare local vs remote package.json version.14> - Skip if the check was already performed earlier in this session.1516> **CRITICAL NOTES**17> 1. To find the workspace details (including its ID) from workspace name: list all workspaces and, then, use JMESPath filtering18> 2. To find the item details (including its ID) from workspace ID, item type, and item name: list all items of that type in that workspace and, then, use JMESPath filtering1920# SQL Endpoint Authoring — CLI Skill2122> **⚠️ SQL Execution Override:** For SQL data-plane execution, this skill supersedes COMMON-CLI SQL/TDS guidance. Use MCP `fabric-sqlendpoint-execute_query` (see [Tool Stack](#tool-stack)) unless explicitly using Legacy CLI Fallback.2324## Table of Contents2526| Task | Reference | Notes |27|---|---|---|28| Finding Workspaces and Items in Fabric | [COMMON-CLI.md § Finding Workspaces and Items in Fabric](../../common/COMMON-CLI.md#finding-workspaces-and-items-in-fabric) | **Mandatory** — *READ link first* [needed for finding workspace id by its name or item id by its name, item type, and workspace id] |29| Fabric Topology & Key Concepts | [COMMON-CORE.md § Fabric Topology & Key Concepts](../../common/COMMON-CORE.md#fabric-topology--key-concepts) ||30| Environment URLs | [COMMON-CORE.md § Environment URLs](../../common/COMMON-CORE.md#environment-urls) ||31| Authentication & Token Acquisition | [COMMON-CORE.md § Authentication & Token Acquisition](../../common/COMMON-CORE.md#authentication--token-acquisition) | Wrong audience = 401; read before any auth issue |32| Core Control-Plane REST APIs | [COMMON-CORE.md § Core Control-Plane REST APIs](../../common/COMMON-CORE.md#core-control-plane-rest-apis) | Includes pagination, LRO polling, and rate-limiting patterns |33| OneLake Data Access | [COMMON-CORE.md § OneLake Data Access](../../common/COMMON-CORE.md#onelake-data-access) | Requires `storage.azure.com` token, not Fabric token |34| Definition Envelope | [ITEM-DEFINITIONS-CORE.md § Definition Envelope](../../common/ITEM-DEFINITIONS-CORE.md#definition-envelope) | Definition payload structure |35| Per-Item-Type Definitions | [ITEM-DEFINITIONS-CORE.md § Per-Item-Type Definitions](../../common/ITEM-DEFINITIONS-CORE.md#per-item-type-definitions) | Support matrix, decoded content, part paths — [REST specs](../../common/COMMON-CORE.md#item-creation), [CLI recipes](../../common/COMMON-CLI.md#item-crud-operations) |36| Job Execution | [COMMON-CORE.md § Job Execution](../../common/COMMON-CORE.md#job-execution) ||37| Capacity Management | [COMMON-CORE.md § Capacity Management](../../common/COMMON-CORE.md#capacity-management) ||38| Gotchas, Best Practices & Troubleshooting (Platform) | [COMMON-CORE.md § Gotchas, Best Practices & Troubleshooting](../../common/COMMON-CORE.md#gotchas-best-practices--troubleshooting) ||39| Tool Selection Rationale | [COMMON-CLI.md § Tool Selection Rationale](../../common/COMMON-CLI.md#tool-selection-rationale) ||40| Authentication Recipes | [COMMON-CLI.md § Authentication Recipes](../../common/COMMON-CLI.md#authentication-recipes) | `az login` flows and token acquisition |41| Fabric Control-Plane API via `az rest` | [COMMON-CLI.md § Fabric Control-Plane API via az rest](../../common/COMMON-CLI.md#fabric-control-plane-api-via-az-rest) | **Always pass `--resource`**; includes pagination and LRO helpers |42| OneLake Data Access via `curl` | [COMMON-CLI.md § OneLake Data Access via curl](../../common/COMMON-CLI.md#onelake-data-access-via-curl) | Use `curl` not `az rest` (different token audience) |43| SQL / TDS Data-Plane Access | [COMMON-CLI.md § SQL / TDS Data-Plane Access](../../common/COMMON-CLI.md#sql--tds-data-plane-access) | Legacy `sqlcmd` reference (MCP is primary — see Tool Stack) |44| Job Execution (CLI) | [COMMON-CLI.md § Job Execution](../../common/COMMON-CLI.md#job-execution) ||45| OneLake Shortcuts | [COMMON-CLI.md § OneLake Shortcuts](../../common/COMMON-CLI.md#onelake-shortcuts) ||46| Capacity Management (CLI) | [COMMON-CLI.md § Capacity Management](../../common/COMMON-CLI.md#capacity-management) ||47| Composite Recipes | [COMMON-CLI.md § Composite Recipes](../../common/COMMON-CLI.md#composite-recipes) ||48| Gotchas & Troubleshooting (CLI-Specific) | [COMMON-CLI.md § Gotchas & Troubleshooting (CLI-Specific)](../../common/COMMON-CLI.md#gotchas--troubleshooting-cli-specific) | `az rest` audience, shell escaping, token expiry |49| Quick Reference | [COMMON-CLI.md § Quick Reference](../../common/COMMON-CLI.md#quick-reference) | `az rest` template + token audience/tool matrix |50| Item-Type Capability Matrix | [SQLDW-CONSUMPTION-CORE.md § Item-Type Capability Matrix](../../common/SQLDW-CONSUMPTION-CORE.md#item-type-capability-matrix) | Shows read-only (SQLEP) vs read-write (DW) |51| Connection Fundamentals | [SQLDW-CONSUMPTION-CORE.md § Connection Fundamentals](../../common/SQLDW-CONSUMPTION-CORE.md#connection-fundamentals) | TDS, port 1433, Entra-only, no MARS |52| Supported T-SQL Surface Area (Consumption Focus) | [SQLDW-CONSUMPTION-CORE.md § Supported T-SQL Surface Area](../../common/SQLDW-CONSUMPTION-CORE.md#supported-t-sql-surface-area-consumption-focus) | **Read before writing T-SQL** — includes data types (no `nvarchar`/`datetime`/`money`) |53| Read-Side Objects You Can Create | [SQLDW-CONSUMPTION-CORE.md § Read-Side Objects You Can Create](../../common/SQLDW-CONSUMPTION-CORE.md#read-side-objects-you-can-create) | Views, TVFs, scalar UDFs, procedures |54| Temporary Tables | [SQLDW-CONSUMPTION-CORE.md § Temporary Tables](../../common/SQLDW-CONSUMPTION-CORE.md#temporary-tables) ||55| Cross-Database Queries | [SQLDW-CONSUMPTION-CORE.md § Cross-Database Queries](../../common/SQLDW-CONSUMPTION-CORE.md#cross-database-queries) | 3-part naming, same workspace only |56| Security for Consumption | [SQLDW-CONSUMPTION-CORE.md § Security for Consumption](../../common/SQLDW-CONSUMPTION-CORE.md#security-for-consumption) | GRANT/DENY, RLS, CLS, DDM |57| Monitoring and Diagnostics | [SQLDW-CONSUMPTION-CORE.md § Monitoring and Diagnostics](../../common/SQLDW-CONSUMPTION-CORE.md#monitoring-and-diagnostics) | Includes query labels; DMVs (live) + `queryinsights.*` (30-day history) |58| Performance: Best Practices and Troubleshooting | [SQLDW-CONSUMPTION-CORE.md § Performance: Best Practices and Troubleshooting](../../common/SQLDW-CONSUMPTION-CORE.md#performance-best-practices-and-troubleshooting) | Statistics, caching, clustering, query tips |59| REST API: Refresh SQL Endpoint Metadata | [SQLDW-CONSUMPTION-CORE.md § REST API: Refresh SQL Endpoint Metadata](../../common/SQLDW-CONSUMPTION-CORE.md#rest-api-refresh-sql-endpoint-metadata) | Force metadata sync when SQLEP is stale after ETL |60| System Catalog Queries (Metadata Exploration) | [SQLDW-CONSUMPTION-CORE.md § System Catalog Queries](../../common/SQLDW-CONSUMPTION-CORE.md#system-catalog-queries-metadata-exploration) | `sys.tables`, `sys.columns`, `sys.views`, `sys.stats` |61| Common Consumption Patterns | [SQLDW-CONSUMPTION-CORE.md § Common Consumption Patterns](../../common/SQLDW-CONSUMPTION-CORE.md#common-consumption-patterns-end-to-end-examples) | Reporting views, cross-DB analytics, temp table staging |62| Gotchas and Troubleshooting (Consumption) | [SQLDW-CONSUMPTION-CORE.md § Gotchas and Troubleshooting Reference](../../common/SQLDW-CONSUMPTION-CORE.md#gotchas-and-troubleshooting-reference) | 18 numbered issues with cause + resolution |63| Quick Reference: Consumption Capabilities | [SQLDW-CONSUMPTION-CORE.md § Quick Reference: Consumption Capabilities](../../common/SQLDW-CONSUMPTION-CORE.md#quick-reference-consumption-capabilities-by-scenario) ||64| Authoring Capability Matrix | [SQLDW-AUTHORING-CORE.md § Authoring Capability Matrix](../../common/SQLDW-AUTHORING-CORE.md#authoring-capability-matrix) | **Read first** — DW vs SQLEP authoring scope |65| Table DDL (DW Only) | [SQLDW-AUTHORING-CORE.md § Table DDL (DW Only)](../../common/SQLDW-AUTHORING-CORE.md#table-ddl-dw-only) | CREATE, CTAS, ALTER, sp_rename, DROP, constraints, schema evolution, IDENTITY |66| DML Operations (DW Only) | [SQLDW-AUTHORING-CORE.md § DML Operations (DW Only)](../../common/SQLDW-AUTHORING-CORE.md#dml-operations-dw-only) | INSERT...SELECT, UPDATE, DELETE, TRUNCATE, MERGE |67| Data Ingestion (DW Only) | [SQLDW-AUTHORING-CORE.md § Data Ingestion (DW Only)](../../common/SQLDW-AUTHORING-CORE.md#data-ingestion-dw-only) | COPY INTO, OPENROWSET, method comparison |68| Transactions (DW Only) | [SQLDW-AUTHORING-CORE.md § Transactions (DW Only)](../../common/SQLDW-AUTHORING-CORE.md#transactions-dw-only) | Snapshot isolation only; write-write conflict rules |69| Stored Procedures (Authoring Patterns) | [SQLDW-AUTHORING-CORE.md § Stored Procedures (Authoring Patterns)](../../common/SQLDW-AUTHORING-CORE.md#stored-procedures-authoring-patterns) | ETL procs, upsert, CTAS swap, cursor replacement |70| Time Travel and Warehouse Snapshots | [SQLDW-AUTHORING-CORE.md § Time Travel and Warehouse Snapshots (DW Only)](../../common/SQLDW-AUTHORING-CORE.md#time-travel-and-warehouse-snapshots-dw-only) | FOR TIMESTAMP AS OF; 30-day retention; snapshots GA |71| Source Control and CI/CD | [SQLDW-AUTHORING-CORE.md § Source Control and CI/CD (DW Only — Preview)](../../common/SQLDW-AUTHORING-CORE.md#source-control-and-cicd-dw-only--preview) | Git integration, SQL DB projects, deployment pipelines |72| Authoring Permission Model | [SQLDW-AUTHORING-CORE.md § Authoring Permission Model](../../common/SQLDW-AUTHORING-CORE.md#authoring-permission-model) | Contributor minimum for DDL/DML; Admin for GRANT |73| Authoring Gotchas and Troubleshooting | [SQLDW-AUTHORING-CORE.md § Authoring Gotchas and Troubleshooting](../../common/SQLDW-AUTHORING-CORE.md#authoring-gotchas-and-troubleshooting) | 17-row issue/cause/resolution table |74| Common Authoring Patterns | [SQLDW-AUTHORING-CORE.md § Common Authoring Patterns](../../common/SQLDW-AUTHORING-CORE.md#common-authoring-patterns-end-to-end-examples) | Incremental load, SCD Type 1, SQLEP view layer |75| Quick Reference: Authoring Decision Guide | [SQLDW-AUTHORING-CORE.md § Quick Reference: Authoring Decision Guide](../../common/SQLDW-AUTHORING-CORE.md#quick-reference-authoring-decision-guide) | Scenario → recommended approach lookup |76| Core Authoring via MCP | [authoring-cli-quickref.md § Core Authoring via MCP](references/authoring-cli-quickref.md#core-authoring-via-mcp) | Table DDL, DML, data ingestion via execute_query |77| Advanced Authoring Patterns via MCP | [authoring-cli-quickref.md § Advanced Authoring Patterns via MCP](references/authoring-cli-quickref.md#advanced-authoring-patterns-via-mcp) | Transactions, schema evolution, stored procedures, time travel |78| MCP Workflow Templates | [authoring-script-templates.md § MCP Workflow Templates](references/authoring-script-templates.md#mcp-workflow-templates) | COPY INTO, ELT pipeline, upsert with retry, schema migration, time travel recovery |79| Tool Stack | [SKILL.md § Tool Stack](#tool-stack) | `fabric-sqlendpoint-execute_query` MCP tool + `az` CLI; verify before first op |80| Connection | [SKILL.md § Connection](#connection) | workspaceId/itemId discovery, execute example |81| Query Execution | [authoring-cli-quickref.md § Query Execution](references/authoring-cli-quickref.md#query-execution) | MCP tool call format, batch considerations |82| Agentic Workflows | [SKILL.md § Agentic Workflows](#agentic-workflows) | **Start here** — discover schema before any write |83| Monitoring Authoring Operations | [authoring-cli-quickref.md § Monitoring Authoring Operations](references/authoring-cli-quickref.md#monitoring-authoring-operations) | Active DML/DDL, recent ETL, failed writes |84| Gotchas, Rules, Troubleshooting | [SKILL.md § Gotchas, Rules, Troubleshooting](#gotchas-rules-troubleshooting) | **MUST DO / AVOID / PREFER** checklists |85| Agent Integration Notes | [authoring-cli-quickref.md § Agent Integration Notes](references/authoring-cli-quickref.md#agent-integration-notes) | Platform-specific tips (Copilot CLI, Claude Code) |8687---8889## Tool Stack9091| Tool | Role | Install |92|---|---|---|93| `fabric-sqlendpoint-execute_query` MCP tool | **Primary**: Execute DDL/DML T-SQL queries against Fabric SQL Endpoints. Returns CSV results. Auth handled by MCP protocol. | No install — server-side. Requires MCP server registration. |94| `az` CLI | Auth (`az login`), Fabric REST for workspace/item discovery, snapshot management. | Pre-installed in most dev environments |95| `jq` | Parse JSON from `az rest` | Pre-installed or trivial |9697> **IMPORTANT — MCP vs sqlcmd:**98> This skill uses the `fabric-sqlendpoint-execute_query` MCP tool for all T-SQL execution. Do **not** use COMMON-CLI SQL/TDS/sqlcmd sections for query execution.99100> **Agent preflight** — verify before first operation:101> 1. Confirm the `fabric-sqlendpoint-execute_query` tool is available in your tool list. This tool is provided by the `fabric-sqlendpoint` MCP server, which is registered either by installing a Fabric skills **plugin** (the path for end users) or via this repo's `.mcp.json` — other MCP clients may register it through their own configuration.102> 2. If no matching tool is found, the user must register the Fabric SQL Endpoint MCP server. See [mcp-setup/](../../mcp-setup/).103> - **Global URL**: `https://api.fabric.microsoft.com/v1/mcp/dataPlane/sqlEndpoint`104> - **Item-scoped URL**: `https://api.fabric.microsoft.com/v1/mcp/dataPlane/workspaces/{workspaceId}/items/{itemId}/sqlEndpoint`105106### MCP Tool Signature107108```text109fabric-sqlendpoint-execute_query(workspaceId, itemId, query)110```111112> **Tool name may differ:** `execute_query` is the logical operation. Depending on how the server is113> registered, the concrete tool name in your tool list may be prefixed (e.g.114> `fabric-sqlendpoint-execute_query` or `sqlendpoint-global-execute_query`). Invoke the concrete name115> shown in your tool list, always passing `workspaceId`, `itemId`, and `query`.116117| Parameter | Type | Description |118|-----------|------|-------------|119| `workspaceId` | string (UUID) | The workspace GUID containing the target item |120| `itemId` | string (UUID) | The Fabric item GUID to target. For a **Warehouse**, use the item id. For a **Lakehouse**, use its **SQL analytics endpoint** id (`properties.sqlEndpointProperties.id`) — **not** the Lakehouse item id. |121| `query` | string | T-SQL query text (single batch — no `GO` separators or sqlcmd meta-commands) |122123**Returns:** CSV resource (RFC 4180) with tabular results + metadata text.124125> **Batch guidance:** Multiple statements without `GO` are allowed in one call (e.g., `CREATE TABLE ...; INSERT INTO ...`). However, only the last result set is returned, and an error in any statement fails the entire batch. **Prefer separate `fabric-sqlendpoint-execute_query` calls** for independent DDL/DML operations — this gives clearer error messages and lets you verify each step succeeded before proceeding.126127### MCP Limits128129| Limit | Value | Notes |130|-------|-------|-------|131| Max rows returned | 10,000 | For DDL/DML, row count metadata indicates affected rows |132| Query timeout | 300 seconds | Long-running operations may timeout |133| Rate limit | 20 requests/min per identity | HTTP 429 returned when exceeded |134135> These values are **observed defaults, not a documented contract** — the MCP service can change them. Treat them as guidance and confirm the current behavior from live `429` / timeout / truncation responses (or Microsoft Learn, if/when published) rather than relying on the exact numbers.136137### Authoring Scope by Item Type138139| Capability | Warehouse (DW) | Lakehouse/Mirrored DB SQLEP |140|---|---|---|141| Table DDL (CREATE/ALTER/DROP) | ✅ | ❌ |142| DML (INSERT/UPDATE/DELETE/MERGE) | ✅ | ❌ |143| COPY INTO, OPENROWSET (ingest) | ✅ | OPENROWSET read-only |144| Transactions | ✅ | ❌ |145| Time travel, snapshots | ✅ | ❌ |146| CREATE VIEW/FUNCTION/PROCEDURE | ✅ | ✅ |147| CREATE SCHEMA | ✅ | ✅ |148149### Fabric DW DDL Constraints150151These constraints are **hard requirements** — violating them produces errors:152153| Constraint | Details |154|---|---|155| No `DEFAULT` in CREATE TABLE | Default values not supported. Set defaults in application/INSERT logic. |156| No `PRIMARY KEY` inside CREATE TABLE | Must add via `ALTER TABLE ... ADD CONSTRAINT ... PRIMARY KEY NONCLUSTERED (col) NOT ENFORCED` |157| `DATETIME2` requires precision | Always use `DATETIME2(6)`, never bare `DATETIME2` |158| Unsupported data types | `NCHAR`, `NVARCHAR`, `TEXT`, `IMAGE`, `MONEY`, `SMALLMONEY`, `DATETIME` — use `VARCHAR`, `DECIMAL`, `DATETIME2(6)` instead |159| No `WITH DISTRIBUTION` | Distribution is automatic in Fabric |160| Constraints must be `NOT ENFORCED` | `PRIMARY KEY NONCLUSTERED NOT ENFORCED`, `UNIQUE NONCLUSTERED NOT ENFORCED`, `FOREIGN KEY NOT ENFORCED` |161| PK columns must be `NOT NULL` | Declare PK columns as `NOT NULL` in CREATE TABLE before adding PK constraint |162| `ALTER TABLE` scope | Add/drop nullable columns (must specify `NULL`) and add/drop constraints (`NOT ENFORCED` only) are GA; `ALTER COLUMN` type changes are **in preview** (see note below) |163164> **`MERGE` and `ALTER COLUMN` are NOT hard errors.** Per [T-SQL surface area](https://learn.microsoft.com/en-us/fabric/data-warehouse/tsql-surface-area), `MERGE` is a **generally available** Warehouse feature and `ALTER TABLE ... ALTER COLUMN` is **in preview**. Prefer an explicit `DELETE`+`INSERT` when snapshot-conflict isolation matters, and `CTAS` + `sp_rename` for production-critical column-type changes — as a robustness choice, not because the syntax is blocked.165166**Correct CREATE TABLE pattern:**167168```sql169CREATE TABLE dbo.Orders (170 OrderID INT NOT NULL,171 CustomerName VARCHAR(100) NULL,172 Amount DECIMAL(19,4) NULL,173 CreatedAt DATETIME2(6) NULL174)175```176177```sql178ALTER TABLE dbo.Orders ADD CONSTRAINT PK_Orders PRIMARY KEY NONCLUSTERED (OrderID) NOT ENFORCED179```180181**Additional supported patterns:**182- `CREATE TABLE [dbo].[clone] AS CLONE OF [dbo].[source]` — duplicate table structure + data183- `COPY INTO` — highest-throughput ingestion from external storage184185---186187## Connection188189### Discover workspaceId and itemId190191You need the workspace GUID and item GUID to call `fabric-sqlendpoint-execute_query`:192193```bash194# 1. Find workspace ID by name (capture into WS_ID for the next call)195WS_ID=$(az rest --method get \196 --resource "https://api.fabric.microsoft.com" \197 --url "https://api.fabric.microsoft.com/v1/workspaces" \198 --query "value[?displayName=='MyWorkspace'].id" --output tsv)199echo "Workspace ID: $WS_ID"200201# 2. Find warehouse item ID by name202az rest --method get \203 --resource "https://api.fabric.microsoft.com" \204 --url "https://api.fabric.microsoft.com/v1/workspaces/$WS_ID/warehouses" \205 --query "value[?displayName=='MyWarehouse'].id" --output tsv206207# For a Lakehouse SQL endpoint, pass its SQL analytics endpoint id — NOT the lakehouse item id208az rest --method get \209 --resource "https://api.fabric.microsoft.com" \210 --url "https://api.fabric.microsoft.com/v1/workspaces/$WS_ID/lakehouses" \211 --query "value[?displayName=='MyLakehouse'].properties.sqlEndpointProperties.id" --output tsv212```213214### Execute a Query215216```text217fabric-sqlendpoint-execute_query(218 workspaceId: "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",219 itemId: "11111111-2222-3333-4444-555555555555",220 query: "CREATE TABLE dbo.FactSales (SaleID bigint NOT NULL, Amount decimal(19,4) NOT NULL)"221)222```223224**No additional connection setup needed** — authentication is handled transparently by the MCP protocol.225226### Verifying DDL/DML Results227228For DDL (CREATE/ALTER/DROP), the tool returns success with metadata. Always verify:229230```text231# After CREATE TABLE, verify it exists232fabric-sqlendpoint-execute_query(workspaceId, itemId, "SELECT table_schema, table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_name = 'FactSales'")233234# After DML, check row count235fabric-sqlendpoint-execute_query(workspaceId, itemId, "SELECT COUNT(*) AS row_count FROM dbo.FactSales")236```237238---239240## Agentic Workflows241242### Schema Discovery Before Authoring243244Before any write operation, discover the target schema:245246```text247# 1. List tables248fabric-sqlendpoint-execute_query(workspaceId, itemId, "SELECT table_schema, table_name FROM INFORMATION_SCHEMA.TABLES ORDER BY 1,2")249250# 2. Check columns251fabric-sqlendpoint-execute_query(workspaceId, itemId, "SELECT column_name, data_type, is_nullable FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='FactSales' ORDER BY ordinal_position")252253# 3. Sample data254fabric-sqlendpoint-execute_query(workspaceId, itemId, "SELECT TOP 5 * FROM dbo.FactSales")255256# 4. Check constraints257fabric-sqlendpoint-execute_query(workspaceId, itemId, "SELECT constraint_name, constraint_type FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE table_name='FactSales'")258259# 5. Row counts260fabric-sqlendpoint-execute_query(workspaceId, itemId, "SELECT s.name AS [schema], t.name AS [table], SUM(p.rows) AS row_count FROM sys.tables t JOIN sys.schemas s ON t.schema_id=s.schema_id JOIN sys.partitions p ON t.object_id=p.object_id AND p.index_id IN (0,1) GROUP BY s.name, t.name ORDER BY row_count DESC")261262# 6. Programmability objects263fabric-sqlendpoint-execute_query(workspaceId, itemId, "SELECT name, type_desc FROM sys.objects WHERE type IN ('V','FN','IF','P','TF') ORDER BY type_desc, name")264```265266### Agentic Workflow2672681. **Discover** → Run steps 1–4 to understand available tables/columns.2692. **Sample** → `SELECT TOP 5` on relevant tables.2703. **Formulate** → Select pattern from [SQLDW-AUTHORING-CORE.md](../../common/SQLDW-AUTHORING-CORE.md) (Table DDL through Common Authoring Patterns).2714. **Execute** → Call `fabric-sqlendpoint-execute_query(workspaceId, itemId, query)`. For multi-batch operations (e.g., CREATE PROCEDURE with BEGIN/END), use a single batch without `GO`.2725. **Verify** → Query affected table (`SELECT COUNT(*)`, `SELECT TOP 5`).2736. **Optionally follow up** → Run additional queries to confirm schema changes.274275---276277## Gotchas, Rules, Troubleshooting278279For full authoring gotchas: [SQLDW-AUTHORING-CORE.md](../../common/SQLDW-AUTHORING-CORE.md) Authoring Gotchas and Troubleshooting.280For CLI-specific issues: [COMMON-CLI.md](../../common/COMMON-CLI.md) Gotchas & Troubleshooting (CLI-Specific).281282### MUST DO283284- **Verify workspace has capacity before creating warehouse** — call `GET /v1/workspaces/{id}` and check `capacityId`.285- **Verify `fabric-sqlendpoint-execute_query` MCP tool is available** — check the tool list before the first operation. If unavailable, instruct the user to register the MCP server.286- **Discover `workspaceId` and `itemId` first** — resolve the target Warehouse via `az rest`; the tool takes GUIDs, not an FQDN or `-d <DatabaseName>`.287- **`az login` first (for discovery)** — the `az rest` workspace/warehouse lookups need an Azure CLI session. The `fabric-sqlendpoint` MCP server itself ships headerless and authenticates via your MCP client's native Fabric session, not the Azure CLI token; no signed-in session → auth failure on either path.288- **`SET NOCOUNT ON;`** in scripts — suppresses row-count messages that corrupt output.289- **Send a single T-SQL batch per call** — no `GO` separators and no `-i file.sql`; split multi-batch work (CREATE PROCEDURE, multi-step transactions) into separate `fabric-sqlendpoint-execute_query` calls.290- **Label authoring queries** with `OPTION (LABEL = 'ETL_description')`.291- **Use explicit `CAST()`** in CTAS to control output types.292- **Keep transactions short** — long transactions increase conflict window.293294### AVOID295296- **`GO` separators** — the MCP tool accepts only a single T-SQL batch. Combine related DDL in one statement or call `fabric-sqlendpoint-execute_query` multiple times.297- **sqlcmd meta-commands** (`:setvar`, `:r`, `-i`) — not available in MCP tool. Inline all SQL in the `query` parameter.298- **Unbounded `SELECT *`** — 10,000 row limit. Always use `TOP N` or `WHERE` to limit result sets.299- **Singleton `INSERT ... VALUES`** at scale — creates tiny Parquet files. Use INSERT...SELECT, CTAS, or COPY INTO.300- **`DROP TABLE IF EXISTS` + `CREATE TABLE`** to refresh — loses time-travel history. Use `TRUNCATE TABLE` + `INSERT INTO`.301- **MERGE in production** — GA, but table-level snapshot-conflict detection makes concurrent writers likely to fail. Prefer DELETE + INSERT when isolation matters.302- **ALTER COLUMN in production** — in preview; prefer CTAS + `sp_rename` for production-critical column-type changes (Schema Evolution).303- **Variables in CTAS** — not allowed. Wrap in dynamic SQL: `EXEC sp_executesql N'CREATE TABLE ...'`.304- **DML on Lakehouse/Mirrored DB SQLEP** — read-only for table data. Only views/funcs/procs can be authored.305- **Concurrent UPDATE/DELETE on same table** — snapshot isolation conflicts at table level. Serialize writes.306- **Rapid-fire MCP calls** — rate limit is 20 req/min. Consolidate multiple statements into one batch where possible.307- **MARS** — not supported. Remove `MultipleActiveResultSets` from connection strings.308309### PREFER310311- **CTAS** over `CREATE TABLE` + `INSERT` — parallel, single-operation.312- **`INSERT ... SELECT`** over singleton INSERTs.313- **`COPY INTO`** for external file ingestion — highest throughput.314- **DELETE + INSERT** over MERGE for upserts in production.315- **`TRUNCATE TABLE`** over `DELETE FROM` without WHERE — faster, preserves history.316- **Consolidating related DDL** into a single `fabric-sqlendpoint-execute_query` call when no `GO` is required between statements.317- **CTAS + sp_rename** for large-scale transforms instead of UPDATE.318- **`fabric-sqlendpoint-execute_query` MCP tool** over sqlcmd for all T-SQL operations.319- **`SET NOCOUNT ON;`** prefix — reduces metadata noise in results.320- **`TOP N` or `WHERE`** clauses — stay within 10K row limit.321322### TROUBLESHOOTING323324| Symptom | Fix |325|---|---|326| Error 24556/24706 snapshot conflict | Serialize writes to same table; retry with backoff |327| COPY INTO auth error | Grant Storage Blob Data Reader on ADLS; or SAS in CREDENTIAL |328| COPY INTO from OneLake fails | Provision workspace identity; check firewall rules |329| CTAS unexpected types | Use explicit `CAST()` in SELECT |330| Singleton INSERT poor perf | Remediate: CTAS + drop + rename to consolidate Parquet |331| `fabric-sqlendpoint-execute_query` tool not available | MCP server not registered — user must add Fabric SQL Endpoint MCP server |332| HTTP 429 rate limit exceeded | Wait 60s and retry; consolidate queries into fewer calls |333| Query timeout (300s) | Break into smaller operations; for COPY INTO, check source file sizes |334| sp_rename on SQLEP fails | Only available on Warehouse, not Lakehouse/Mirrored DB |335| Deploy drops/recreates table | Avoid ALTER TABLE in DB project; apply manually |336| Only last result set returned | MCP returns only the final SELECT. Split multi-SELECT batches into separate calls. |337| Binary columns unreadable | Columns with `[base64]` suffix are base64-encoded. Decode if needed. |338