{"id":6760,"date":"2026-07-12T02:07:29","date_gmt":"2026-07-12T10:07:29","guid":{"rendered":"https:\/\/www.gudusoft.com\/azure-sql-data-lineage\/"},"modified":"2026-07-12T02:07:29","modified_gmt":"2026-07-12T10:07:29","slug":"azure-sql-data-lineage","status":"publish","type":"page","link":"https:\/\/www.gudusoft.com\/es\/azure-sql-data-lineage\/","title":{"rendered":"Azure SQL Data Lineage: Column Lineage for Azure SQL and Synapse SQL"},"content":{"rendered":"<p><strong>Azure SQL data lineage<\/strong> is the column-by-column map of how data flows through the T-SQL code running in Azure SQL Database, Azure SQL Managed Instance, and Synapse SQL: which source columns feed each target column, through which views, stored procedures, joins, and functions. The most accurate way to build it is to parse the T-SQL itself. <a href=\"https:\/\/www.gudusoft.com\/es\/sql-data-lineage-tool\/\">Flujo de SQL de Gudu<\/a> does exactly that with a dedicated Azure SQL dialect parser, and can push the resulting column-level lineage into Microsoft Purview so it appears alongside the rest of your Azure estate.<\/p>\n\n\n\n<div class=\"wp-block-group alignfull has-background is-layout-constrained\" style=\"background-color:#eef7fb;padding-top:24px;padding-bottom:24px\"><div class=\"wp-block-group__inner-container\">\n\n<p><strong>Try it in 30 seconds:<\/strong> paste any Azure SQL query or stored procedure into the <a href=\"https:\/\/sqlflow.gudusoft.com\/?utm_source=gudusoft&amp;utm_medium=website&amp;utm_campaign=azure-sql-data-lineage\" target=\"_blank\" rel=\"noreferrer noopener\">free SQLFlow lineage visualizer<\/a>, select the Azure SQL dialect, and get an interactive column-level lineage diagram. The Cloud edition has a free tier.<\/p>\n\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Why Azure SQL data lineage is a parsing problem<\/h2>\n\n\n\n<p>On Azure, the transformation logic that actually shapes your data rarely lives in a pipeline definition. It lives in T-SQL: views layered on views, stored procedures called from Azure Data Factory activities, <code>MERGE<\/code> statements, temp tables, and dynamic SQL assembled at runtime. A lineage picture built only from pipeline metadata sees the boxes but not what happens inside them.<\/p>\n\n\n\n<p>To know that <code>report.monthly_revenue<\/code> is computed as <code>SUM(orders.amount)<\/code> filtered by <code>orders.status<\/code>, something has to read the SQL the way the database engine does: resolve every column reference through CTEs, subqueries, views, and <code>SELECT *<\/code> expansion, then track dataflow from source columns to target columns. That is static SQL analysis, and it is what SQLFlow is built for. It reads SQL code and schema metadata only; it never touches the rows in your tables.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Where Microsoft Purview stops, and how parsing fills the gap<\/h2>\n\n\n\n<p>Microsoft Purview is genuinely good at what a catalog-first platform should do: scanning and classifying assets across an Azure estate, mapping sensitive data, and showing lineage for the data movement tools it integrates with, such as Azure Data Factory and Synapse pipelines. If you run Azure at any scale, Purview is a reasonable place for lineage to be <em>displayed<\/em>.<\/p>\n\n\n\n<p>The gap is in how the lineage gets <em>computed<\/em>. Purview&#8217;s automated SQL lineage has gaps on complex T-SQL: stored procedures with control flow, temp-table staging, and dynamic SQL built with <code>sp_executesql<\/code> are precisely the places where automated coverage runs out and lineage edges go missing. Those are also the places where the highest-risk transformations live.<\/p>\n\n\n\n<p>The division of labor that works: SQLFlow parses the T-SQL and computes column-level lineage, including through procedures and dynamic SQL, then exports it through its Microsoft Purview adapter. SQLFlow does the computation; Purview does the estate-wide display. You keep one catalog, and the SQL-heavy corners of it stop being blank.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What SQLFlow extracts from Azure SQL code<\/h2>\n\n\n\n<p>SQLFlow ships 39 dialect-specific parsers rather than one generic ANSI grammar, and Azure SQL is one of them, in the T-SQL family alongside SQL Server. Synapse dedicated SQL pools speak T-SQL too, so the same analysis applies to Synapse SQL scripts. For Azure SQL code, SQLFlow produces:<\/p>\n\n\n\n<ul><li><strong>Column-level lineage:<\/strong> for each output column, the exact source columns that feed it and the functions, casts, subqueries, joins, and set operators in between. References are resolved through CTEs, views, subqueries, and star expansion.<\/li>\n<li><strong>Direct vs indirect lineage:<\/strong> a column used in a <code>WHERE<\/code> clause, <code>JOIN<\/code> condition, or <code>GROUP BY<\/code> never lands in the output but still shapes it. SQLFlow models this as a separate, toggleable relationship type, so impact analysis catches filter columns that most lineage tools ignore.<\/li>\n<li><strong>Stored procedure lineage:<\/strong> a dedicated procedural parser for the T-SQL family traces dataflow through procedure parameters and temp tables, and renders an interactive call graph of which procedures invoke which.<\/li>\n<li><strong>Dynamic SQL resolution:<\/strong> SQL assembled inside a procedure and executed with <code>EXEC<\/code> o <code>sp_executesql<\/code> is resolved and analyzed instead of skipped. This is the single most common blind spot in automated lineage.<\/li>\n<li><strong>ER diagrams from DDL:<\/strong> primary and foreign key relationships inferred from your table definitions, drawn as an entity-relationship diagram.<\/li><\/ul>\n\n\n\n<p>Input can be pasted SQL, uploaded script files, or live metadata pulled over JDBC, so you can point SQLFlow at an Azure SQL database and let it collect view and procedure definitions itself.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Example: a T-SQL procedure with dynamic SQL<\/h2>\n\n\n\n<p>Here is the kind of procedure that breaks automated lineage scanners. It stages data into a temp table, then builds the final <code>INSERT<\/code> as a string and executes it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE PROCEDURE dbo.usp_refresh_regional_sales\n    @region NVARCHAR(50)\nAS\nBEGIN\n    SELECT o.customer_id,\n           SUM(o.amount) AS total_amount\n    INTO   #staged\n    FROM   dbo.orders AS o\n    WHERE  o.region = @region\n    GROUP BY o.customer_id;\n\n    DECLARE @sql NVARCHAR(MAX) = N'\n        INSERT INTO dbo.regional_sales (customer_id, customer_name, total_amount)\n        SELECT s.customer_id, c.customer_name, s.total_amount\n        FROM   #staged AS s\n        JOIN   dbo.customers AS c\n               ON c.customer_id = s.customer_id;';\n\n    EXEC sp_executesql @sql;\nEND<\/code><\/pre>\n\n\n\n<p>A scanner that stops at the procedure boundary reports nothing useful here: the target table only appears inside a string literal. SQLFlow parses the procedure body, resolves the dynamic SQL, and follows the dataflow through the temp table, producing:<\/p>\n\n\n\n<ul><li><code>regional_sales.total_amount<\/code> &larr; <code>SUM(orders.amount)<\/code>, via <code>#staged.total_amount<\/code> (direct lineage).<\/li>\n<li><code>regional_sales.customer_name<\/code> &larr; <code>customers.customer_name<\/code> (direct lineage).<\/li>\n<li><code>orders.region<\/code> and the join keys <code>customers.customer_id<\/code> \/ <code>orders.customer_id<\/code> flagged as indirect lineage: they filter and connect the result without appearing in it.<\/li><\/ul>\n\n\n\n<p>Rename <code>orders.region<\/code> and a pipeline-metadata view of the world says nothing depends on it. The parsed view says this procedure silently starts refreshing an empty table. That is the difference column-level lineage makes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Feeding the lineage into Microsoft Purview<\/h2>\n\n\n\n<p>Enterprise SQLFlow deployments include export adapters for Microsoft Purview, DataHub, and OpenMetadata. The workflow for an Azure shop is straightforward: SQLFlow batch-scans the databases (it scales to estates of 100+ databases and over a million columns, with incremental scans and a persistent lineage repository), computes column-level lineage from the actual T-SQL, and publishes it to Purview. Analysts and stewards keep working in the catalog they already use; the lineage behind it is parser-grade instead of best-effort.<\/p>\n\n\n\n<p>If you prefer to build your own integration, the same lineage is available as JSON or CSV export and through a REST API.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Deployment options for Azure environments<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Edition<\/th><th>Best for<\/th><th>How it runs<\/th><\/tr><\/thead><tbody>\n<tr><td>Nube SQLFlow<\/td><td>Trying it on real queries today<\/td><td>SaaS with a free tier; premium is $49.99\/month. Paste T-SQL or connect sources in the browser.<\/td><\/tr>\n<tr><td><a href=\"https:\/\/www.gudusoft.com\/es\/version-local-de-sqlflow\/\">SQLFlow local<\/a><\/td><td>Regulated workloads where SQL text must stay inside the network<\/td><td>Docker\/Kubernetes in your own Azure subscription or data center, air-gapped if needed. $500\/month or $4,800 one-time per selected database type, installable on two servers.<\/td><\/tr>\n<tr><td>REST API \/ Java library \/ CLI<\/td><td>Automating lineage inside CI or a data platform<\/td><td>The same analysis engine, callable from pipelines and JVM applications.<\/td><\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<p>Whichever edition you run, the privacy posture is the same: SQLFlow performs static analysis of SQL code only and never reads table row data.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Azure SQL, SQL Server, or something else?<\/h2>\n\n\n\n<p>Azure SQL and on-premises SQL Server share the T-SQL family but are separate dialects in SQLFlow, each with its own parser. If your estate is anchored on self-hosted SQL Server, the <a href=\"https:\/\/www.gudusoft.com\/es\/sql-server-data-lineage\/\">SQL Server data lineage<\/a> page covers that side in detail; hybrid estates can analyze both in one repository. And if you are still comparing approaches (catalog-native lineage, runtime log-based lineage, open-source parsers), the survey of the <a href=\"https:\/\/www.gudusoft.com\/es\/best-data-lineage-tools\/\">Las mejores herramientas de linaje de datos<\/a> lays out where each category fits and where SQL parsing is the right answer.<\/p>\n\n\n\n<p>Under the hood, all of this runs on the General SQL Parser engine, developed commercially since the mid-2000s and validated against roughly 13,600 per-dialect SQL test fixtures. Depth on hard SQL is the product.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Frequently asked questions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Does SQLFlow support Azure Synapse SQL?<\/h3>\n\n\n<p>Yes. Synapse dedicated SQL pools use T-SQL, and SQLFlow&#8217;s Azure SQL dialect parser covers the T-SQL family. You can analyze Synapse SQL scripts, views, and stored procedures the same way as Azure SQL Database code.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Can SQLFlow trace lineage through dynamic SQL in stored procedures?<\/h3>\n\n\n<p>Yes. SQL assembled inside a procedure and executed with <code>EXEC<\/code> o <code>sp_executesql<\/code> is resolved and analyzed rather than skipped, and lineage is traced through procedure parameters and temp tables. SQLFlow also draws a call graph of procedure-to-procedure invocations.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How does SQLFlow lineage get into Microsoft Purview?<\/h3>\n\n\n<p>Through a built-in export adapter available in enterprise deployments. SQLFlow computes column-level lineage by parsing your T-SQL, then publishes it to Purview so it appears in the catalog alongside Purview&#8217;s own scans. JSON, CSV, and REST API outputs are available for custom integrations.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Does SQLFlow need access to the data in my Azure SQL tables?<\/h3>\n\n\n<p>No. SQLFlow performs static analysis of SQL code and optionally reads schema metadata (table, view, and procedure definitions) over JDBC. It never reads rows. The On-Premise edition keeps even the SQL text inside your network.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What does column-level lineage add over Purview&#8217;s asset-level view?<\/h3>\n\n\n<p>Precision. Asset-level lineage says a table feeds a report; column-level lineage says which specific columns feed which, through which transformations, and additionally flags columns that influence results only through filters and joins. That is the granularity impact analysis and audit questions actually require.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How much does SQLFlow cost?<\/h3>\n\n\n<p>SQLFlow Cloud starts free; premium accounts are $49.99\/month. SQLFlow On-Premise is $500\/month or $4,800 one-time per selected database type. Full details are on the <a href=\"https:\/\/www.gudusoft.com\/es\/precios\/\">pricing page<\/a>.<\/p>\n\n\n\n<div class=\"wp-block-group alignfull has-background is-layout-constrained\" style=\"background-color:#60d5f6;padding-top:32px;padding-bottom:32px\"><div class=\"wp-block-group__inner-container\">\n\n<h2 class=\"wp-block-heading\">See your Azure SQL lineage now<\/h2>\n\n\n<p>Paste your gnarliest T-SQL procedure into the free visualizer, or talk to us about scanning your Azure estate and exporting to Purview.<\/p>\n\n\n<div class=\"wp-block-buttons is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/sqlflow.gudusoft.com\/?utm_source=gudusoft&amp;utm_medium=website&amp;utm_campaign=azure-sql-data-lineage\" target=\"_blank\" rel=\"noreferrer noopener\">Try SQLFlow free<\/a><\/div>\n\n\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/www.gudusoft.com\/es\/contacto\/\">Request an enterprise demo<\/a><\/div>\n<\/div>\n\n<\/div><\/div>\n\n\n\n<script type=\"application\/ld+json\">{\n    \"@context\": \"https:\\\/\\\/schema.org\",\n    \"@graph\": [\n        {\n            \"@type\": \"SoftwareApplication\",\n            \"name\": \"Gudu SQLFlow\",\n            \"applicationCategory\": \"DeveloperApplication\",\n            \"applicationSubCategory\": \"SQL Data Lineage Tool\",\n            \"operatingSystem\": \"Web, Linux, Windows, macOS\",\n            \"url\": \"https:\\\/\\\/www.gudusoft.com\\\/azure-sql-data-lineage\\\/\",\n            \"description\": \"SQL data lineage tool for Azure SQL and Synapse SQL that parses T-SQL, including stored procedures and dynamic SQL, to produce column-level lineage and export it to Microsoft Purview.\",\n            \"featureList\": \"Azure SQL dialect parser, column-level lineage, direct and indirect lineage, T-SQL stored procedure call graphs, dynamic SQL analysis, ER diagram generation, Microsoft Purview export, REST API\",\n            \"softwareVersion\": \"8.2.3\",\n            \"offers\": [\n                {\n                    \"@type\": \"Offer\",\n                    \"name\": \"SQLFlow Cloud Free\",\n                    \"price\": \"0\",\n                    \"priceCurrency\": \"USD\"\n                },\n                {\n                    \"@type\": \"Offer\",\n                    \"name\": \"SQLFlow Cloud Premium\",\n                    \"price\": \"49.99\",\n                    \"priceCurrency\": \"USD\",\n                    \"priceSpecification\": {\n                        \"@type\": \"UnitPriceSpecification\",\n                        \"price\": \"49.99\",\n                        \"priceCurrency\": \"USD\",\n                        \"billingIncrement\": 1,\n                        \"unitText\": \"MONTH\"\n                    }\n                },\n                {\n                    \"@type\": \"Offer\",\n                    \"name\": \"SQLFlow On-Premise\",\n                    \"price\": \"4800\",\n                    \"priceCurrency\": \"USD\"\n                }\n            ],\n            \"publisher\": {\n                \"@type\": \"Organization\",\n                \"name\": \"Gudu Software\",\n                \"url\": \"https:\\\/\\\/www.gudusoft.com\\\/\"\n            }\n        },\n        {\n            \"@type\": \"FAQPage\",\n            \"mainEntity\": [\n                {\n                    \"@type\": \"Question\",\n                    \"name\": \"Does SQLFlow support Azure Synapse SQL?\",\n                    \"acceptedAnswer\": {\n                        \"@type\": \"Answer\",\n                        \"text\": \"Yes. Synapse dedicated SQL pools use T-SQL, and SQLFlow's Azure SQL dialect parser covers the T-SQL family. You can analyze Synapse SQL scripts, views, and stored procedures the same way as Azure SQL Database code.\"\n                    }\n                },\n                {\n                    \"@type\": \"Question\",\n                    \"name\": \"Can SQLFlow trace lineage through dynamic SQL in stored procedures?\",\n                    \"acceptedAnswer\": {\n                        \"@type\": \"Answer\",\n                        \"text\": \"Yes. SQL assembled inside a procedure and executed with EXEC or sp_executesql is resolved and analyzed rather than skipped, and lineage is traced through procedure parameters and temp tables. SQLFlow also draws a call graph of procedure-to-procedure invocations.\"\n                    }\n                },\n                {\n                    \"@type\": \"Question\",\n                    \"name\": \"How does SQLFlow lineage get into Microsoft Purview?\",\n                    \"acceptedAnswer\": {\n                        \"@type\": \"Answer\",\n                        \"text\": \"Through a built-in export adapter available in enterprise deployments. SQLFlow computes column-level lineage by parsing your T-SQL, then publishes it to Purview so it appears in the catalog alongside Purview's own scans. JSON, CSV, and REST API outputs are available for custom integrations.\"\n                    }\n                },\n                {\n                    \"@type\": \"Question\",\n                    \"name\": \"Does SQLFlow need access to the data in my Azure SQL tables?\",\n                    \"acceptedAnswer\": {\n                        \"@type\": \"Answer\",\n                        \"text\": \"No. SQLFlow performs static analysis of SQL code and optionally reads schema metadata (table, view, and procedure definitions) over JDBC. It never reads rows. The On-Premise edition keeps even the SQL text inside your network.\"\n                    }\n                },\n                {\n                    \"@type\": \"Question\",\n                    \"name\": \"What does column-level lineage add over Purview's asset-level view?\",\n                    \"acceptedAnswer\": {\n                        \"@type\": \"Answer\",\n                        \"text\": \"Precision. Asset-level lineage says a table feeds a report; column-level lineage says which specific columns feed which, through which transformations, and additionally flags columns that influence results only through filters and joins. That is the granularity impact analysis and audit questions actually require.\"\n                    }\n                },\n                {\n                    \"@type\": \"Question\",\n                    \"name\": \"How much does SQLFlow cost?\",\n                    \"acceptedAnswer\": {\n                        \"@type\": \"Answer\",\n                        \"text\": \"SQLFlow Cloud starts free; premium accounts are $49.99\\\/month. SQLFlow On-Premise is $500\\\/month or $4,800 one-time per selected database type.\"\n                    }\n                }\n            ]\n        }\n    ]\n}<\/script>","protected":false},"excerpt":{"rendered":"<p>Azure SQL data lineage is the column-by-column map of how data flows through the T-SQL code running in Azure SQL Database, Azure SQL Managed Instance, and Synapse SQL: which source columns feed each target column, through which views, stored procedures, joins, and functions. The most accurate way to build it is to parse the T-SQL itself. Gudu SQLFlow does exactly that with a dedicated Azure SQL dialect parser, and can push the resulting column-level lineage into Microsoft Purview so it appears alongside the rest of your Azure estate. Try it in 30 seconds: paste any Azure SQL query or stored\u2026<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":5}},"_links":{"self":[{"href":"https:\/\/www.gudusoft.com\/es\/wp-json\/wp\/v2\/pages\/6760"}],"collection":[{"href":"https:\/\/www.gudusoft.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.gudusoft.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.gudusoft.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gudusoft.com\/es\/wp-json\/wp\/v2\/comments?post=6760"}],"version-history":[{"count":0,"href":"https:\/\/www.gudusoft.com\/es\/wp-json\/wp\/v2\/pages\/6760\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.gudusoft.com\/es\/wp-json\/wp\/v2\/media?parent=6760"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}