{"id":33468,"date":"2025-07-02T09:06:54","date_gmt":"2025-07-02T07:06:54","guid":{"rendered":"https:\/\/www.codemotion.com\/magazine\/?p=33468"},"modified":"2025-07-02T09:06:56","modified_gmt":"2025-07-02T07:06:56","slug":"busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica","status":"publish","type":"post","link":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/","title":{"rendered":"B\u00fasquedas Sem\u00e1nticas con IA en SQL Server 2025: Teor\u00eda y Pr\u00e1ctica"},"content":{"rendered":"\n<p>La Public Preview de SQL Server 2025 ya est\u00e1 disponible y no es para nada una actualizaci\u00f3n menor. Esta nueva versi\u00f3n marca un hito significativo al integrar capacidades de Inteligencia Artificial (IA) directamente en su motor de base de datos, transformando la forma en que interactuamos con nuestros datos. Lejos de ser un simple plugin o una funcionalidad de an\u00e1lisis superficial, esta integraci\u00f3n permite realizar b\u00fasquedas sem\u00e1nticas r\u00e1pidas y precisas utilizando modelos de lenguaje, embeddings y vectores, todo sin salir de nuestro entorno habitual como SQL Server Management Studio. Esto es especialmente relevante porque los datos no necesitan salir del servidor, garantizando as\u00ed la seguridad y el rendimiento.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-la-teoria-detras-de-la-magia-vectores-embeddings-y-cosenos\"><strong>La teor\u00eda detr\u00e1s de la magia: Vectores, Embeddings y Cosenos<\/strong><\/h2>\n\n\n\n<p>Para entender c\u00f3mo la IA logra estas b\u00fasquedas sem\u00e1nticas, es fundamental comprender algunos conceptos clave:<\/p>\n\n\n\n<p>Lo primero y principal, la IA no entiende palabras, entiende n\u00fameros: Aunque parezca que la IA &#8220;lee&#8221; o &#8220;comprende&#8221; texto, internamente trabaja con representaciones matem\u00e1ticas. La IA opera con vectores, probabilidades y operaciones matem\u00e1ticas de n\u00fameros.<\/p>\n\n\n\n<p>Los vectores son una lista ordenada de n\u00fameros que representa el &#8220;significado&#8221; de algo. Generalmente, estos vectores son de 1536 dimensiones (est\u00e1ndar actual de la industria) para capturar la complejidad sem\u00e1ntica. Por ejemplo, caracter\u00edsticas como si un veh\u00edculo flota, tiene alas, o si un humano habla, pueden ser representadas num\u00e9ricamente en un vector.<\/p>\n\n\n\n<p>Hablamos de embeddings y no vectores cuando un modelo de lenguaje toma una frase como &#8220;bicicleta para descenso de monta\u00f1a&#8221; y genera un vector que encapsula su significado, ese vector es un embedding. Un embedding es un vector al que se le ha asignado un valor sem\u00e1ntico. Es decir, es la representaci\u00f3n num\u00e9rica de un concepto o texto, conservando su significado.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-similitud-de-coseno\"><strong>Similitud de Coseno<\/strong><\/h3>\n\n\n\n<p>La magia ocurre al comparar embeddings. Como conjuntos de n\u00fameros podemos pintarlos como un punto en un lugar en el espacio y trazar hasta ese punto una l\u00ednea desde el eje central de nuestro plano. Esto nos permite realizar comparaciones. Cuanto m\u00e1s cercano es el \u00e1ngulo entre dos vectores, m\u00e1s parecido es su significado.&nbsp;<\/p>\n\n\n\n<p>Esta comparaci\u00f3n se realiza mediante el c\u00e1lculo de la similitud de coseno, que es una operaci\u00f3n de \u00e1lgebra lineal basada en el producto escalar y las magnitudes de los vectores. La f\u00f3rmula es:&nbsp;<\/p>\n\n\n\n<p><em>Similitud = cos(\u03b8) = (A\u00b7B) \/ (||A|| * ||B||)<\/em>.&nbsp;<\/p>\n\n\n\n<p>La distancia, por otro lado, es simplemente 1 \u2013 similitud; cuanto m\u00e1s cercana a cero, m\u00e1s similares son los conceptos.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"390\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/07\/IA-EN-SQL-1-1024x390.png\" alt=\"\" class=\"wp-image-33555\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/07\/IA-EN-SQL-1-1024x390.png 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/07\/IA-EN-SQL-1-300x114.png 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/07\/IA-EN-SQL-1-768x293.png 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/07\/IA-EN-SQL-1.png 1213w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Esta es la teor\u00eda pero todos tranquilos que este c\u00e1lculo lo realiza el motor de SQL Server, liber\u00e1ndonos de la tarea manual.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-por-que-busquedas-semanticas-y-no-el-like-de-siempre\"><strong>\u00bfPor qu\u00e9 b\u00fasquedas sem\u00e1nticas y no el &#8220;LIKE&#8221; de siempre?<\/strong><\/h2>\n\n\n\n<p>En SQL Server 2025 el verdadero factor diferenciador de esta funcionalidad son las b\u00fasquedas sem\u00e1nticas. A diferencia de una b\u00fasqueda con LIKE o \u00edndices de texto completo (Full Text Indexes), los embeddings representan el significado de las palabras. Esto significa que aspectos como sin\u00f3nimos o incluso el idioma de la b\u00fasqueda dejan de ser un impedimento.<\/p>\n\n\n\n<p>Por ejemplo, si las descripciones de tus productos est\u00e1n en ingl\u00e9s, franc\u00e9s o chino, y tu realizas una b\u00fasqueda en espa\u00f1ol como &#8220;Quiero una bicicleta para hacer descenso de monta\u00f1a&#8221;, el modelo entender\u00e1 el significado y devolver\u00e1 resultados coherentes, incluso si la descripci\u00f3n es &#8220;bike for downhill mountain racing&#8221;. Esto se debe a que el modelo entiende el significado, no la forma o la sintaxis.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-implementacion-paso-a-paso-integrando-ia-en-sql-server-2025\"><strong>Implementaci\u00f3n paso a paso: Integrando IA en SQL Server 2025<\/strong><\/h2>\n\n\n\n<p>Para empezar a realizar b\u00fasquedas sem\u00e1nticas en SQL Server 2025, yo he usado la base de datos AdventureWorks.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-requisitos-previos\"><strong>Requisitos previos<\/strong><\/h3>\n\n\n\n<p>Por supuesto, necesitaremos SQL Server 2025, que actualmente est\u00e1 en versi\u00f3n preview.<\/p>\n\n\n\n<p>Si ya estamos en SQL Server 2025 lo primero que debemos habilitar las llamadas a destinos REST API para consultar los modelos LLM. Para ello ejecutaremos:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">sp_configure <span class=\"hljs-string\">'external scripts enabled'<\/span>, <span class=\"hljs-number\">1<\/span>; RECONFIGURE;.<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Dado que a d\u00eda de hoy SQL Server 2025 es una versi\u00f3n preview, vamos a tener que habilitar unas trazas espec\u00edficas para la b\u00fasqueda de vectores por \u00edndices. Una vez que el producto est\u00e9 en disponibilidad general, esto no ser\u00e1 necesario. De momento vamos a ejecutar:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">DBCC TRACEON(466, 474, 13981, -1)<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-configurar-credenciales-nbsp\"><strong>Configurar credenciales&nbsp;<\/strong><\/h3>\n\n\n\n<p>Una vez que lo tenemos preparado vamos a necesitar crear y almacenar una credencial para conectarnos al modelo de generaci\u00f3n de embeddings. Para poder almacenar esa credencial de forma segura antes de hacer nada tendremos que crear una clave maestra de encriptaci\u00f3n:&nbsp;<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">CREATE MASTER KEY ENCRYPTION BY PASSWORD = <span class=\"hljs-string\">'TuContrase\u00f1aSegura'<\/span>;.<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Con la clave de encriptaci\u00f3n creada ya podemos crear la credencial para el servicio de IA: Es necesario configurar una credencial que apunte a tu endpoint de Azure OpenAI (o cualquier otro modelo de IA que admita llamadas API, como NVIDIA o LLaMA). Esto requiere obtener el endpoint y la API Key de tu recurso de Azure OpenAI.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">create database scoped credential &#91;https:<span class=\"hljs-comment\">\/\/NombreEndpoint.openai.azure.com] -- Nombre de la credencial (Endpoint Azure OpenAI)<\/span>\n<span class=\"hljs-keyword\">with<\/span> identity = <span class=\"hljs-string\">'HTTPEndpointHeaders'<\/span>, secret = <span class=\"hljs-string\">'{\"api-key\": \"*****************************************\"}'<\/span>; -- API KEY Open AI\nGO<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-generar-embeddings\"><strong>Generar embeddings<\/strong><\/h3>\n\n\n\n<p>Ahora que ya tenemos creada nuestra credencial para acceder a un LLM (en mi caso Azure Open AI pero puede ser otro) ya podemos empezar a hacer peticiones. Lo primero que vamos a hacer va a ser crear un procedimiento almacenado para generar los embeddings.&nbsp; Este procedimiento recibir\u00e1 un texto (ej., la descripci\u00f3n de un producto) y lo enviar\u00e1 al modelo de IA. El modelo generar\u00e1 un vector con significado sem\u00e1ntico (el embedding) de 1536 posiciones que encapsula el significado sem\u00e1ntico del texto.<\/p>\n\n\n\n<p>El procedimiento encapsular\u00e1 la llamada REST al modelo, pasando el texto como payload en formato JSON y recibiendo el embedding como respuesta. Os dejo mi c\u00f3digo de este SP como ejemplo. Ver\u00e9is que adem\u00e1s de lo estrictamente necesario tiene una capa de control de errores.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">create <span class=\"hljs-keyword\">or<\/span> alter procedure &#91;get_embedding]\n@inputText nvarchar(max),\n@embedding vector(<span class=\"hljs-number\">1536<\/span>) output\n<span class=\"hljs-keyword\">as<\/span>\nbegin <span class=\"hljs-keyword\">try<\/span>\n\u00a0 \u00a0 <span class=\"hljs-keyword\">declare<\/span> @retval int;\n\u00a0 \u00a0 <span class=\"hljs-keyword\">declare<\/span> @payload nvarchar(max) = json_object(<span class=\"hljs-string\">'input'<\/span>: @inputText);\n\u00a0 \u00a0 <span class=\"hljs-keyword\">declare<\/span> @response nvarchar(max)\n\n\u00a0 \u00a0 <span class=\"hljs-keyword\">declare<\/span> @url nvarchar(<span class=\"hljs-number\">1000<\/span>) = <span class=\"hljs-string\">'https:\/\/NombreEndpoint.openai.azure.com\/openai\/deployments\/text-embedding-ada-002\/embeddings?api-version=2023-05-15'<\/span> <span class=\"hljs-comment\">\/* URL modelo (Azure AI Foundry ADA 2) *\/<\/span>\n\u00a0 \u00a0 exec @retval = sp_invoke_external_rest_endpoint\n\u00a0 \u00a0 @url = @url,\n\u00a0 \u00a0 @method = <span class=\"hljs-string\">'POST'<\/span>,\n\u00a0 \u00a0 @credential = &#91;https:<span class=\"hljs-comment\">\/\/NombreEndpoint.openai.azure.com], \/* Nombre de la credencial (Endpoint Azure OpenAI)*\/<\/span>\n\u00a0 \u00a0 @payload = @payload,\n\u00a0 \u00a0 @response = @response output;\nend <span class=\"hljs-keyword\">try<\/span>\nbegin <span class=\"hljs-keyword\">catch<\/span>\n\u00a0 \u00a0 select\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-string\">'SQL'<\/span> <span class=\"hljs-keyword\">as<\/span> error_source,\n\u00a0 \u00a0 \u00a0 \u00a0 error_number() <span class=\"hljs-keyword\">as<\/span> error_code,\n\u00a0 \u00a0 \u00a0 \u00a0 error_message() <span class=\"hljs-keyword\">as<\/span> error_message\n\u00a0 \u00a0 <span class=\"hljs-keyword\">return<\/span>;\nend <span class=\"hljs-keyword\">catch<\/span>\n\n<span class=\"hljs-keyword\">if<\/span> (@retval != <span class=\"hljs-number\">0<\/span>) begin\n\u00a0 \u00a0 select\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-string\">'OPENAI'<\/span> <span class=\"hljs-keyword\">as<\/span> error_source,\n\u00a0 \u00a0 \u00a0 \u00a0 json_value(@response, <span class=\"hljs-string\">'$.result.error.code'<\/span>) <span class=\"hljs-keyword\">as<\/span> error_code,\n\u00a0 \u00a0 \u00a0 \u00a0 json_value(@response, <span class=\"hljs-string\">'$.result.error.message'<\/span>) <span class=\"hljs-keyword\">as<\/span> error_message,\n\u00a0 \u00a0 \u00a0 \u00a0 @response <span class=\"hljs-keyword\">as<\/span> error_response\n\u00a0 \u00a0 <span class=\"hljs-keyword\">return<\/span>;\nend;\n\nset @embedding = cast(json_query(@response, <span class=\"hljs-string\">'$.result.data&#91;0].embedding'<\/span>) <span class=\"hljs-keyword\">as<\/span> vector(<span class=\"hljs-number\">1536<\/span>))\n\n<span class=\"hljs-keyword\">return<\/span> @retval\nGO<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-almacenar-los-embeddings-de-tus-datos\"><strong>Almacenar los embeddings de tus datos<\/strong><\/h3>\n\n\n\n<p>Cuando generemos estos embeddings, es muy importante guardarlos en una tabla separada de tus datos originales. Esto mejora el rendimiento y mantiene la base de datos m\u00e1s limpia, ya que los embeddings son valores muy largos.<\/p>\n\n\n\n<p>El siguiente script, ya con datos propios de AdventureWorks, crea una tabla y la carga con los datos de los art\u00edculos que vamos a usar junto con los embeddings:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">USE<\/span> <span class=\"hljs-title\">AdventureWorks<\/span>;\nGO\n-- Crea nueva tabla para embeddings de productos\nDROP TABLE <span class=\"hljs-keyword\">IF<\/span> EXISTS Production.ProductDescriptionEmbeddings;\nGO\nCREATE TABLE Production.ProductDescriptionEmbeddings\n(\n\u00a0 ProductDescEmbeddingID INT IDENTITY NOT <span class=\"hljs-keyword\">NULL<\/span> PRIMARY KEY CLUSTERED,\n\u00a0 ProductID INT NOT <span class=\"hljs-keyword\">NULL<\/span>,\n\u00a0 ProductDescriptionID INT NOT <span class=\"hljs-keyword\">NULL<\/span>,\n\u00a0 ProductModelID INT NOT <span class=\"hljs-keyword\">NULL<\/span>,\n\u00a0 CultureID nchar(<span class=\"hljs-number\">6<\/span>) NOT <span class=\"hljs-keyword\">NULL<\/span>,\n\u00a0 Embedding vector(<span class=\"hljs-number\">1536<\/span>)\n);\n-- Copiar filas relevantes de productos\n-- Solo copiamos productos que tengan datos de ProductModels\nINSERT INTO Production.ProductDescriptionEmbeddings\nSELECT p.ProductID, pmpdc.ProductDescriptionID, pmpdc.ProductModelID, pmpdc.CultureID, <span class=\"hljs-keyword\">NULL<\/span>\nFROM Production.ProductModelProductDescriptionCulture pmpdc\nJOIN Production.Product p\nON pmpdc.ProductModelID = p.ProductModelID\nORDER BY p.ProductID;\nGO<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Ahora, para crear los embeddings vamos a ejecutar un proceso que itere sobre la tabla de tus productos (o los datos que desees buscar sem\u00e1nticamente) y, para cada descripci\u00f3n, llama al procedimiento almacenado GetEmbedding para generar su embedding.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">USE<\/span> &#91;<span class=\"hljs-title\">AdventureWorks<\/span>];\nGO\n<span class=\"hljs-keyword\">DECLARE<\/span> @ProductName NVARCHAR(<span class=\"hljs-number\">50<\/span>);\n<span class=\"hljs-keyword\">DECLARE<\/span> @ProductModelName NVARCHAR(<span class=\"hljs-number\">50<\/span>);\n<span class=\"hljs-keyword\">DECLARE<\/span> @Description NVARCHAR(<span class=\"hljs-number\">400<\/span>);\n<span class=\"hljs-keyword\">DECLARE<\/span> @ProductID INT;\n<span class=\"hljs-keyword\">DECLARE<\/span> @ProductModelID INT;\n<span class=\"hljs-keyword\">DECLARE<\/span> @ProductDescriptionID INT;\n<span class=\"hljs-keyword\">DECLARE<\/span> @CultureID NCHAR(<span class=\"hljs-number\">6<\/span>);\n<span class=\"hljs-keyword\">DECLARE<\/span> @vector vector(<span class=\"hljs-number\">1536<\/span>);\n<span class=\"hljs-keyword\">DECLARE<\/span> @text nvarchar(max);\n<span class=\"hljs-keyword\">DECLARE<\/span> @i INT = <span class=\"hljs-number\">1<\/span>;\n\nBEGIN TRAN\n-- Proceso fila a fila\n<span class=\"hljs-keyword\">DECLARE<\/span> ProductCursor CURSOR <span class=\"hljs-keyword\">FOR<\/span>\nSELECT p.Name, pm.Name, pd.Description, pde.ProductID, pde.ProductModelID, pde.ProductDescriptionID, pde.CultureID\nFROM Production.ProductDescription pd\nJOIN Production.ProductDescriptionEmbeddings pde\n\u00a0 \u00a0 ON pd.ProductDescriptionID = pde.ProductDescriptionID\nJOIN Production.Product p\n\u00a0 \u00a0 ON p.ProductID = pde.ProductID\nJOIN Production.ProductModel pm\n\u00a0 \u00a0 ON pm.ProductModelID = p.ProductModelID\n\nOPEN ProductCursor;\n\nFETCH NEXT FROM ProductCursor INTO @ProductName, @ProductModelName, @Description, @ProductID, @ProductModelID, @ProductDescriptionID, @CultureID;\n\n<span class=\"hljs-keyword\">WHILE<\/span> @@FETCH_STATUS = <span class=\"hljs-number\">0<\/span>\nBEGIN\n\u00a0 \u00a0 SET @text = (SELECT <span class=\"hljs-string\">'Name: '<\/span> + @ProductName + <span class=\"hljs-string\">', Description: '<\/span> + @Description);\n\n\u00a0 \u00a0 EXEC get_embedding @text, @vector output;\n\n\u00a0 \u00a0 UPDATE Production.ProductDescriptionEmbeddings SET Embedding = @vector\n\u00a0 \u00a0 WHERE ProductID = @ProductID\n\u00a0 \u00a0 <span class=\"hljs-keyword\">AND<\/span> ProductModelID = @ProductModelID\n\u00a0 \u00a0 <span class=\"hljs-keyword\">AND<\/span> ProductDescriptionID = @ProductDescriptionID\n\u00a0 \u00a0 <span class=\"hljs-keyword\">AND<\/span> CultureID = @CultureID;\n\n\u00a0 \u00a0 FETCH NEXT FROM ProductCursor INTO @ProductName, @ProductModelName, @Description, @ProductID, @ProductModelID, @ProductDescriptionID, @CultureID;\n\u00a0 \u00a0 <span class=\"hljs-keyword\">PRINT<\/span> cast(@i <span class=\"hljs-keyword\">as<\/span> varchar(<span class=\"hljs-number\">5<\/span>)) + <span class=\"hljs-string\">' || '<\/span> +\u00a0 cast(@vector <span class=\"hljs-keyword\">as<\/span> varchar(max));\n\n\u00a0 \u00a0 <span class=\"hljs-keyword\">if<\/span> @i % <span class=\"hljs-number\">50<\/span> = <span class=\"hljs-number\">0<\/span>\nBEGIN\n\u00a0 \u00a0 \u00a0 WAITFOR DELAY <span class=\"hljs-string\">'00:1:00'<\/span>; <span class=\"hljs-comment\">\/* Esperar 1 minuto, cada 50 items (limite de OpenAI API)*\/<\/span>\n\u00a0 \u00a0 END\n\n\u00a0 \u00a0 SET @i = @i + <span class=\"hljs-number\">1<\/span>;\nEND\n\nCOMMIT TRAN;\n\nCLOSE ProductCursor;\nDEALLOCATE ProductCursor;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Consideraciones de rendimiento:<\/strong> La generaci\u00f3n inicial de embeddings puede tomar tiempo. Esto se debe a que es recomendable esperar entre lotes de llamadas para no exceder los l\u00edmites de tokens por minuto del servicio de IA. Esta generaci\u00f3n es una operaci\u00f3n que usualmente se realiza una vez, o para los nuevos registros.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-crear-el-procedimiento-almacenado-para-busquedas-semanticas\"><strong>Crear el procedimiento almacenado para b\u00fasquedas sem\u00e1nticas<\/strong><\/h3>\n\n\n\n<p>Ya con los embeddings de nuestros productos generados es el momento de preparar el procedimiento que recibir\u00e1 la petici\u00f3n del usuario y har\u00e1 la b\u00fasqueda. Este procedimiento recibir\u00e1 una frase de b\u00fasqueda (el prompt) del usuario, generar\u00e1 el embedding de esa frase y lo comparar\u00e1 con lo que hay almacenado en la tabla.<\/p>\n\n\n\n<p>Primero, llamar\u00e1 al mismo procedimiento GetEmbedding (el que hemos creado antes) para generar el embedding de la frase de b\u00fasqueda del usuario. Es fundamental usar el mismo modelo que gener\u00f3 los embeddings de tus productos para asegurar resultados correctos.<\/p>\n\n\n\n<p>Luego, utilizar\u00e1 la nueva funci\u00f3n <strong>vector_distance<\/strong> de SQL Server 2025 para comparar el embedding de la frase de b\u00fasqueda con todos los embeddings almacenados en la tabla de embeddings de tus productos. Esta funci\u00f3n calcula la similitud de coseno.<\/p>\n\n\n\n<p>Los resultados se ordenar\u00e1n por similitud (de mayor a menor) para devolver los productos m\u00e1s relevantes.<\/p>\n\n\n\n<p>Opcionalmente, he a\u00f1adido m\u00e1s filtros adicionales, como el stock m\u00ednimo de un producto pero puedes ponerle cualquier otro con el objetivo de limitar primero la cantidad de embeddings de tus productos que se van a comparar con el embedding de la b\u00fasqueda del usuario. Esto es lo que se llama un b\u00fasqueda h\u00edbrida.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">CREATE OR ALTER procedure &#91;find_relevant_products]\n@prompt nvarchar(max), -- Entrada prompt\n@stock smallint = <span class=\"hljs-number\">500<\/span>, -- Filtro Stock, el usuario puede cambiarlo\n@top int = <span class=\"hljs-number\">10<\/span>, -- Top <span class=\"hljs-number\">10<\/span> productos, el usuario puede cambiarlo\n@min_similarity decimal(<span class=\"hljs-number\">19<\/span>,<span class=\"hljs-number\">16<\/span>) = <span class=\"hljs-number\">0.3<\/span> -- Nivel minimo similitud, el usuario puede cambiarlo\n<span class=\"hljs-keyword\">as<\/span>\n<span class=\"hljs-keyword\">if<\/span> (@prompt is <span class=\"hljs-literal\">null<\/span>) <span class=\"hljs-keyword\">return<\/span>;\n\ndeclare @retval int, @vector vector(<span class=\"hljs-number\">1536<\/span>);\n\nexec @retval = get_embedding @prompt, @vector output;\n\n<span class=\"hljs-keyword\">if<\/span> (@retval != <span class=\"hljs-number\">0<\/span>) <span class=\"hljs-keyword\">return<\/span>;\n\n-- Usa la funcion vector_distance para localizar productos\n-- Busqueda h\u00edbrida stock &gt;= @stock\n\n<span class=\"hljs-keyword\">with<\/span> cteSimilarEmbeddings <span class=\"hljs-keyword\">as<\/span>\n(\n\u00a0 \u00a0 select\n\u00a0 \u00a0 top(@top)\n\u00a0 \u00a0 \u00a0 \u00a0 pde.ProductID, pde.ProductModelID, pde.ProductDescriptionID, pde.CultureID,\n\u00a0 \u00a0 \u00a0 \u00a0 vector_distance(<span class=\"hljs-string\">'cosine'<\/span>, pde.&#91;Embedding], @vector) <span class=\"hljs-keyword\">as<\/span> distance\n\u00a0 \u00a0 <span class=\"hljs-keyword\">from<\/span>\n\u00a0 \u00a0 \u00a0 \u00a0 Production.ProductDescriptionEmbeddings pde\n\u00a0 \u00a0 order by\n\u00a0 \u00a0 \u00a0 \u00a0 distance\n)\nselect p.Name <span class=\"hljs-keyword\">as<\/span> ProductName, pd.Description <span class=\"hljs-keyword\">as<\/span> ProductDescription, p.SafetyStockLevel <span class=\"hljs-keyword\">as<\/span> StockQuantity\n<span class=\"hljs-keyword\">from<\/span> cteSimilarEmbeddings se\ninner join Production.Product p\non p.ProductID = se.ProductID\ninner join\u00a0 Production.ProductDescription pd\non pd.ProductDescriptionID = se.ProductDescriptionID\nwhere (<span class=\"hljs-number\">1<\/span>-distance) &gt; @min_similarity and \u00a0 p.SafetyStockLevel &gt;= @stock\norder by\u00a0 distance asc;\nGO<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-uso-y-resultados\"><strong>Uso y resultados<\/strong><\/h3>\n\n\n\n<p>Ahora s\u00ed, ya tenemos todo listo para empezar a hacer nuestras b\u00fasquedas sem\u00e1nticas en SQL Server como si fuera un RAG m\u00e1s que una base de datos relacional. Simplemente tendremos que llamar a este \u00faltimo procedimiento almacenado que acabamos de crear pas\u00e1ndole nuestra b\u00fasqueda y los filtros extra y nos devolver\u00e1 los productos que m\u00e1s se adecuen a lo que necesitamos. Veamos unos ejemplos, con distintas b\u00fasquedas en distintos idiomas:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">EXEC<\/span> <span class=\"hljs-selector-tag\">find_relevant_products<\/span>\n<span class=\"hljs-keyword\">@prompt<\/span> = N<span class=\"hljs-string\">'Show me the best products for riding on rough ground'<\/span>,\n@stock = <span class=\"hljs-number\">100<\/span>,\n@top = <span class=\"hljs-number\">20<\/span>;\n<span class=\"hljs-selector-tag\">GO<\/span>\n\n<span class=\"hljs-selector-tag\">EXEC<\/span> <span class=\"hljs-selector-tag\">find_relevant_products<\/span>\n<span class=\"hljs-keyword\">@prompt<\/span> = N<span class=\"hljs-string\">'Quiero una bicicleta para hacer descenso de monta\u00f1a'<\/span>,\n@stock = <span class=\"hljs-number\">100<\/span>,\n@top = <span class=\"hljs-number\">20<\/span>;\n<span class=\"hljs-selector-tag\">GO<\/span>\n\n<span class=\"hljs-selector-tag\">EXEC<\/span> <span class=\"hljs-selector-tag\">find_relevant_products<\/span>\n<span class=\"hljs-keyword\">@prompt<\/span> = N<span class=\"hljs-string\">'Quiero una bicicleta para participar en carreras de carretera'<\/span>,\n@stock = <span class=\"hljs-number\">100<\/span>,\n@top = <span class=\"hljs-number\">20<\/span>;\n<span class=\"hljs-selector-tag\">GO<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-9 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"589\" data-id=\"33558\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/07\/IA-EN-SQL-2-1024x589.png\" alt=\"\" class=\"wp-image-33558\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/07\/IA-EN-SQL-2-1024x589.png 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/07\/IA-EN-SQL-2-300x172.png 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/07\/IA-EN-SQL-2-768x442.png 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/07\/IA-EN-SQL-2.png 1341w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"361\" data-id=\"33557\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/07\/IA-EN-SQL-3-1024x361.png\" alt=\"\" class=\"wp-image-33557\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/07\/IA-EN-SQL-3-1024x361.png 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/07\/IA-EN-SQL-3-300x106.png 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/07\/IA-EN-SQL-3-768x271.png 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/07\/IA-EN-SQL-3.png 1298w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"498\" data-id=\"33559\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/07\/IA-EN-SQL-4-1024x498.png\" alt=\"\" class=\"wp-image-33559\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/07\/IA-EN-SQL-4-1024x498.png 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/07\/IA-EN-SQL-4-300x146.png 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/07\/IA-EN-SQL-4-768x374.png 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/07\/IA-EN-SQL-4-1536x747.png 1536w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/07\/IA-EN-SQL-4.png 1620w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-aplicaciones-reales-mas-alla-de-la-demo\"><strong>Aplicaciones reales m\u00e1s all\u00e1 de la demo<\/strong><\/h2>\n\n\n\n<p>Aunque comparar descripciones de productos es una &#8220;demo f\u00e1cil&#8221;, las aplicaciones de las b\u00fasquedas sem\u00e1nticas son much\u00edsimas y muy valiosas. Por ejemplo, lo puedes utilizar para ofrecer recomendaci\u00f3n de art\u00edculos y sugerir productos relacionados en una tienda en l\u00ednea. Otra opci\u00f3n interesante puede ser el an\u00e1lisis de feedback de clientes y usar la b\u00fasqueda sem\u00e1ntica para clasificar sentimientos, detectar patrones de insatisfacci\u00f3n o anticipar problemas a partir de comentarios de texto en la web. Incluso podr\u00edas hacer an\u00e1lisis de transcripciones de llamadas de soporte t\u00e9cnico para identificar temas recurrentes o emociones.<\/p>\n\n\n\n<p>En resumen, esta funcionalidad es ideal para la automatizaci\u00f3n de b\u00fasquedas complejas y resolver consultas que hasta ahora requer\u00edan intervenci\u00f3n humana. Todo esto se logra directamente desde SQL Server, sin necesidad de montar pipelines complejas o exportar datos a otros sistemas. La velocidad es impresionante, con resultados en milisegundos, ya que el c\u00e1lculo del embedding de la petici\u00f3n y su comparaci\u00f3n se realizan muy r\u00e1pidamente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-conclusion\"><strong>Conclusi\u00f3n<\/strong><\/h2>\n\n\n\n<p>SQL Server 2025 ha trascendido su rol de motor relacional para convertirse en un int\u00e9rprete sem\u00e1ntico, incluso podr\u00edamos hablar de un RAG. Esta es una funcionalidad real, integrada, segura y rapid\u00edsima que cambia fundamentalmente la forma en que interactuamos con los datos. La capacidad de &#8220;chatear&#8221; con tu base de datos de manera natural y obtener resultados basados en el significado abre puertas a soluciones que antes eran inviables o extremadamente complejas. La IA en SQL Server ha llegado para quedarse y transformar\u00e1 las operaciones de base de datos.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La Public Preview de SQL Server 2025 ya est\u00e1 disponible y no es para nada una actualizaci\u00f3n menor. Esta nueva versi\u00f3n marca un hito significativo al integrar capacidades de Inteligencia Artificial (IA) directamente en su motor de base de datos, transformando la forma en que interactuamos con nuestros datos. Lejos de ser un simple plugin&#8230; <a class=\"more-link\" href=\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/\">Read more<\/a><\/p>\n","protected":false},"author":321,"featured_media":33189,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","_uag_custom_page_level_css":"","_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[10606],"tags":[13423,10664,13421],"collections":[],"class_list":{"0":"post-33468","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-backend-es","8":"tag-base-de-datos","9":"tag-ia","10":"tag-sql-server","11":"entry"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>B\u00fasquedas Sem\u00e1nticas con IA en SQL Server 2025: Teor\u00eda y Pr\u00e1ctica - Codemotion Magazine<\/title>\n<meta name=\"description\" content=\"La Public Preview de SQL Server 2025 ya est\u00e1 disponible y no es para nada una actualizaci\u00f3n menor. Ent\u00e9rate de todo en este art\u00edculo.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"B\u00fasquedas Sem\u00e1nticas con IA en SQL Server 2025: Teor\u00eda y Pr\u00e1ctica\" \/>\n<meta property=\"og:description\" content=\"La Public Preview de SQL Server 2025 ya est\u00e1 disponible y no es para nada una actualizaci\u00f3n menor. Ent\u00e9rate de todo en este art\u00edculo.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/\" \/>\n<meta property=\"og:site_name\" content=\"Codemotion Magazine\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Codemotion.Italy\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-07-02T07:06:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-07-02T07:06:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/6500351-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1969\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Roberto Carrancio\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@soy_dba\" \/>\n<meta name=\"twitter:site\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Roberto Carrancio\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/\"},\"author\":{\"name\":\"Roberto Carrancio\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/97a034bd0d0536df0240ef899434fa19\"},\"headline\":\"B\u00fasquedas Sem\u00e1nticas con IA en SQL Server 2025: Teor\u00eda y Pr\u00e1ctica\",\"datePublished\":\"2025-07-02T07:06:54+00:00\",\"dateModified\":\"2025-07-02T07:06:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/\"},\"wordCount\":1732,\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/6500351-scaled.jpg\",\"keywords\":[\"base de datos\",\"IA\",\"SQL server\"],\"articleSection\":[\"Backend\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/\",\"name\":\"B\u00fasquedas Sem\u00e1nticas con IA en SQL Server 2025: Teor\u00eda y Pr\u00e1ctica - Codemotion Magazine\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/6500351-scaled.jpg\",\"datePublished\":\"2025-07-02T07:06:54+00:00\",\"dateModified\":\"2025-07-02T07:06:56+00:00\",\"description\":\"La Public Preview de SQL Server 2025 ya est\u00e1 disponible y no es para nada una actualizaci\u00f3n menor. Ent\u00e9rate de todo en este art\u00edculo.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/#primaryimage\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/6500351-scaled.jpg\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/6500351-scaled.jpg\",\"width\":2560,\"height\":1969,\"caption\":\"ia en SQL server actualizacion y busqueda semantica imagen\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Backend\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"B\u00fasquedas Sem\u00e1nticas con IA en SQL Server 2025: Teor\u00eda y Pr\u00e1ctica\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"name\":\"Codemotion Magazine\",\"description\":\"We code the future. Together\",\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\",\"name\":\"Codemotion\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"width\":225,\"height\":225,\"caption\":\"Codemotion\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Codemotion.Italy\/\",\"https:\/\/x.com\/CodemotionIT\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/97a034bd0d0536df0240ef899434fa19\",\"name\":\"Roberto Carrancio\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/06\/2-100x100.png\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/06\/2-100x100.png\",\"caption\":\"Roberto Carrancio\"},\"description\":\"Mi nombre es Roberto Carrancio y soy un DBA de SQL server con m\u00e1s de 12 a\u00f1os de experiencia en el sector. Recientemente he sido reconocido como Microsoft MVP en la categor\u00eda Data Platform en SQL Server y en Azure SQL. Durante mis a\u00f1os de experiencia he tenido oportunidad de lidiar con proyectos en compa\u00f1\u00edas de todos los tama\u00f1os y sectores, desde pymes hasta grandes multinacionales. Tambi\u00e9n soy el creador del blog soydba.es donde intento publicar varios art\u00edculos a la semana.\",\"sameAs\":[\"https:\/\/www.soydba.es\",\"https:\/\/www.linkedin.com\/in\/robertocarrancio\/\",\"https:\/\/x.com\/soy_dba\",\"https:\/\/www.youtube.com\/@SoyDBA\"],\"url\":\"https:\/\/www.codemotion.com\/magazine\/author\/rocarrancio\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"B\u00fasquedas Sem\u00e1nticas con IA en SQL Server 2025: Teor\u00eda y Pr\u00e1ctica - Codemotion Magazine","description":"La Public Preview de SQL Server 2025 ya est\u00e1 disponible y no es para nada una actualizaci\u00f3n menor. Ent\u00e9rate de todo en este art\u00edculo.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/","og_locale":"en_US","og_type":"article","og_title":"B\u00fasquedas Sem\u00e1nticas con IA en SQL Server 2025: Teor\u00eda y Pr\u00e1ctica","og_description":"La Public Preview de SQL Server 2025 ya est\u00e1 disponible y no es para nada una actualizaci\u00f3n menor. Ent\u00e9rate de todo en este art\u00edculo.","og_url":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/","og_site_name":"Codemotion Magazine","article_publisher":"https:\/\/www.facebook.com\/Codemotion.Italy\/","article_published_time":"2025-07-02T07:06:54+00:00","article_modified_time":"2025-07-02T07:06:56+00:00","og_image":[{"width":2560,"height":1969,"url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/6500351-scaled.jpg","type":"image\/jpeg"}],"author":"Roberto Carrancio","twitter_card":"summary_large_image","twitter_creator":"@soy_dba","twitter_site":"@CodemotionIT","twitter_misc":{"Written by":"Roberto Carrancio","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/#article","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/"},"author":{"name":"Roberto Carrancio","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/97a034bd0d0536df0240ef899434fa19"},"headline":"B\u00fasquedas Sem\u00e1nticas con IA en SQL Server 2025: Teor\u00eda y Pr\u00e1ctica","datePublished":"2025-07-02T07:06:54+00:00","dateModified":"2025-07-02T07:06:56+00:00","mainEntityOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/"},"wordCount":1732,"publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/6500351-scaled.jpg","keywords":["base de datos","IA","SQL server"],"articleSection":["Backend"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/","url":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/","name":"B\u00fasquedas Sem\u00e1nticas con IA en SQL Server 2025: Teor\u00eda y Pr\u00e1ctica - Codemotion Magazine","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/#primaryimage"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/6500351-scaled.jpg","datePublished":"2025-07-02T07:06:54+00:00","dateModified":"2025-07-02T07:06:56+00:00","description":"La Public Preview de SQL Server 2025 ya est\u00e1 disponible y no es para nada una actualizaci\u00f3n menor. Ent\u00e9rate de todo en este art\u00edculo.","breadcrumb":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/#primaryimage","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/6500351-scaled.jpg","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/6500351-scaled.jpg","width":2560,"height":1969,"caption":"ia en SQL server actualizacion y busqueda semantica imagen"},{"@type":"BreadcrumbList","@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/busquedas-semanticas-con-ia-en-sql-server-2025-teoria-y-practica\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.codemotion.com\/magazine\/"},{"@type":"ListItem","position":2,"name":"Backend","item":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/"},{"@type":"ListItem","position":3,"name":"B\u00fasquedas Sem\u00e1nticas con IA en SQL Server 2025: Teor\u00eda y Pr\u00e1ctica"}]},{"@type":"WebSite","@id":"https:\/\/www.codemotion.com\/magazine\/#website","url":"https:\/\/www.codemotion.com\/magazine\/","name":"Codemotion Magazine","description":"We code the future. Together","publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.codemotion.com\/magazine\/#organization","name":"Codemotion","url":"https:\/\/www.codemotion.com\/magazine\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","width":225,"height":225,"caption":"Codemotion"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Codemotion.Italy\/","https:\/\/x.com\/CodemotionIT"]},{"@type":"Person","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/97a034bd0d0536df0240ef899434fa19","name":"Roberto Carrancio","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/06\/2-100x100.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/06\/2-100x100.png","caption":"Roberto Carrancio"},"description":"Mi nombre es Roberto Carrancio y soy un DBA de SQL server con m\u00e1s de 12 a\u00f1os de experiencia en el sector. Recientemente he sido reconocido como Microsoft MVP en la categor\u00eda Data Platform en SQL Server y en Azure SQL. Durante mis a\u00f1os de experiencia he tenido oportunidad de lidiar con proyectos en compa\u00f1\u00edas de todos los tama\u00f1os y sectores, desde pymes hasta grandes multinacionales. Tambi\u00e9n soy el creador del blog soydba.es donde intento publicar varios art\u00edculos a la semana.","sameAs":["https:\/\/www.soydba.es","https:\/\/www.linkedin.com\/in\/robertocarrancio\/","https:\/\/x.com\/soy_dba","https:\/\/www.youtube.com\/@SoyDBA"],"url":"https:\/\/www.codemotion.com\/magazine\/author\/rocarrancio\/"}]}},"featured_image_src":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/6500351-600x400.jpg","featured_image_src_square":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/6500351-600x600.jpg","author_info":{"display_name":"Roberto Carrancio","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/rocarrancio\/"},"uagb_featured_image_src":{"full":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/6500351-scaled.jpg",2560,1969,false],"thumbnail":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/6500351-150x150.jpg",150,150,true],"medium":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/6500351-300x231.jpg",300,231,true],"medium_large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/6500351-768x591.jpg",768,591,true],"large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/6500351-1024x788.jpg",1024,788,true],"1536x1536":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/6500351-1536x1182.jpg",1536,1182,true],"2048x2048":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/6500351-2048x1575.jpg",2048,1575,true],"small-home-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/6500351-100x100.jpg",100,100,true],"sidebar-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/6500351-180x128.jpg",180,128,true],"genesis-singular-images":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/6500351-896x504.jpg",896,504,true],"archive-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/6500351-400x225.jpg",400,225,true],"gb-block-post-grid-landscape":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/6500351-600x400.jpg",600,400,true],"gb-block-post-grid-square":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/03\/6500351-600x600.jpg",600,600,true]},"uagb_author_info":{"display_name":"Roberto Carrancio","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/rocarrancio\/"},"uagb_comment_info":0,"uagb_excerpt":"La Public Preview de SQL Server 2025 ya est\u00e1 disponible y no es para nada una actualizaci\u00f3n menor. Esta nueva versi\u00f3n marca un hito significativo al integrar capacidades de Inteligencia Artificial (IA) directamente en su motor de base de datos, transformando la forma en que interactuamos con nuestros datos. Lejos de ser un simple plugin&#8230;&hellip;","lang":"es","_links":{"self":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/33468","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/users\/321"}],"replies":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/comments?post=33468"}],"version-history":[{"count":2,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/33468\/revisions"}],"predecessor-version":[{"id":33560,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/33468\/revisions\/33560"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media\/33189"}],"wp:attachment":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media?parent=33468"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/categories?post=33468"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/tags?post=33468"},{"taxonomy":"collections","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/collections?post=33468"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}