<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Azure SQL | The .NET Blog</title><link>https://thedotnetblog.com/es/tags/azure-sql/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>es</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Wed, 03 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/es/tags/azure-sql/index.xml" rel="self" type="application/rss+xml"/><item><title>NL2SQL Es la Inyección SQL de la Era Agéntica</title><link>https://thedotnetblog.com/es/news/emiliano-montesdeoca/nl2sql-agentic-sql-injection-mcp-server/</link><pubDate>Wed, 03 Jun 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/es/news/emiliano-montesdeoca/nl2sql-agentic-sql-injection-mcp-server/</guid><description>Antes de dejar que un agente consulte tu base de datos con lenguaje natural, lee esto. NL2SQL parece simple hasta que analizas la completitud del esquema, el indeterminismo y lo que SQL MCP Server realmente resuelve.</description><content:encoded>&lt;p&gt;Hay una versión del argumento de NL2SQL que suena perfecta: los usuarios hacen preguntas en lenguaje natural, los agentes generan SQL, los datos regresan. Menos pantallas, menos consultas, menos código. Simple.&lt;/p&gt;
&lt;p&gt;Luego lo piensas cinco minutos más.&lt;/p&gt;
&lt;h2 id="los-problemas-de-los-que-nadie-habla-en-la-demo"&gt;Los Problemas de los que Nadie Habla en la Demo&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Los esquemas no fueron diseñados para explicar las cosas.&lt;/strong&gt; Nombres de tablas crípticos, nombres de columnas inconsistentes, relaciones técnicamente válidas pero semánticamente inválidas sin predicados adicionales — esto es normal en bases de datos empresariales. No son errores, son simplemente la historia acumulada de cambios de negocio. Pero cuando le pides a un modelo que infiera intención de un esquema que no fue diseñado para comunicar intención, el modelo lo intentará de todas formas. No se rendirá. Generará su mejor consulta posible y devolverá resultados con confianza.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Los modelos no son deterministas.&lt;/strong&gt; Haz la misma pregunta sobre la misma base de datos dos veces y podrías obtener SQL diferente. El modelo está calculando probabilidades, y variaciones ligeras en el contexto generan salidas diferentes. No puedes probar tu camino hacia una garantía de que el agente siempre genera la consulta correcta.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La revisión del usuario no escala.&lt;/strong&gt; &amp;ldquo;Solo revisa cada consulta antes de la ejecución&amp;rdquo; suena seguro. Pero asume que los usuarios son expertos tanto en el modelo de datos como en SQL — exactamente las personas que no necesitaban la interfaz de lenguaje natural. También introduce sobrecarga cognitiva y una nueva clase de sesgo de confirmación, donde los usuarios abrumados por la complejidad de la consulta aprueban consultas inválidas en lugar de investigarlas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Y luego está la inyección.&lt;/strong&gt; En el desarrollo SQL tradicional, la parametrización resolvió la inyección porque la entrada del usuario llenaba parámetros, no la estructura SQL. Con NL2SQL, el modelo genera el SQL en sí. El prompt, el contexto del esquema, el historial de conversación y los datos recuperados influyen en lo que se ejecuta. Si alguien elabora un prompt que cambia lo que el modelo genera, eso es inyección — no a nivel de parámetro, sino a nivel de generación de consultas. Y a diferencia de eliminar una tabla (obvio, recuperable), la inyección NL2SQL produce consultas que devuelven resultados incorrectos sin ningún error visible. Las decisiones de negocio se toman sobre datos incorrectos.&lt;/p&gt;
&lt;h2 id="lo-que-sql-mcp-server-realmente-resuelve"&gt;Lo que SQL MCP Server Realmente Resuelve&lt;/h2&gt;
&lt;p&gt;Aquí es donde el artículo hace su punto práctico más útil. En lugar de dar a un agente acceso arbitrario al esquema y esperar lo mejor, SQL MCP Server expone una &lt;strong&gt;superficie API curada&lt;/strong&gt; construida sobre &lt;a href="https://learn.microsoft.com/en-us/azure/data-api-builder/overview"&gt;Data API builder&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;La diferencia importa: el agente no genera SQL. Llama a endpoints con nombre que devuelven formas de resultado predefinidas. El SQL se escribe una vez, por un desarrollador, y es determinista. El no-determinismo del agente se limita a elegir &lt;em&gt;qué&lt;/em&gt; endpoint llamar, no a construir consultas arbitrarias.&lt;/p&gt;
&lt;p&gt;Esto es análogo a lo que la parametrización hizo para la inyección SQL en el modelo de aplicación tradicional — eliminas la capacidad de construir consultas arbitrarias a partir de entrada no confiable.&lt;/p&gt;
&lt;h2 id="la-pregunta-correcta"&gt;La Pregunta Correcta&lt;/h2&gt;
&lt;p&gt;El artículo no dice &amp;ldquo;nunca uses NL2SQL.&amp;rdquo; Dice: sé deliberado sobre &lt;em&gt;dónde&lt;/em&gt; lo aplicas y &lt;em&gt;qué&lt;/em&gt; expones. Para análisis exploratorio en un entorno controlado, con un esquema limitado y acceso de solo lectura, NL2SQL podría estar bien. Para sistemas de producción donde las decisiones de negocio dependen de los resultados, una capa API curada es significativamente más segura.&lt;/p&gt;
&lt;p&gt;Honestidad: algunos problemas se resuelven genuinamente mejor con consultas estructuradas detrás de endpoints con nombre que con lenguaje natural a SQL. SQL MCP Server te da esa opción sin abandonar completamente la interfaz agéntica.&lt;/p&gt;
&lt;p&gt;Publicación original: &lt;a href="https://devblogs.microsoft.com/azure-sql/sql-mcp-server-nl2sql/"&gt;Considering NL2SQL? Should your database really be the prompt? How can SQL MCP Server help?&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Azure SQL Puede Generar Embeddings Ahora — En T-SQL Puro, Sin Capa de Aplicación</title><link>https://thedotnetblog.com/es/news/emiliano-montesdeoca/azure-sql-ai-generate-embeddings-ga-rag-tsql/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/es/news/emiliano-montesdeoca/azure-sql-ai-generate-embeddings-ga-rag-tsql/</guid><description>AI_GENERATE_EMBEDDINGS y CREATE EXTERNAL MODEL ahora están en GA en Azure SQL Database y Managed Instance. Pipelines RAG construidos completamente en T-SQL, sin movimiento de datos requerido.</description><content:encoded>&lt;p&gt;Si alguna vez has construido un pipeline RAG, conoces el impuesto del pipeline: tus datos viven en SQL, pero para generar embeddings necesitas extraerlos, llamar a una API de embeddings, gestionar lotes y límites de velocidad, y almacenar los resultados en algún lugar con búsqueda vectorial. A menudo en una base de datos completamente diferente.&lt;/p&gt;
&lt;p&gt;Azure SQL acaba de eliminar la mayor parte de eso con dos características que ahora están generalmente disponibles: &lt;code&gt;CREATE EXTERNAL MODEL&lt;/code&gt; y &lt;code&gt;AI_GENERATE_EMBEDDINGS&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="qué-hacen"&gt;Qué Hacen&lt;/h2&gt;
&lt;p&gt;Estas dos características de T-SQL funcionan como un pipeline integrado:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;CREATE EXTERNAL MODEL&lt;/code&gt;&lt;/strong&gt; — registra un endpoint de modelo de IA externo como un objeto de base de datos con nombre. Estableces la ubicación, el formato de API, el tipo de modelo y las credenciales una vez. Lo reutilizas en cualquier lugar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;AI_GENERATE_EMBEDDINGS&lt;/code&gt;&lt;/strong&gt; — una función T-SQL escalar que llama al modelo registrado y devuelve una matriz JSON de valores vectoriales. Funciona en sentencias SELECT, INSERT, UPDATE y MERGE.&lt;/p&gt;
&lt;p&gt;Juntos forman un pipeline de embeddings de extremo a extremo sin salir del motor SQL.&lt;/p&gt;
&lt;h2 id="el-flujo-de-trabajo-completo"&gt;El Flujo de Trabajo Completo&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- Paso 1: Registra tu proveedor de embeddings una vez
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;EXTERNAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MODEL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MyEmbeddingModel&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WITH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;LOCATION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://your-aoai-resource.openai.azure.com/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;API_FORMAT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Azure OpenAI&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MODEL_TYPE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;EMBEDDINGS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MODEL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;text-embedding-ada-002&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- Paso 2: Genera embeddings en línea en T-SQL
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AI_GENERATE_EMBEDDINGS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;USE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MODEL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MyEmbeddingModel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- Paso 3: Busca con distancia vectorial
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TOP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;VECTOR_DISTANCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;cosine&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AI_GENERATE_EMBEDDINGS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;USE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MODEL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MyEmbeddingModel&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ese es todo el pipeline: datos en SQL, embeddings generados en SQL, búsqueda de similitud en SQL. Sin capa de orquestación, sin ETL, sin base de datos vectorial separada.&lt;/p&gt;
&lt;h2 id="formatos-de-api-y-opciones-soportadas"&gt;Formatos de API y Opciones Soportadas&lt;/h2&gt;
&lt;p&gt;En GA, &lt;code&gt;API_FORMAT&lt;/code&gt; soporta &lt;strong&gt;Azure OpenAI&lt;/strong&gt; y &lt;strong&gt;OpenAI&lt;/strong&gt;. &lt;code&gt;MODEL_TYPE&lt;/code&gt; está bloqueado a &lt;code&gt;EMBEDDINGS&lt;/code&gt; por ahora. El JSON &lt;code&gt;PARAMETERS&lt;/code&gt; te permite establecer valores predeterminados a nivel de modelo incluyendo el conteo de reintentos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;PARAMETERS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{&amp;#34;sql_rest_options&amp;#34;:{&amp;#34;retry_count&amp;#34;:3}}&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La autenticación usa credenciales de base de datos, por lo que los secretos se mantienen fuera del código de tu aplicación.&lt;/p&gt;
&lt;h2 id="qué-habilita-esto-para-las-aplicaciones-net"&gt;Qué Habilita Esto para las Aplicaciones .NET&lt;/h2&gt;
&lt;p&gt;Para los desarrolladores .NET que construyen características de IA sobre datos SQL existentes, esto es significativo. No necesitas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Extraer datos a un almacén intermedio para embeddings&lt;/li&gt;
&lt;li&gt;Gestionar un pipeline de embeddings externo&lt;/li&gt;
&lt;li&gt;Configurar una base de datos vectorial separada (aunque puedes usar Azure AI Search si quieres un almacén vectorial completo)&lt;/li&gt;
&lt;li&gt;Cambiar la capa de acceso a datos de tu aplicación&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Puedes agregar búsqueda semántica a las aplicaciones SQL existentes de manera incremental, usando las mismas herramientas T-SQL que ya tienes.&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Los patrones RAG sobre datos SQL se han vuelto dramáticamente más simples. &lt;code&gt;AI_GENERATE_EMBEDDINGS&lt;/code&gt; + &lt;code&gt;CREATE EXTERNAL MODEL&lt;/code&gt; significa que tu aplicación SQL existente puede ganar capacidades de búsqueda vectorial sin agregar nueva infraestructura.&lt;/p&gt;
&lt;p&gt;Ambas características están en GA en Azure SQL Database y Azure SQL Managed Instance hoy.&lt;/p&gt;
&lt;p&gt;Post original: &lt;a href="https://devblogs.microsoft.com/azure-sql/generate-embeddings-function-and-external-model-object-support-are-now-generally-available-in-azure-sql/"&gt;Generate Embeddings Function and External Model Object Support Are Now Generally Available in Azure SQL&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Azure Data Studio se retira: mueve tu flujo de Azure SQL a VS Code</title><link>https://thedotnetblog.com/es/news/emiliano-montesdeoca/azure-data-studio-retired-move-to-vscode-sql/</link><pubDate>Sat, 09 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/es/news/emiliano-montesdeoca/azure-data-studio-retired-move-to-vscode-sql/</guid><description>Azure Data Studio se retiró el 6 de febrero de 2025, con soporte hasta el 28 de febrero de 2026. Aquí está la ruta de migración completa a VS Code con la extensión MSSQL.</description><content:encoded>&lt;p&gt;&lt;em&gt;Este post fue traducido automáticamente. Para la versión original, &lt;a href="https://thedotnetblog.com/es/news/emiliano-montesdeoca/azure-data-studio-retired-move-to-vscode-sql/"&gt;haz clic aquí&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/azure-sql/azure-data-studio-is-retired-move-your-azure-sql-workflow-to-vs-code-in-10-minutes/"&gt;Azure Data Studio se retiró el 6 de febrero de 2025&lt;/a&gt;, con soporte hasta el 28 de febrero de 2026 — el reemplazo recomendado es VS Code con la extensión MSSQL.&lt;/p&gt;
&lt;h2 id="qué-instalar"&gt;Qué instalar&lt;/h2&gt;
&lt;p&gt;Tres cosas para empezar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Extensión MSSQL&lt;/strong&gt; — busca &amp;ldquo;SQL Server (mssql)&amp;rdquo; en el Marketplace de VS Code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extensión SQL Database Projects&lt;/strong&gt; — esquema como código, validación de compilación, publicación guiada&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;.NET 8 SDK&lt;/strong&gt; — requerido por el sistema de compilación; el SDK faltante es el problema más común al primer uso&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="migrar-tus-conexiones-y-configuraciones-de-ads"&gt;Migrar tus conexiones y configuraciones de ADS&lt;/h2&gt;
&lt;p&gt;La extensión MSSQL incluye el &lt;strong&gt;ADS Migration Toolkit&lt;/strong&gt;, que gestiona la migración única en un flujo guiado: conexiones guardadas, grupos de conexiones, configuraciones y atajos de teclado se importan automáticamente.&lt;/p&gt;
&lt;h2 id="recuperar-el-músculo-del-f5"&gt;Recuperar el músculo del F5&lt;/h2&gt;
&lt;p&gt;Los usuarios de ADS dependen de F5 para ejecutar consultas. Instala la extensión &lt;strong&gt;MSSQL Database Management Keymap&lt;/strong&gt; para recuperar los atajos de teclado al estilo ADS, incluido F5.&lt;/p&gt;
&lt;h2 id="sql-database-projects-esquema-como-código"&gt;SQL Database Projects: esquema como código&lt;/h2&gt;
&lt;p&gt;Clic derecho en un proyecto → &lt;strong&gt;Publicar&lt;/strong&gt; → configurar destino → revisar el script T-SQL generado → desplegar. La vista previa del script antes del despliegue es la característica clave de seguridad. Las plantillas de elementos generan esqueletos para tablas, procedimientos almacenados y vistas — el mismo flujo que SSDT.&lt;/p&gt;
&lt;p&gt;Problema frecuente: una &lt;strong&gt;incompatibilidad de plataforma de destino&lt;/strong&gt; en el archivo &lt;code&gt;.sqlproj&lt;/code&gt; causará errores de compilación si el proyecto fue creado contra una versión diferente de SQL Server.&lt;/p&gt;
&lt;h2 id="schema-compare-y-schema-designer"&gt;Schema Compare y Schema Designer&lt;/h2&gt;
&lt;p&gt;La extensión también incluye &lt;strong&gt;Schema Compare&lt;/strong&gt; (diferencia entre tu proyecto y la base de datos desplegada) y &lt;strong&gt;Schema Designer&lt;/strong&gt; (edición visual del esquema sin escribir DDL a mano).&lt;/p&gt;
&lt;h2 id="desarrolladores-de-microsoft-fabric"&gt;Desarrolladores de Microsoft Fabric&lt;/h2&gt;
&lt;p&gt;La configuración es idéntica, pero comienza desde el &lt;strong&gt;portal de Fabric&lt;/strong&gt; y conecta la base de datos a Git primero antes de abrirla en VS Code. Microsoft tiene una guía dedicada: &lt;em&gt;Azure Data Studio to VS Code — What it means for SQL database in Fabric developers&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;La migración es un flujo guiado de una sola vez, no una reconstrucción manual. Instala las tres herramientas, ejecuta el ADS Migration Toolkit, restaura tus atajos de teclado y estarás de vuelta a la normalidad en menos de 10 minutos.&lt;/p&gt;
&lt;p&gt;Consulta el &lt;a href="https://devblogs.microsoft.com/azure-sql/azure-data-studio-is-retired-move-your-azure-sql-workflow-to-vs-code-in-10-minutes/"&gt;artículo completo&lt;/a&gt; para capturas de pantalla paso a paso y el tutorial específico de Fabric.&lt;/p&gt;
&lt;p&gt;Este cambio ayuda cuando hay que equilibrar velocidad de entrega, consistencia de plataforma y gobernanza.&lt;/p&gt;
&lt;h2 id="siguientes-pasos-practicos"&gt;Siguientes pasos practicos&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Valida la funcionalidad en un piloto .NET pequeno con datos realistas.&lt;/li&gt;
&lt;li&gt;Define observabilidad y un plan de rollback antes de escalar.&lt;/li&gt;
&lt;li&gt;Documenta el patron para reutilizarlo en otros equipos.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="fuente"&gt;Fuente&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Articulo original: &lt;a href="https://devblogs.microsoft.com/azure-sql/azure-data-studio-is-retired-move-your-azure-sql-workflow-to-vs-code-in-10-minutes/"&gt;https://devblogs.microsoft.com/azure-sql/azure-data-studio-is-retired-move-your-azure-sql-workflow-to-vs-code-in-10-minutes/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>SQL MCP Server en Azure App Service — Sin Contenedores</title><link>https://thedotnetblog.com/es/news/emiliano-montesdeoca/sql-mcp-server-azure-app-service-no-containers/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/es/news/emiliano-montesdeoca/sql-mcp-server-azure-app-service-no-containers/</guid><description>El SQL MCP Server ahora puede ejecutarse en Azure App Service sin Docker ni Kubernetes. Esto es lo que significa para los desarrolladores .NET que construyen agentes de IA que hablan con bases de datos SQL.</description><content:encoded>&lt;p&gt;&lt;em&gt;Esta publicación fue traducida automáticamente. Para la versión original, &lt;a href="https://thedotnetblog.com/es/news/emiliano-montesdeoca/sql-mcp-server-azure-app-service-no-containers/"&gt;haz clic aquí&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Seré honesto contigo: cada vez que veo &amp;ldquo;requiere un contenedor&amp;rdquo; en un tutorial, una pequeña parte de mí suspira. Los contenedores son geniales, hasta que tu equipo no tiene una estrategia de contenedores, y de repente una funcionalidad que parecía simple está bloqueada por una sobrecarga de orquestación que no habías planeado.&lt;/p&gt;
&lt;p&gt;Por eso esto me llamó la atención. El SQL MCP Server ahora puede ejecutarse en Azure App Service — sin Docker, sin Kubernetes, solo la misma configuración de Data API Builder (DAB) que expone tu base de datos SQL a través de MCP, REST y GraphQL.&lt;/p&gt;
&lt;h2 id="qué-es-el-sql-mcp-server"&gt;¿Qué es el SQL MCP Server?&lt;/h2&gt;
&lt;p&gt;Contexto rápido si aún no lo conoces. El SQL MCP Server se sitúa entre tu agente de IA y tu base de datos SQL. En lugar de darle a tu agente acceso directo a la base de datos (lo cual es terrible idea), expone tus tablas y vistas como una capa de abstracción — entidades con permisos definidos.&lt;/p&gt;
&lt;p&gt;Está construido sobre &lt;a href="https://learn.microsoft.com/es-es/azure/data-api-builder/"&gt;Data API builder&lt;/a&gt;, lo que significa que un único archivo de configuración gestiona MCP &lt;em&gt;y&lt;/em&gt; REST &lt;em&gt;y&lt;/em&gt; GraphQL simultáneamente. Tu agente habla con el endpoint MCP. Tu aplicación tradicional habla con REST o GraphQL. Misma config, mismo runtime, superficies diferentes.&lt;/p&gt;
&lt;p&gt;Eso es genuinamente útil. No estás manteniendo dos capas de API separadas.&lt;/p&gt;
&lt;h2 id="el-problema-del-contenedor-y-la-solución"&gt;El Problema del Contenedor (y la Solución)&lt;/h2&gt;
&lt;p&gt;El modelo de despliegue original del SQL MCP Server era con contenedores. Funciona bien en muchos equipos, pero no en todos. Muchos equipos .NET estandarizan en Azure App Service o VMs. Requerir un runtime de contenedor solo para exponer un endpoint SQL agrega fricción que nadie pidió.&lt;/p&gt;
&lt;p&gt;El nuevo tutorial muestra cómo saltarte el contenedor por completo. Todo funciona con un comando &lt;code&gt;dab start&lt;/code&gt;, alojado en App Service como un proceso web .NET 8 estándar.&lt;/p&gt;
&lt;p&gt;Aquí está el flujo de configuración local en pocas palabras:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Instalar Data API builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet tool install microsoft.dataapibuilder --prerelease -g
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Inicializar la configuración&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab init --database-type mssql --host-mode Development --connection-string &lt;span class="s2"&gt;&amp;#34;@env(&amp;#39;SQL_CONNECTION_STRING&amp;#39;)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Agregar una entidad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab add products --source dbo.products --permissions &lt;span class="s2"&gt;&amp;#34;authenticated:*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Configurar el proveedor de auth de App Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab configure --runtime.host.authentication.provider AppService
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Iniciar el servidor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En este punto tienes MCP en &lt;code&gt;/mcp&lt;/code&gt;, REST y GraphQL desde el mismo proceso, y nada corriendo en un contenedor.&lt;/p&gt;
&lt;h2 id="autenticación-sin-claves-de-api-compartidas"&gt;Autenticación Sin Claves de API Compartidas&lt;/h2&gt;
&lt;p&gt;Esta es la parte que más aprecio. Cuando despliegas en App Service, configuras Microsoft Entra ID como proveedor de autenticación. Sin secretos compartidos en archivos de configuración, sin claves de API que rotar.&lt;/p&gt;
&lt;p&gt;La cadena de conexión permanece en una variable de entorno de App Service (no en &lt;code&gt;dab-config.json&lt;/code&gt;), y el endpoint MCP está protegido por autenticación de plataforma. Si ya estás alineado con Entra ID en tus cargas de trabajo de Azure — lo cual probablemente sea el caso si usas agentes de Azure AI Foundry — esto encaja naturalmente.&lt;/p&gt;
&lt;p&gt;Para el desarrollo local, cambias al modo &lt;code&gt;Simulator&lt;/code&gt; y transporte STDIO. Vuelves al modo &lt;code&gt;AppService&lt;/code&gt; cuando despliegas. Limpio y explícito.&lt;/p&gt;
&lt;h2 id="despliegue-en-app-service"&gt;Despliegue en App Service&lt;/h2&gt;
&lt;p&gt;El despliegue real es trabajo estándar con Azure CLI:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Crear el plan de App Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az appservice plan create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name &amp;lt;plan-name&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --resource-group &amp;lt;resource-group&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --sku B1 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --is-linux
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Crear la aplicación web (runtime .NET 8)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az webapp create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name &amp;lt;app-name&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --resource-group &amp;lt;resource-group&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --plan &amp;lt;plan-name&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --runtime &lt;span class="s2"&gt;&amp;#34;DOTNETCORE:8.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Configurar el comando de inicio&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az webapp config &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name &amp;lt;app-name&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --resource-group &amp;lt;resource-group&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --startup-file &lt;span class="s2"&gt;&amp;#34;dab start&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Luego despliega tu proyecto DAB usando el método de despliegue que tu equipo ya usa — VS Code, GitHub Actions, Zip Deploy. El detalle clave: es un despliegue de &lt;strong&gt;código&lt;/strong&gt;, no de contenedor. Sin imagen que construir, publicar ni gestionar.&lt;/p&gt;
&lt;h2 id="por-qué-importa-para-los-desarrolladores-net"&gt;Por qué Importa para los Desarrolladores .NET&lt;/h2&gt;
&lt;p&gt;Si estás construyendo agentes de IA en .NET — ya sea con el Microsoft Agent Framework, Semantic Kernel, o agentes hospedados en Azure AI Foundry — eventualmente tu agente necesita hablar con una base de datos. El SQL MCP Server te da una manera estructurada de hacer eso sin exponer cadenas de conexión en bruto ni escribir una capa de API personalizada.&lt;/p&gt;
&lt;p&gt;Ejecutarlo en App Service cierra la brecha para equipos que no trabajan con contenedores. Es la misma configuración de DAB, la misma auth de Entra, el mismo protocolo MCP — solo en infraestructura que ya conoces.&lt;/p&gt;
&lt;p&gt;Consulta el tutorial completo en el &lt;a href="https://devblogs.microsoft.com/azure-sql/sql-mcp-server-app-service/"&gt;post original del blog&lt;/a&gt; y el &lt;a href="https://github.com/Azure-Samples/SQL-MCP-NoContainer"&gt;repositorio de muestra en GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;El SQL MCP Server en App Service es una opción pragmática sólida para equipos .NET que quieren dar a sus agentes acceso estructurado a datos SQL sin una estrategia de contenedores. La combinación del modelo de entidades de DAB, la auth integrada de Entra en App Service, y el comando de inicio &lt;code&gt;dab start&lt;/code&gt; resulta en un despliegue simple de explicar y fácil de operar.&lt;/p&gt;
&lt;p&gt;Pruébalo. Tus agentes apreciarán la superficie de API limpia. Tu equipo de operaciones apreciará no tener que lidiar con registros de contenedores.&lt;/p&gt;</content:encoded></item><item><title>SQL Server 2025 como Base de Datos Lista para Agentes: Seguridad, Backup y MCP en un Solo Motor</title><link>https://thedotnetblog.com/es/news/emiliano-montesdeoca/sql-server-2025-agent-ready-security-mcp/</link><pubDate>Sun, 26 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/es/news/emiliano-montesdeoca/sql-server-2025-agent-ready-security-mcp/</guid><description>La parte final de la serie Polyglot Tax aborda los problemas difíciles de producción: seguridad unificada de Row-Level Security en datos relacionales, JSON, grafos y vectores, más integración MCP que hace a SQL Server 2025 genuinamente listo para agentes.</description><content:encoded>&lt;p&gt;&lt;em&gt;Este post fue traducido automáticamente. Para la versión original, &lt;a href="https://thedotnetblog.com/posts/emiliano-montesdeoca/sql-server-2025-agent-ready-security-mcp/"&gt;haz clic aquí&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;He seguido la serie Polyglot Tax de Aditya Badramraju con mucho interés. Las partes 1-3 construyeron un caso convincente para SQL Server 2025 como una base de datos genuinamente multi-modelo. La parte 4 cierra la serie con las partes que realmente determinan si confiarías en esta arquitectura en producción.&lt;/p&gt;
&lt;h2 id="un-modelo-de-seguridad-para-todos-los-modelos-de-datos"&gt;Un Modelo de Seguridad para Todos los Modelos de Datos&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SECURITY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;POLICY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TenantIsolation&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ADD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FILTER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PREDICATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fn_TenantFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TenantID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Customers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ADD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FILTER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PREDICATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fn_TenantFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TenantID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Events&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ADD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FILTER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PREDICATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fn_TenantFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TenantID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Relationships&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ADD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FILTER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PREDICATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fn_TenantFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TenantID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Embeddings&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WITH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;STATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Una política, una prueba. Para un auditor que pregunta &amp;ldquo;demuestra que el Tenant A no puede ver los datos del Tenant B&amp;rdquo;, esto es oro.&lt;/p&gt;
&lt;h2 id="backup-unificado--recuperación-atómica"&gt;Backup Unificado = Recuperación Atómica&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;RESTORE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;DATABASE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MultiModelApp&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://storage.blob.core.windows.net/backups/MultiModelApp.bak&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WITH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;STOPAT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;2026-02-01 10:30:00&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En un stack políglota, coordinar la recuperación de cinco bases de datos es una pesadilla de consistencia. Con una sola base de datos y un log de transacciones, la recuperación es atómica por definición.&lt;/p&gt;
&lt;h2 id="integración-mcp-agentes-sin-middleware-codificado-a-mano"&gt;Integración MCP: Agentes Sin Middleware Codificado a Mano&lt;/h2&gt;
&lt;p&gt;SQL Server 2025 soporta el SQL MCP Server directamente. Los agentes llaman herramientas, el motor impone aislamiento de tenant y enmascaramiento de columnas automáticamente.&lt;/p&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;Para desarrolladores .NET construyendo aplicaciones con agentes en Azure SQL, esta arquitectura merece consideración seria. Post original de Aditya Badramraju: &lt;a href="https://devblogs.microsoft.com/azure-sql/the-polyglot-tax-part-4/"&gt;The Polyglot Tax – Part 4&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>SQL MCP Server — La forma correcta de darle acceso a bases de datos a los agentes de IA</title><link>https://thedotnetblog.com/es/news/emiliano-montesdeoca/sql-mcp-server-data-api-builder/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/es/news/emiliano-montesdeoca/sql-mcp-server-data-api-builder/</guid><description>SQL MCP Server de Data API builder da a los agentes de IA acceso seguro y determinista a bases de datos sin exponer esquemas ni depender de NL2SQL. RBAC, caché, soporte multi-base de datos — todo incluido.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Este post fue traducido automáticamente. Para la versión original, &lt;a href="https://thedotnetblog.com/es/news/emiliano-montesdeoca/sql-mcp-server-data-api-builder/"&gt;haz clic aquí&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Seamos honestos: la mayoría de los servidores MCP de bases de datos disponibles hoy son aterradores. Toman una consulta en lenguaje natural, generan SQL al vuelo y lo ejecutan contra tus datos de producción. ¿Qué podría salir mal? (Todo. Todo podría salir mal.)&lt;/p&gt;
&lt;p&gt;El equipo de Azure SQL acaba de &lt;a href="https://devblogs.microsoft.com/azure-sql/introducing-sql-mcp-server/"&gt;presentar SQL MCP Server&lt;/a&gt;, y toma un enfoque fundamentalmente diferente. Construido como una característica de Data API builder (DAB) 2.0, da a los agentes de IA acceso estructurado y determinista a operaciones de base de datos — sin NL2SQL, sin exponer tu esquema, y con RBAC completo en cada paso.&lt;/p&gt;
&lt;h2 id="por-qué-no-nl2sql"&gt;¿Por qué no NL2SQL?&lt;/h2&gt;
&lt;p&gt;Esta es la decisión de diseño más interesante. Los modelos no son deterministas, y las consultas complejas son las más propensas a producir errores sutiles. Las consultas exactas que los usuarios esperan que la IA genere son también las que necesitan más escrutinio cuando se producen de forma no determinista.&lt;/p&gt;
&lt;p&gt;En su lugar, SQL MCP Server usa un enfoque &lt;strong&gt;NL2DAB&lt;/strong&gt;. El agente trabaja con la capa de abstracción de entidades de Data API builder y su constructor de consultas integrado para producir T-SQL preciso y bien formado de manera determinista. Mismo resultado para el usuario, pero sin el riesgo de JOINs alucinados o exposición accidental de datos.&lt;/p&gt;
&lt;h2 id="siete-herramientas-no-setecientas"&gt;Siete herramientas, no setecientas&lt;/h2&gt;
&lt;p&gt;SQL MCP Server expone exactamente siete herramientas DML, sin importar el tamaño de la base de datos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;describe_entities&lt;/code&gt; — descubrir entidades y operaciones disponibles&lt;/li&gt;
&lt;li&gt;&lt;code&gt;create_record&lt;/code&gt; — insertar filas&lt;/li&gt;
&lt;li&gt;&lt;code&gt;read_records&lt;/code&gt; — consultar tablas y vistas&lt;/li&gt;
&lt;li&gt;&lt;code&gt;update_record&lt;/code&gt; — modificar filas&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delete_record&lt;/code&gt; — eliminar filas&lt;/li&gt;
&lt;li&gt;&lt;code&gt;execute_entity&lt;/code&gt; — ejecutar procedimientos almacenados&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aggregate_records&lt;/code&gt; — consultas de agregación&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esto es inteligente porque las ventanas de contexto son el espacio de pensamiento del agente. Inundarlas con cientos de definiciones de herramientas deja menos espacio para el razonamiento. Siete herramientas fijas mantienen al agente enfocado en &lt;em&gt;pensar&lt;/em&gt; en lugar de &lt;em&gt;navegar&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Cada herramienta puede habilitarse o deshabilitarse individualmente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;runtime&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;mcp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;path&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/mcp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;dml-tools&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;describe-entities&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;create-record&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;read-records&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;update-record&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;delete-record&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;execute-entity&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;aggregate-records&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="empezando-en-tres-comandos"&gt;Empezando en tres comandos&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab init &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --database-type mssql &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --connection-string &lt;span class="s2"&gt;&amp;#34;@env(&amp;#39;sql_connection_string&amp;#39;)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab add Customers &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --source dbo.Customers &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --permissions &lt;span class="s2"&gt;&amp;#34;anonymous:*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Eso es un SQL MCP Server funcionando y exponiendo tu tabla Customers. La capa de abstracción de entidades significa que puedes crear alias para nombres y columnas, limitar campos por rol, y controlar exactamente lo que ven los agentes — sin exponer detalles internos del esquema.&lt;/p&gt;
&lt;h2 id="la-historia-de-seguridad-es-sólida"&gt;La historia de seguridad es sólida&lt;/h2&gt;
&lt;p&gt;Aquí es donde la madurez de Data API builder da frutos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RBAC en cada capa&lt;/strong&gt; — cada entidad define qué roles pueden leer, crear, actualizar o eliminar, y qué campos son visibles&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integración con Azure Key Vault&lt;/strong&gt; — cadenas de conexión y secretos gestionados de forma segura&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft Entra + OAuth personalizado&lt;/strong&gt; — autenticación de nivel producción&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content Security Policy&lt;/strong&gt; — los agentes interactúan a través de un contrato controlado, no SQL crudo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La abstracción del esquema es particularmente importante. Los nombres internos de tus tablas y columnas nunca se exponen al agente. Defines entidades, alias y descripciones que tienen sentido para la interacción con IA — no tu diagrama ERD de la base de datos.&lt;/p&gt;
&lt;h2 id="multi-base-de-datos-y-multi-protocolo"&gt;Multi-base de datos y multi-protocolo&lt;/h2&gt;
&lt;p&gt;SQL MCP Server soporta Microsoft SQL, PostgreSQL, Azure Cosmos DB y MySQL. Y como es una característica de DAB, obtienes endpoints REST, GraphQL y MCP simultáneamente desde la misma configuración. Mismas definiciones de entidades, mismas reglas RBAC, misma seguridad — en los tres protocolos.&lt;/p&gt;
&lt;p&gt;La auto-configuración en DAB 2.0 puede incluso inspeccionar tu base de datos y construir la configuración dinámicamente, si te resulta cómodo menos abstracción para prototipado rápido.&lt;/p&gt;
&lt;h2 id="mi-opinión"&gt;Mi opinión&lt;/h2&gt;
&lt;p&gt;Así es como debería funcionar el acceso empresarial a bases de datos para agentes de IA. No &amp;ldquo;hey LLM, escríbeme algo de SQL y YOLO contra producción.&amp;rdquo; En su lugar: una capa de entidades bien definida, generación determinista de consultas, RBAC en cada paso, caché, monitoreo y telemetría. Es aburrido de la mejor manera posible.&lt;/p&gt;
&lt;p&gt;Para desarrolladores .NET, la historia de integración es limpia — DAB es una herramienta .NET, el MCP Server se ejecuta como contenedor, y funciona con Azure SQL, que la mayoría ya estamos usando. Si estás construyendo agentes de IA que necesitan acceso a datos, empieza aquí.&lt;/p&gt;
&lt;h2 id="para-cerrar"&gt;Para cerrar&lt;/h2&gt;
&lt;p&gt;SQL MCP Server es gratuito, de código abierto y se ejecuta en cualquier lugar. Es el enfoque prescriptivo de Microsoft para dar acceso seguro a bases de datos a los agentes de IA. Consulta el &lt;a href="https://devblogs.microsoft.com/azure-sql/introducing-sql-mcp-server/"&gt;post completo&lt;/a&gt; y la &lt;a href="https://aka.ms/sql/mcp"&gt;documentación&lt;/a&gt; para empezar.&lt;/p&gt;</content:encoded></item></channel></rss>