{"id":2102,"date":"2020-07-17T21:34:50","date_gmt":"2020-07-17T21:34:50","guid":{"rendered":"http:\/\/manualsqlserver.com\/?p=2102"},"modified":"2020-07-17T21:39:13","modified_gmt":"2020-07-17T21:39:13","slug":"insercion-de-funciones-definidas-por-el-usuario","status":"publish","type":"post","link":"https:\/\/manualsqlserver.com\/?p=2102","title":{"rendered":"Inserci\u00f3n de Funciones definidas por el usuario"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"220\" height=\"260\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares__D.png\" alt=\"\" class=\"wp-image-2103\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Inserci\u00f3n de UDF escalares SQL Server 2019<\/h2>\n\n\n\n<p>La Inserci\u00f3n de UDF escalar (Funci\u00f3n definida por el usuario escalar), es una caracter\u00edstica nueva de <strong>SQL Server 2019<\/strong> inclu\u00edda dentro del procesamiento de consultas inteligentes. La inserci\u00f3n de UDF escalar mejora el rendimiento de las consultas que llaman a UDF escalares en SQL Server. <\/p>\n\n\n\n<p>Las UDF escalares en SQL Server son los tipos de funciones definidas por  el usuario que devuelven un \u00fanico valor. El objetivo de usar las UDF es de la reutilizaci\u00f3n y modularidad del c\u00f3digo en todas las consultas en SQL Server.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Para m\u00e1s informaci\u00f3n:<br><a href=\"https:\/\/manualsqlserver.com\/?p=335\" target=\"_blank\" rel=\"noreferrer noopener\">Ver funciones definidas por el usuario.<\/a><br><a href=\"https:\/\/manualsqlserver.com\/?p=657\" target=\"_blank\" rel=\"noreferrer noopener\">Ver Funciones definidas por el usuario con valores de tabla.<\/a><\/p>\n\n\n\n<p style=\"font-size:24px\"><strong>Rendimiento de las UDF escalares en SQL Server<\/strong><\/p>\n\n\n\n<p>Las UDF escalares pueden tener un rendimiento deficiente por lo siguiente:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li><strong>Invocaci\u00f3n iterativa:<\/strong> la UDF escalar se invocan en cada registro, lo que supone costos adicionales en cada cambio de contexto.<\/li><li><strong>Falta de costos:<\/strong> durante la optimizaci\u00f3n, solo se calcula el costo de los operadores relacionales, mientras que el de<br>los operadores escalares no.<\/li><li><strong>Ejecuci\u00f3n interpretada:<\/strong> las UDF se eval\u00faan como un lote de instrucciones, y se ejecutan instrucci\u00f3n por instrucci\u00f3n.<\/li><li><strong>La ejecuci\u00f3n en serie<\/strong>, debido a que SQL Server no admite el paralelismo entre consultas en las consultas que invocan las UDF.<\/li><\/ol>\n\n\n\n<script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-2636008503986218\"\n     data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<p style=\"font-size:24px\"><strong>Inserci\u00f3n autom\u00e1tica de UDF escalares<\/strong><\/p>\n\n\n\n<p>La caracter\u00edstica de Inserci\u00f3n de UDF escalar permite mejorar el rendimiento de las consultas que consumen funciones definidas por el usuario escalares de SQL Server, donde el uso de una UDF puede causar lentitud.<br>Esta nueva caracter\u00edstica transforman autom\u00e1ticamente las UDF escalares en subconsultas escalares que se sustituyen en la consulta que realiza la llamada a la UDF. El plan de ejecuci\u00f3n de la consulta permite ver como al UDF escalar se incluye en la consulta.<\/p>\n\n\n\n<p style=\"font-size:24px\"><strong>Ejemplos<\/strong><\/p>\n\n\n\n<p><strong>Usando la base de datos Northwind<\/strong><br>use northwind<br>go<\/p>\n\n\n\n<p style=\"font-size:22px\"><strong>Ejercicio 1<\/strong><\/p>\n\n\n\n<p>Mostar las categor\u00edas y la cantidad de productos en Stock de cada una de estas.<\/p>\n\n\n\n<p><strong>Consulta con Join y agrupamientos<\/strong><br>select C.CategoryID, C.Categoryname,<br> count(P.CategoryID) As &#8216;Cantidad&#8217;<br> from Categories As C<br> join Products As P on C.CategoryID = P.CategoryID<br>group by C.CategoryID, C.Categoryname<br>go<\/p>\n\n\n\n<p><strong>La imagen muestra el listado.<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_01.png\" alt=\"\" class=\"wp-image-2104\" width=\"578\" height=\"407\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_01.png 423w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_01-300x211.png 300w\" sizes=\"auto, (max-width: 578px) 100vw, 578px\" \/><\/figure>\n\n\n\n<p><strong>La UDF para la cantidad de productos es como sigue:<\/strong><br>Create function udfCantidadProductosCategoria(@CodigoCategoria int)<br>returns int<br>As<br>Begin<br>Declare @Cantidad int<br>Set @Cantidad =<br>(select count(P.ProductID) from Products As P<br>where P.CategoryID = @CodigoCategoria)<br>return @Cantidad<br>End<br>go<\/p>\n\n\n\n<p><strong>Ejecutar la consulta con el nivel de compatibilidad de una versi\u00f3n anterior a SQL Server 2019.<\/strong><\/p>\n\n\n\n<p><strong>Cambiando el nivel de compatibilidad a SQL Server 2014<\/strong><br>Alter database Northwind set compatibility_Level = 130<br>go<\/p>\n\n\n\n<p><strong>Ejecutando la consulta<\/strong><br>select C.CategoryID, C.Categoryname,<br>dbo.udfCantidadProductosCategoria(C.CategoryID) As &#8216;Cantidad&#8217;<br>from Categories As C<br>go<\/p>\n\n\n\n<p><strong>El plan estimado de ejecuci\u00f3n se muestra como en la imagen siguiente<br>Note que la UDF se ejecuta en una consulta adicional.<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_02-1024x393.png\" alt=\"\" class=\"wp-image-2105\" width=\"737\" height=\"282\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_02-1024x393.png 1024w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_02-300x115.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_02-768x295.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_02.png 1037w\" sizes=\"auto, (max-width: 737px) 100vw, 737px\" \/><\/figure>\n\n\n\n<p><strong>Regresando el nivel de compatibilidad a SQL Server 2019 (150)<\/strong><br>Alter database Northwind set compatibility_Level = 150<br>go<\/p>\n\n\n\n<p><strong>Ejecutando la consulta<\/strong><br>select C.CategoryID, C.Categoryname,<br>dbo.<strong>udfCantidadProductosCategoria<\/strong>(C.CategoryID) As &#8216;Cantidad&#8217;<br>from Categories As C<br>go<\/p>\n\n\n\n<p>El plan estimado de ejecuci\u00f3n se muestra como en la imagen siguiente<br>Note que la UDF autom\u00e1ticamente al ejecutarse en SQL Server 2019 se incluye en la consulta principal.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_03.png\" alt=\"\" class=\"wp-image-2106\" width=\"764\" height=\"211\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_03.png 1022w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_03-300x83.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_03-768x212.png 768w\" sizes=\"auto, (max-width: 764px) 100vw, 764px\" \/><\/figure>\n\n\n\n<p style=\"font-size:22px\"><strong>Ejercicio 2<\/strong><\/p>\n\n\n\n<p style=\"font-size:22px\"><strong>UDF escalar con varias instrucciones<\/strong><\/p>\n\n\n\n<p>En este ejercicio se va a crear una UDF que permita calificar al empleado de acuerdo a un volumen de ventas. <br>Para calcular el total de ventas de un empleado se debe calcular la suma del total de las \u00f3rdenes, el diagrama mostrado nos ayuda a entender el conjunto de  resultados.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_04.png\" alt=\"\" class=\"wp-image-2107\" width=\"691\" height=\"826\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_04.png 612w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_04-251x300.png 251w\" sizes=\"auto, (max-width: 691px) 100vw, 691px\" \/><\/figure>\n\n\n\n<p><strong>Para calcular el total de una orden se va a crear una UDF escalar<\/strong><br>Create function dbo.udfTotalPorOrden(@NumeroOrden int)<br>                  Returns Numeric(9,2)<br>As<br>Begin<br>Declare @TotalOrden Numeric(9,2)<br>Set @TotalOrden =<br>(select sum((D.UnitPrice * D.Quantity)*(1 &#8211; D.Discount))<br>from [Order Details] As D where D.OrderID =@NumeroOrden )<br>Return @TotalOrden<br>End<br>go<\/p>\n\n\n\n<p><strong>Para calcular el total de la orden n\u00ba 10248<\/strong><br>Select dbo.udfTotalPorOrden(10248)<br>go<\/p>\n\n\n\n<p><strong>Para calcular el total de ventas de un empleado se deben sumar todas los totales de las \u00f3rdenes<br><\/strong>Create function dbo.udfTotalVentasPorEmpleado(@CodigoEmpleado int)<br>     Returns Numeric(9,2)<br>As<br>Begin<br>Declare @TotalVentasEmpleado Numeric(9,2)<br>Set @TotalVentasEmpleado =<br>(select sum(dbo.<strong>udfTotalPorOrden<\/strong>(O.OrderID))<br>from Orders As O where O.EmployeeID = @CodigoEmpleado)<br>Return @TotalVentasEmpleado<br>End<br>go<\/p>\n\n\n\n<p style=\"font-size:18px\"><strong>Las ventas de los empleados se muestran en el listado siguiente<\/strong><\/p>\n\n\n\n<p>select Empleado = concat_ws(&#8216; &#8216;,E.FirstName, E.LastName),<br>dbo.udfTotalVentasPorEmpleado(E.EmployeeID) As Total<br>from employees As E<br>order by Total desc<br>go<br>El listado es el siguiente<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_05.png\" alt=\"\" class=\"wp-image-2108\" width=\"623\" height=\"602\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_05.png 358w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_05-300x290.png 300w\" sizes=\"auto, (max-width: 623px) 100vw, 623px\" \/><\/figure>\n\n\n\n<p>El plan de ejecuci\u00f3n del listado en SQL Server 2019<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_06-1024x219.png\" alt=\"\" class=\"wp-image-2109\" width=\"813\" height=\"174\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_06-1024x219.png 1024w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_06-300x64.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_06-768x164.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_06-1536x329.png 1536w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_06.png 1794w\" sizes=\"auto, (max-width: 813px) 100vw, 813px\" \/><\/figure>\n\n\n\n<p style=\"font-size:18px\"><strong>Cambiando el nivel de compatibilidad a SQL Server 2017<\/strong><\/p>\n\n\n\n<p>Alter database Northwind set compatibility_Level = 140<br>go<br>El listado de los empleados<br>select Empleado = concat_ws(&#8216; &#8216;,E.FirstName, E.LastName),<br>dbo.udfTotalVentasPorEmpleado(E.EmployeeID) As Total<br>from employees As E<br>order by Total desc<br>go<\/p>\n\n\n\n<p><strong>El plan de ejecuci\u00f3n del listado en SQL Server 2017.<br>Note que se realizan 3 consultas, se muestran en la imagen en recuadros verdes.<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_07-1024x507.png\" alt=\"\" class=\"wp-image-2110\" width=\"772\" height=\"382\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_07-1024x507.png 1024w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_07-300x149.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_07-768x380.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_07.png 1258w\" sizes=\"auto, (max-width: 772px) 100vw, 772px\" \/><\/figure>\n\n\n\n<p><strong>Para calificar el empleado de acuerdo a las ventas se usar\u00e1n los siguientes rangos:<br>Menor a 100,000: Regular<br>Hasta 200,000: Gold<br>M\u00e1s de 200,000: Platinium<\/strong><\/p>\n\n\n\n<p><strong>La UDF para la calificaci\u00f3n es como sigue:<\/strong><\/p>\n\n\n\n<p>Create or alter function dbo.<strong>udfCalificaEmpleadoVolumenVenta<\/strong>(@CodigoEmpleado int)<br>Returns nvarchar(9)<br>As<br>Begin<br>Declare @TotalVentas Numeric(9,2)<br>Declare @Calificacion nvarchar(9)<br>Set @TotalVentas = (select dbo.udfTotalVentasPorEmpleado(@CodigoEmpleado)<br>from employees As E where E.EmployeeID = @CodigoEmpleado )<br>&#8212; Calificaci\u00f3n del empleado<br>If @TotalVentas &lt; 100000 Begin<br>Set @Calificacion = &#8216;Regular&#8217; End<br>Else If @TotalVentas &lt; 200000 Begin<br>Set @Calificacion = &#8216;Gold&#8217; End<br>Else Begin<br>Set @Calificacion = &#8216;Platinium&#8217; End<br>Return @Calificacion<br>End<br>go<\/p>\n\n\n\n<p><strong>Regresar al nivel de compatibilidad de SQL Server 2019<\/strong><br>Alter database Northwind set compatibility_Level = 150<br>go<\/p>\n\n\n\n<p><strong>Listado de los empleados y su calificaci\u00f3n<\/strong><\/p>\n\n\n\n<p>select Empleado = concat_ws(&#8216; &#8216;,E.FirstName, E.LastName),<br>dbo.udfTotalVentasPorEmpleado(E.EmployeeID) As Total,<br>dbo.udfCalificaEmpleadoVolumenVenta(E.EmployeeID) As &#8216;Calificativo&#8217;<br>from employees As E<br>order by Total desc<br>go<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_08.png\" alt=\"\" class=\"wp-image-2111\" width=\"692\" height=\"533\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_08.png 462w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_08-300x231.png 300w\" sizes=\"auto, (max-width: 692px) 100vw, 692px\" \/><\/figure>\n\n\n\n<p>Plan de ejecuci\u00f3n para SQL Server 2019<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_09-1024x359.png\" alt=\"\" class=\"wp-image-2112\" width=\"818\" height=\"287\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_09-1024x359.png 1024w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_09-300x105.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_09-768x269.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_09-1536x539.png 1536w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_09.png 1916w\" sizes=\"auto, (max-width: 818px) 100vw, 818px\" \/><\/figure>\n\n\n\n<p>Plan de ejecuci\u00f3n para SQL Server 2017<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_10-1024x762.png\" alt=\"\" class=\"wp-image-2113\" width=\"805\" height=\"599\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_10-1024x762.png 1024w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_10-300x223.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_10-768x571.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_10-1536x1142.png 1536w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_10.png 1920w\" sizes=\"auto, (max-width: 805px) 100vw, 805px\" \/><\/figure>\n\n\n\n<script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-2636008503986218\"\n     data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<p style=\"font-size:24px\"><strong>Requisitos para que las UDF escalares se inserten<\/strong><\/p>\n\n\n\n<p><strong>Para que se pueda insertar una UDF escalar se debe cumplir las siguientes condiciones.<\/strong><\/p>\n\n\n\n<p>La UDF se escribe usando DECLARE y SET, SELECT, IF\/ELSE, RETURN, UDF anidadas o usando EXISTS o ISNULL.<br>La UDF no invoca ninguna funci\u00f3n intr\u00ednseca que dependa de la hora.<br>La UDF usa la cl\u00e1usula Execute As Caller<br>La UDF no hace referencia a variables de tabla.<br>La consulta que invoca una UDF escalar no agrupa usando Group by.<br>La consulta que invoca una UDF escalar usando DISTINCT no contiene ORDER BY.<br>La UDF no se utiliza en la cl\u00e1usula ORDER BY.<br>La UDF no se usa en una columna calculada<br>La UDF no se una en una definici\u00f3n de restricci\u00f3n CHECK.<br>La UDF no hace referencia a tipos definidos por el usuario.<br>La UDF no es una funci\u00f3n de partici\u00f3n.<br>La UDF no contiene referencias a expresiones de tabla comunes (CTE).<\/p>\n\n\n\n<p style=\"font-size:22px\"><strong>Comprobaci\u00f3n de si una UDF se puede insertar o no<\/strong><\/p>\n\n\n\n<p>Para todas las UDF escalares de SQL Server, la vista de cat\u00e1logo <strong>sys.sql_modules<\/strong> incluye una propiedad denominada <strong>is_inlineable<\/strong>,<br>que indica si una UDF se puede insertar o no.<\/p>\n\n\n\n<p><strong>Regresar al nivel de compatibilidad de SQL Server 2019<\/strong><br>Alter database Northwind set compatibility_Level = 150<br>go<\/p>\n\n\n\n<p><strong>El listado de las UDF utilizadas en este art\u00edculo<\/strong><br>select definition as &#8216;Texto&#8217;, is_inlineable from sys.sql_modules<br>where definition like &#8216;Create function%&#8217;<br>go<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_11.png\" alt=\"\" class=\"wp-image-2114\" width=\"743\" height=\"231\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_11.png 888w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_11-300x93.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_InsercionUDF_escalares_11-768x239.png 768w\" sizes=\"auto, (max-width: 743px) 100vw, 743px\" \/><\/figure>\n\n\n\n<p style=\"font-size:22px\"><strong>Crear UDF escalares especificando si se pueden insertar o no.<\/strong><\/p>\n\n\n\n<p>Para crear una UDF escalar y especificar si se va a insertar se usa la cl\u00e1usula <strong>With Inline<\/strong><\/p>\n\n\n\n<p><strong>UDF que NO se puede insertar<\/strong>, en este ejercicio se ha utilizado la cl\u00e1usula With inline = Off.<\/p>\n\n\n\n<p>Create or Alter Function dbo.udfCalculaTotalItem(@Precio Numeric(9,2), @Cantidad Numeric(9,2))<br>RETURNS Numeric(9,2) <strong>WITH INLINE = OFF<\/strong><br>As<br>BEGIN<br>RETURN @Precio * @Cantidad<br>END<br>go<\/p>\n\n\n\n<p>UDF que SI se puede insertar, obviamente debe cumplir los requerimientos. Se ha utilizado la cl\u00e1usula <strong>with inline = on<\/strong><\/p>\n\n\n\n<p>Create or Alter Function dbo.udfCalculaTotalItem(@Precio Numeric(9,2), @Cantidad Numeric(9,2))<br>RETURNS Numeric(9,2) WITH INLINE = On<br>As<br>BEGIN<br>RETURN @Precio * @Cantidad<br>END<br>go<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Inserci\u00f3n de UDF escalares SQL Server 2019 La Inserci\u00f3n de UDF escalar (Funci\u00f3n definida por el usuario escalar), es una caracter\u00edstica nueva de SQL Server 2019 inclu\u00edda dentro del procesamiento de consultas inteligentes. La inserci\u00f3n de UDF escalar mejora el rendimiento de las consultas que llaman a UDF escalares en SQL Server. Las UDF escalares &hellip; <\/p>\n<p><a class=\"more-link btn\" href=\"https:\/\/manualsqlserver.com\/?p=2102\">Seguir leyendo<\/a><\/p>\n","protected":false},"author":1,"featured_media":2103,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,236,8],"tags":[16,234,235],"class_list":["post-2102","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-consultasdedatos","category-udffunciones","category-programacion","tag-create-function","tag-udf","tag-udf-en-sql-server","nodate","item-wrap"],"_links":{"self":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/2102","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2102"}],"version-history":[{"count":1,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/2102\/revisions"}],"predecessor-version":[{"id":2115,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/2102\/revisions\/2115"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/media\/2103"}],"wp:attachment":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2102"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2102"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2102"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}