{"id":4778,"date":"2025-09-16T08:00:43","date_gmt":"2025-09-16T15:00:43","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/azure-sql\/?p=4778"},"modified":"2025-09-16T07:41:02","modified_gmt":"2025-09-16T14:41:02","slug":"ai-based-t-sql-refactoring-an-automatic-intelligent-code-optimization-with-azure-openai","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/azure-sql\/ai-based-t-sql-refactoring-an-automatic-intelligent-code-optimization-with-azure-openai\/","title":{"rendered":"AI-based T-SQL Refactoring: an automatic intelligent code optimization with Azure OpenAI"},"content":{"rendered":"<p><div class=\"alert alert-info\"><p class=\"alert-divider\"><i class=\"fabric-icon fabric-icon--Info\"><\/i><strong>Guest Post<\/strong><\/p>Saverio Lorenzini<span data-teams=\"true\">\u00a0is a Senior Cloud Solution Architect <\/span><span data-teams=\"true\">with over 25 years of expertise in SQL Server. He specializes in migrations, performance tuning, and\u00a0 optimization. <\/span>This fantastic work that shows a very practical use of AI to help DBAs and DEVs to create better and smarted SQL code, was presented by the author at the Microsoft TechConnect internal conference in Seattle, February 2025, and Saverio was so kind to also agree to publish his work here. Thanks Saverio!<\/div><\/p>\n<p>This article presents an AI-powered approach to automating SQL Server code analysis and refactoring. The system intelligently identifies inefficiencies and common T-SQL anti-patterns, applying best practices through a set of formalized coding rules, using prompt-driven instructions. It not only automatically rewrites problematic and inefficient code but also delivers contextual recommendations to improve quality, security, and maintainability.<\/p>\n<p>Designed to address real-world use cases, this methodology enables organizations to modernize and optimize their SQL workloads more efficiently, accelerating migrations and reducing manual effort in scenarios with large SQL codebases.<\/p>\n<p>The article outlines the architecture of the AI-driven SQL refactoring system and the mechanisms through which it provides intelligent code transformation, with demonstrations highlighting the benefits. The explained technique is a tangible advancement in SQL Server application development and maintenance, reducing manual effort and improving code quality and performance. Sample code is available on GitHub. Link at the end of the article.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/06\/Structure.png\"><img decoding=\"async\" class=\"aligncenter wp-image-4896\" style=\"display: block; margin: 0 auto;\" src=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/06\/Structure-300x95.png\" alt=\"Structure image\" width=\"610\" height=\"193\" srcset=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/06\/Structure-300x95.png 300w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/06\/Structure-1024x325.png 1024w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/06\/Structure-768x244.png 768w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/06\/Structure.png 1155w\" sizes=\"(max-width: 610px) 100vw, 610px\" \/><\/a><\/p>\n<h2>Improving T-SQL code via AI<\/h2>\n<p>The key point of the proposed approach is to identify specific cases of suboptimal SQL code and instruct the AI model on how to refactor them more effectively. The following sections describe key categories of problematic SQL coding patterns that the AI-driven refactoring solution targets.<\/p>\n<ul>\n<li><strong>T-SQL Anti-Patterns: <\/strong>T-SQL anti-patterns are common coding practices that seem reasonable but lead to performance degradation, poor maintainability, or incorrect results. An example is using SELECT * expressions.<\/li>\n<li><strong>Non-SARGable Queries: <\/strong>\u00a0Non-SARGable (Non-Search ARGument ABLE) queries cannot effectively use indexes, leading to slower performance and higher resource consumption. Examples include using functions or operators on indexed columns (e.g., WHERE YEAR(OrderDate) = 2022) which prevent index usage and result in full scans.<\/li>\n<li><strong>Not Secure Queries: <\/strong>\u00a0Queries that expose databases to security vulnerabilities, such as SQL injection, typically due to improper input handling or unsafe query construction. Example: Directly embedding user input into queries without proper validation (e.g.: SELECT * FROM Users WHERE Username = &#8216;&#8221; + user_input + &#8220;&#8216;).<\/li>\n<li><strong>Inefficient Queries: <\/strong>\u00a0Queries that consume excessive CPU, memory, or I\/O resources, due to design issues such as unnecessary joins, redundant subqueries, or full table scans. These lead to longer execution times, slowing down database performance.<\/li>\n<\/ul>\n<h2>Some Practical Examples<\/h2>\n<p>To illustrate these anti-patterns in practice, the following three examples demonstrate common pitfalls in T-SQL coding and their impact on performance, maintainability, and security.<\/p>\n<h3>Automatic rewrite of SELECT * and ORDER BY n (anti-patterns)<\/h3>\n<p>In the example below, the original query has been rewritten according to two T-SQL development best practices:<\/p>\n<ul>\n<li>Avoid using <code data-start=\"82\" data-end=\"92\">SELECT *<\/code>. It retrieves all columns (including potential unnecessary), increasing I\/O and memory. Instead, select only the columns needed later in the code. This reduces data load, improves performance, and keeps code cleaner. In the example, <code data-start=\"296\" data-end=\"299\">*<\/code> was replaced with only required columns: <code data-start=\"341\" data-end=\"352\">ProductID,<\/code>\u00a0<code data-start=\"357\" data-end=\"368\">LineTotal<\/code> and\u00a0 <code data-start=\"357\" data-end=\"368\">OrderQty.<\/code><\/li>\n<li>In ORDER BY, relying on numeric positions can lead to errors if the SELECT clause is later modified, changing the order of selected columns without updating the ORDER BY clause. This sorts the results set by unintended columns, potentially resulting in incorrect results and silent bug. It is recommended to explicitly use column names instead of column position numbers.<\/li>\n<\/ul>\n<table style=\"border-collapse: collapse; width: 95.1024%; border: none; height: 180px;\">\n<tbody>\n<tr style=\"height: 238px;\">\n<td style=\"width: 39.1388%; height: 180px;\">\n<pre class=\"prettyprint language-sql\"><code class=\"language-sql\">--discouraged\r\nWITH alpha AS (\r\nSELECT *\r\nFROM Sales.SalesOrderDetail\r\nWHERE SalesOrderID &gt; 1500\r\n)\r\nSELECT ProductID, LineTotal, OrderQty\r\nFROM alpha\r\nORDER BY 1, 3<\/code><\/pre>\n<\/td>\n<td style=\"width: 14.354%; background-color: #f9f8fe; border: none; height: 180px;\"><a href=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/07\/Freccia7.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-5727\" src=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/07\/Freccia7.jpg\" alt=\"Freccia7 image\" width=\"86\" height=\"61\" \/><\/a><\/td>\n<td style=\"width: 40.8814%; height: 180px;\">\n<pre class=\"prettyprint language-sql\"><code class=\"language-sql\">--good practice\r\nWITH alpha AS (\r\nSELECT ProductID, LineTotal, OrderQty\r\nFROM Sales.SalesOrderDetail\r\nWHERE SalesOrderID &gt; 1500\r\n)\r\nSELECT ProductID, LineTotal, OrderQty\r\nFROM alpha\r\nORDER BY <\/code>ProductID, OrderQty<code class=\"language-sql\"><\/code><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3><\/h3>\n<h3>Automatic rewrite of arithmetic conditions (non-sargable)<\/h3>\n<p>Simple arithmetic expressions can be written differently to force the execution plan to change from using a table or index Scan to Index Seek. The following example is on AdventurWorks2022. Since the SalesOrderID is multiplied, the condition SalesOrderID * 3 &lt; 1200 may prevent SQL Server from effectively using the existing PK index. That&#8217;s because SQL Server evaluates the multiplication result and not the column data, &#8216;hiding&#8217; the indexed data. It compares each single multiplication result to 1200, leading to a Scan on the column. The model is able to rewrite the WHERE condition by moving the arithmetic operation to the right side of the predicate. This preserves the original semantics while making the indexed column directly searchable, enabling SQL Server to perform an Index Seek instead of a Scan.<\/p>\n<table style=\"width: 89.3071%; border-collapse: collapse; border: none;\">\n<tbody>\n<tr>\n<td style=\"vertical-align: top; width: 43.2579%; border: none;\">\n<pre style=\"line-height: 1.2; margin: 0;\"><code class=\"language-sql\">--NOT Sargable: index scan\r\nSELECT UnitPrice, OrderQty \r\nFROM Sales.SalesOrderDetail\r\nWHERE SalesOrderID * 3 &lt; 1200\r\n<\/code><\/pre>\n<\/td>\n<td style=\"width: 17.3613%; background-color: #f9f8fe; border: none;\"><\/td>\n<td style=\"vertical-align: top; width: 57.3802%;\">\n<pre style=\"line-height: 1.2; margin: 0;\"><code class=\"language-sql\"> -- SARGABLE: Index Seek\r\nSELECT UnitPrice, OrderQty \r\nFROM Sales.SalesOrderDetail\r\nWHERE SalesOrderID &lt; 1200 \/ 3 \r\n<\/code><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/06\/Arithmetic_expressions_3.3-1.jpg\"><img decoding=\"async\" class=\"alignnone wp-image-4934\" src=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/06\/Arithmetic_expressions_3.3-1-300x44.jpg\" alt=\"Arithmetic expressions 3 3 image\" width=\"805\" height=\"118\" srcset=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/06\/Arithmetic_expressions_3.3-1-300x44.jpg 300w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/06\/Arithmetic_expressions_3.3-1-1024x151.jpg 1024w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/06\/Arithmetic_expressions_3.3-1-768x113.jpg 768w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/06\/Arithmetic_expressions_3.3-1-1536x226.jpg 1536w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/06\/Arithmetic_expressions_3.3-1-2048x302.jpg 2048w\" sizes=\"(max-width: 805px) 100vw, 805px\" \/><\/a><\/p>\n<p>Rewriting arithmetic conditions in order to avoid operators and functions applied to indexed columns provide most performance improvements. The histogram below refers to the above example.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/09\/Performance4.jpg\"><img decoding=\"async\" class=\"aligncenter wp-image-5949\" src=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/09\/Performance4-300x81.jpg\" alt=\"Performance4 image\" width=\"726\" height=\"196\" srcset=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/09\/Performance4-300x81.jpg 300w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/09\/Performance4-1024x278.jpg 1024w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/09\/Performance4-768x208.jpg 768w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/09\/Performance4.jpg 1412w\" sizes=\"(max-width: 726px) 100vw, 726px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<h3>Remove Unused and Irrelevant code (inefficient code)<\/h3>\n<p>Removing unused or irrelevant code is essential for improving application clarity, performance, and maintainability<em>. <\/em><\/p>\n<p><strong><em>Unused code<\/em><\/strong> refers to portions of code that are written but never executed during the lifecycle of an application. This can include declared variables that are never utilized, temporary tables that are created but never populated, or entire logic blocks that remain unreachable.<\/p>\n<p><strong><em>Irrelevant code<\/em><\/strong> (unuseful), on the other hand, may be executed but has no impact in the current context. It may have served a purpose in an earlier version of the application or been introduced as a placeholder during development without being finalized or removed.\nIn the example below, the original function contains unused parameters, superfluous local variables, and irrelevant logic. With the right prompts and guidance, an OpenAI model can detect and eliminate these elements, resulting in cleaner, more efficient and maintainable code.<\/p>\n<table style=\"width: 94.5661%; border-collapse: collapse; height: 433px; border: none;\">\n<tbody>\n<tr style=\"height: 350px;\">\n<td style=\"vertical-align: top; width: 46.4996%; height: 350px;\"><a href=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/07\/Unused_code1.png\"><img decoding=\"async\" class=\"alignnone wp-image-5710\" src=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/07\/Unused_code1-288x300.png\" alt=\"Unused code1 image\" width=\"407\" height=\"424\" srcset=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/07\/Unused_code1-288x300.png 288w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/07\/Unused_code1-768x801.png 768w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/07\/Unused_code1-24x24.png 24w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/07\/Unused_code1.png 968w\" sizes=\"(max-width: 407px) 100vw, 407px\" \/><\/a><\/td>\n<td style=\"width: 11.9902%; background-color: #f9f8fe; border: none; height: 350px;\">&nbsp;<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/07\/Freccia7.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-5727\" src=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/07\/Freccia7.jpg\" alt=\"Freccia7 image\" width=\"86\" height=\"61\" \/><\/a><\/td>\n<td style=\"vertical-align: top; width: 59.5096%; height: 350px;\"><a href=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/07\/Unused_code2.png\"><img decoding=\"async\" class=\"alignnone wp-image-5711\" src=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/07\/Unused_code2-234x300.png\" alt=\"Unused code2 image\" width=\"276\" height=\"354\" srcset=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/07\/Unused_code2-234x300.png 234w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/07\/Unused_code2-768x986.png 768w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/07\/Unused_code2.png 786w\" sizes=\"(max-width: 276px) 100vw, 276px\" \/><\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Complete use cases list and project details on GitHub<\/h2>\n<p data-start=\"206\" data-end=\"628\">Over 20 real-world use cases have been collected to show how AI models can be guided to rewrite common T-SQL anti-patterns. These cover scenarios such as avoiding non-SARGable queries, preventing implicit conversions, and mitigating SQL injection risks, among others. Each example demonstrates the original code, the refactored version, and the measurable benefits in terms of performance, security, and maintainability.<\/p>\n<p data-start=\"630\" data-end=\"949\">For those who want to dive deeper, the full source code is available in the <strong>GitHub repository <a href=\"https:\/\/github.com\/Savelor\/SQLAIRefactor\">SQLAIRefactor<\/a><\/strong>. There you\u2019ll find not only all the use cases, but also detailed documentation of the AI solution\u2019s design, the refactoring rules, and practical guidance on how to adapt the approach to your own workloads.<\/p>\n<h2>Notes on AI models<\/h2>\n<p>Different language models have been employed in this work, each showing slightly different behaviors in handling SQL refactoring tasks. The main models tested include GPT-4o, GPT-4.1 and o3-mini. Although very small, the O3-mini\u00a0exhibits a limited form of reasoning\u2014sufficient for simple or highly guided tasks. Results in terms of refactoring are very good, with generally no hallucinations and precise coding.<\/p>\n<h3><strong>Temperature<\/strong><\/h3>\n<p>In GPT-4o and GPT-4.1 models the temperature parameter controls the randomness or creativity of the generated text. It is a value between 0 and 2.<\/p>\n<ul>\n<li>Low Temperature (e.g., 0.2): The model produces more deterministic and focused responses, often repeating the most probable output.<\/li>\n<li>High Temperature (e.g., 1.0 or above): The model generates more diverse and creative outputs, introducing variability and unpredictability.<\/li>\n<\/ul>\n<p>This parameter directly affects hallucinations\u2014when the model generates false or made-up information. At higher temperatures, hallucinations are more likely because the model takes more risks in word choice. At lower temperatures, responses are more reliable but less diverse. Tests on this solution have proven that value &lt;= 0.4 is a good balance, as hallucinations are not present and there\u2019s good determinism and high-quality responses<\/p>\n<h3><strong>Closed-loop feedback<\/strong><\/h3>\n<p>Particularly when using models like GPT-4o and GPT-4.1, in more complex use cases, the initial optimization may not always produce the most efficient outcome, even though the result is correct. While some rules appear to be applied properly, others can be partially implemented, resulting in a partial optimized code where further refinement is still possible.\nIn these cases, the result can be treated as an intermediate output and submitted back to the AI model for a second optimization pass, with the same ruleset. Tests demonstrate that this iterative approach yields significantly better results, effectively capturing optimization opportunities that were not fully addressed in the initial attempt.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/06\/Reaction2_Transparent.png\"><img decoding=\"async\" class=\"wp-image-5193 aligncenter\" src=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/06\/Reaction2_Transparent-300x98.png\" alt=\"Reaction2 Transparent image\" width=\"553\" height=\"181\" srcset=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/06\/Reaction2_Transparent-300x98.png 300w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/06\/Reaction2_Transparent-1024x335.png 1024w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/06\/Reaction2_Transparent-768x251.png 768w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/06\/Reaction2_Transparent-1536x502.png 1536w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2025\/06\/Reaction2_Transparent.png 1826w\" sizes=\"(max-width: 553px) 100vw, 553px\" \/><\/a><\/p>\n<h2>Conclusions<\/h2>\n<p>You can apply this approach at various stages of the software lifecycle, including development, maintenance, and migration. Solutions based on this methodology can significantly assist developers by automating and enhancing code-related tasks with high efficiency on large codebases.<\/p>\n<ul>\n<li><strong>Development: <\/strong>During the development phase, this solution can provide real-time support by offering design-time recommendations, identifying and fixing errors within scripts, returning corrected versions. It acts as an intelligent assistant, enhancing code quality as it is written.<\/li>\n<li><strong>Maintenance: <\/strong>In maintenance scenarios, the approach can automatically assess and refactor large volumes of code very quickly and efficiently. It ensures alignment with best practices by identifying anti-patterns and restructuring queries to comply with T-SQL guidelines and coding standards.<\/li>\n<li><strong>Migration: <\/strong>When migrating to T-SQL based applications, this solution helps produce compliant code by addressing specific syntax issues, deprecated features or unsupported functionalities in the target platform. This significantly reduces manual effort and the risk of post-migration failures.<\/li>\n<\/ul>\n<p>A very simple starting example of the solution is available on Github: <strong><a href=\"https:\/\/github.com\/Savelor\/SQLAIRefactor\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/Savelor\/SQLAIRefactor<\/a><\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This article presents an AI-powered approach to automating SQL Server code analysis and refactoring. The system intelligently identifies inefficiencies and common T-SQL anti-patterns, applying best practices through a set of formalized coding rules, using prompt-driven instructions. It not only automatically rewrites problematic and inefficient code but also delivers contextual recommendations to improve quality, security, and [&hellip;]<\/p>\n","protected":false},"author":191428,"featured_media":4896,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1,582,672,619],"tags":[465,675],"class_list":["post-4778","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-azure-sql","category-openai","category-sql-server-2025","category-t-sql","tag-azuresql","tag-refactor"],"acf":[],"blog_post_summary":"<p>This article presents an AI-powered approach to automating SQL Server code analysis and refactoring. The system intelligently identifies inefficiencies and common T-SQL anti-patterns, applying best practices through a set of formalized coding rules, using prompt-driven instructions. It not only automatically rewrites problematic and inefficient code but also delivers contextual recommendations to improve quality, security, and [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-json\/wp\/v2\/posts\/4778","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-json\/wp\/v2\/users\/191428"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-json\/wp\/v2\/comments?post=4778"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-json\/wp\/v2\/posts\/4778\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-json\/wp\/v2\/media\/4896"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-json\/wp\/v2\/media?parent=4778"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-json\/wp\/v2\/categories?post=4778"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-json\/wp\/v2\/tags?post=4778"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}