{"id":3617,"date":"2017-05-25T14:41:17","date_gmt":"2017-05-25T14:41:17","guid":{"rendered":"http:\/\/devel.webpartners.es\/inttao\/?p=3617"},"modified":"2017-05-26T07:48:15","modified_gmt":"2017-05-26T07:48:15","slug":"blog-udf-compilada","status":"publish","type":"post","link":"https:\/\/www.inttao.com\/es\/blog-udf-compilada\/","title":{"rendered":"Blog UDF Compilada"},"content":{"rendered":"<p>[vc_row el_class=\u00bbsingle-right-column\u00bb][vc_column][vc_single_image image=\u00bb3136&#8243; img_size=\u00bbfull\u00bb][\/vc_column][\/vc_row][vc_row][vc_column css=\u00bb.vc_custom_1495784835541{padding-right: 50px !important;padding-bottom: 66px !important;padding-left: 45px !important;}\u00bb][vc_column_text]Contents<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"#_Toc466480727\">Introducci\u00f3n. 2<\/a><\/p>\n<p><a href=\"#_Toc466480728\">Por qu\u00e9 crear procedimientos sql compilados?. 3<\/a><\/p>\n<p><a href=\"#_Toc466480729\">Debug de funciones compiladas. 4<\/a><\/p>\n<p><a href=\"#_Toc466480730\">Restauraci\u00f3n de base de datos. 6<\/a><\/p>\n<h1><a name=\"_Toc466480727\"><\/a>Introducci\u00f3n<\/h1>\n<p>Las funciones definidas por el usuario son rutinas que pueden aceptar par\u00e1metros, realizar c\u00e1lculos u otras acciones y devolver un resultado. Puede escribir funciones definidas por el usuario en cualquier lenguaje de programaci\u00f3n de Microsoft .NET Framework, como Microsoft Visual Basic .NET o Microsoft Visual C#.<\/p>\n<p>Fuente msdn microsoft : <a href=\"https:\/\/msdn.microsoft.com\/es-es\/library\/ms254508(v=vs.110).aspx\">https:\/\/msdn.microsoft.com\/es-es\/library\/ms254508(v=vs.110).aspx<\/a><\/p>\n<h1><a name=\"_Toc466480728\"><\/a>Por qu\u00e9 crear procedimientos sql compilados?<\/h1>\n<p>&nbsp;<\/p>\n<p>Microsoft SQL Server proporciona compatibilidad con tipos definidos por el usuario (UDT) implementados con Common Language Runtime (CLR) de Microsoft .NET Framework.CLR se integra en SQL Server y este mecanismo permite ampliar el sistema de tipos de la base de datos. Los tipos definidos por el usuario proporcionan al usuario extensibilidad del sistema de tipos de datos de SQL Server, as\u00ed como la capacidad para definir tipos estructurados complejos.<\/p>\n<p>&nbsp;<\/p>\n<p>Desde la perspectiva de una arquitectura de aplicaci\u00f3n, pueden proporcionar dos ventajas clave:<\/p>\n<ul>\n<li>S\u00f3lido encapsulado (en el cliente y el servidor) entre el estado interno y los comportamientos externos.<\/li>\n<li>Fuerte integraci\u00f3n con otras caracter\u00edsticas de servidor relacionadas.Una vez definidos sus propios tipos definidos por el usuario, puede utilizarlos en todos los contextos en los que pueda emplear un tipo de sistema de SQL Server, como definiciones de columnas, variables, par\u00e1metros, resultados de funciones, cursores, desencadenadores y replicaci\u00f3n.<\/li>\n<\/ul>\n<p>Fuente msdn microsoft :<a href=\"%20https:\/msdn.microsoft.com\/es-es\/library\/ms254944(v=vs.110).aspx\"> https:\/\/msdn.microsoft.com\/es-es\/library\/ms254944(v=vs.110).aspx<\/a><\/p>\n<h1><a name=\"_Toc466480729\"><\/a>Debug de funciones compiladas<\/h1>\n<p>&nbsp;<\/p>\n<p>Tener en cuenta al momento de realizar debug de funciones compiladas que debemos ajustar\u00a0 las propiedades de debugging de visual studio. Para realizar dichos ajustes hacer click en \u201cDebug\u201d y luego \u201cOptions and Settings..\u201d<\/p>\n<p>Luego veremos en la secci\u00f3n \u201cDebugging\u201d -&gt; \u201cGeneral\u201d que tendremos chequeado por default \u201cEnable Just My Code ( Managed only)\u201d esta opci\u00f3n no debe estar chequeada.<\/p>\n<p>En caso de tener chequeada esa opci\u00f3n lo que pasara es que al querer debuggear una funci\u00f3n compilada solo mostrara el resultado de la misma sin poder hacer el step into, el motivo de este comportamiento es porque no es c\u00f3digo nativo de c#.<\/p>\n<p>Una vez realizado este ajuste es importante hacer right click sobre el test script que deseamos probar y click en \u201cSet as Default Debug Script\u201d. Luego para empezar el debug es importante hacer click en \u201cDebug Script\u201d.<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" class=\"alignnone size-medium wp-image-4218\" src=\"http:\/\/pruebasinntao.damseproduction10.com\/wp-content\/uploads\/2016\/12\/debug_funciones1.jpg\" alt=\"buenosaires\" width=\"300\" height=\"188\" \/><\/p>\n<h1><a name=\"_Toc466480730\"><\/a>Restauraci\u00f3n de base de datos<\/h1>\n<p>&nbsp;<\/p>\n<p>Al restaurar una base de datos que contenga procedimientos compilados .net deber\u00e1 tenerse en cuenta que es necesario eliminar los assemblies generados correspondientes a dichos procedimientos y volver a generarlos. A continuaci\u00f3n se toma una base de datos de ejemplo y se muestran los pasos a seguir para realizar la restauraci\u00f3n.<\/p>\n<ol>\n<li><strong>Restaurar la base de datos<\/strong><\/li>\n<\/ol>\n<ol start=\"2\">\n<li><strong>Una vez restaurada la base debemos borrar los assemblies y volver a generarlos, para visualizar cuales son, podemos ir a programability -&gt; Assemblies<\/strong><\/li>\n<\/ol>\n<ol start=\"3\">\n<li><strong><strong>El primer paso es setear la base de datos con TRUSTWORTHY ON, esta instrucci\u00f3n sirve para indicar al motor de base de datos que puede confiar en los ensamblados y el contenido de la base de datos<\/strong><\/strong><\/li>\n<\/ol>\n<p>ALTER DATABASE DB_NAME SET TRUSTWORTHY ON<\/p>\n<p><strong>\u00a0<\/strong><\/p>\n<ol start=\"4\">\n<li><strong>El Segundo paso es borrar los assemblies y sus dependencias. Es importante que se ejecute en este orden ya que si no borramos primero los stored procedures y funciones compilados, no podremos borrar los ensamblados.<\/strong><\/li>\n<\/ol>\n<p><strong>\u00a0<\/strong><\/p>\n<p>DROP PROCEDURE Calculation_SP1<\/p>\n<p>DROP PROCEDURE Calculation_SP2<\/p>\n<p>DROP FUNCTION\u00a0 UDF1<\/p>\n<p>DROP assembly [Example.SP.SQL.Calculation]<\/p>\n<p>DROP assembly [System.Data.Entity]<\/p>\n<p>DROP assembly [System.Runtime.Serialization]<\/p>\n<p>DROP ASSEMBLY [SMDiagnostics]<\/p>\n<p>DROP assembly [System.ComponentModel.DataAnnotations]<\/p>\n<p>&nbsp;<\/p>\n<ol start=\"5\">\n<li><strong>Hacemos click derecho sobre assemblies, refresh y no deber\u00edamos ver ning\u00fan assemblie relacionado con las funciones compiladas<\/strong><\/li>\n<\/ol>\n<p><strong>\u00a0<\/strong><\/p>\n<ol start=\"6\">\n<li><strong>Ahora debemos volver a generar los assemblies borrados en el paso anterior:<\/strong><\/li>\n<\/ol>\n<p><strong>\u00a0<\/strong><\/p>\n<p>CREATE ASSEMBLY [SMDiagnostics]<\/p>\n<p>authorization [dbo] \/* puede darse que sea [linksis] *\/<\/p>\n<p>from &#8216;C:\\Windows\\Microsoft.NET\\Framework64\\v3.0\\Windows Communication Foundation\\SMDiagnostics.dll&#8217;<\/p>\n<p>with permission_set = unsafe<\/p>\n<p>&nbsp;<\/p>\n<p>create assembly [System.Runtime.Serialization]<\/p>\n<p>authorization [dbo] \/* puede darse que sea [linksis] *\/<\/p>\n<p>from &#8216;C:\\Windows\\Microsoft.NET\\Framework\\v3.0\\Windows Communication Foundation\\system.runtime.serialization.dll&#8217;<\/p>\n<p>with permission_set = unsafe<\/p>\n<p>&nbsp;<\/p>\n<p>create assembly [System.Data.Entity]<\/p>\n<p>authorization [dbo] \/* puede darse que sea [linksis] *\/<\/p>\n<p>from &#8216;C:\\Program Files\\Reference Assemblies\\Microsoft\\Framework\\v3.5\\system.data.entity.dll&#8217;<\/p>\n<p>with permission_set = unsafe<\/p>\n<p>&nbsp;<\/p>\n<p>create assembly [System.ComponentModel.DataAnnotations]<\/p>\n<p>authorization [dbo] \/* puede darse que sea [linksis] *\/<\/p>\n<p>from &#8216;C:\\Program Files\\Reference Assemblies\\Microsoft\\Framework\\v3.5\\system.componentmodel.dataannotations.dll&#8217;<\/p>\n<p>with permission_set = unsafe<\/p>\n<p>&nbsp;<\/p>\n<ol start=\"7\">\n<li><strong>Ahora debemos volver a generar los assemblies correspondientes a nuestro proyecto Ejemplo.Model.dll y Ejemplo.SQL.CalculationEngine.dll. <\/strong><\/li>\n<\/ol>\n<p><strong>\u00a0<\/strong><\/p>\n<p><strong>Nota : Estas dll corresponden a nuestro proyecto<\/strong><\/p>\n<p>&nbsp;<\/p>\n<p>DECLARE @AssemblyPath nvarchar(255)<\/p>\n<p>&nbsp;<\/p>\n<p>create assembly [Ejemplo.Model]<\/p>\n<p>authorization [dbo]<\/p>\n<p>from @AssemblyPath + &#8216; Ejemplo.Model.dll&#8217;<\/p>\n<p>with permission_set = unsafe<\/p>\n<p>&nbsp;<\/p>\n<p>create assembly [Ejemplo.CalculationEngine]<\/p>\n<p>authorization [dbo]<\/p>\n<p>from @AssemblyPath + &#8216;Ejemplo.CalculationEngine.dll&#8217;<\/p>\n<p>with permission_set = unsafe<\/p>\n<p>&nbsp;<\/p>\n<ol start=\"8\">\n<li><strong>Una vez creados los assemblies, procedemos a crear los stored procedures y funciones compiladas.<\/strong><\/li>\n<\/ol>\n<p><strong>\u00a0<\/strong><\/p>\n<p>CREATE PROCEDURE [dbo].[Calculation_SP1]<\/p>\n<p>WITH EXECUTE AS CALLER<\/p>\n<p>AS<\/p>\n<p>EXTERNAL NAME [Calculation].[StoredProcedures].[SP1]<\/p>\n<p>GO<\/p>\n<p>EXEC sys.sp_addextendedproperty @name=N&#8217;AutoDeployed&#8217;, @value=N&#8217;yes&#8217; , @level0type=N&#8217;SCHEMA&#8217;,@level0name=N&#8217;dbo&#8217;, @level1type=N&#8217;PROCEDURE&#8217;,@level1name=N&#8217;SP_CPER_CalculationEngine_Execute&#8217;<\/p>\n<p>EXEC sys.sp_addextendedproperty @name=N&#8217;SqlAssemblyFile&#8217;, @value=N&#8217;StoredProcedures.cs&#8217; , @level0type=N&#8217;SCHEMA&#8217;,@level0name=N&#8217;dbo&#8217;, @level1type=N&#8217;PROCEDURE&#8217;,@level1name=N&#8217;SP_CPER_CalculationEngine_Execute&#8217;<\/p>\n<p>EXEC sys.sp_addextendedproperty @name=N&#8217;SqlAssemblyFileLine&#8217;, @value=16 , @level0type=N&#8217;SCHEMA&#8217;,@level0name=N&#8217;dbo&#8217;, @level1type=N&#8217;PROCEDURE&#8217;,@level1name=N&#8217;Calculation_SP1&#8242;<\/p>\n<p>GO<\/p>\n<p>CREATE FUNCTION [dbo].[UDF_1](@Param [int])<\/p>\n<p>RETURNS [float] WITH EXECUTE AS CALLER<\/p>\n<p>AS<\/p>\n<p>EXTERNAL NAME [Calculation].[UserDefinedFunctions].[UDF_1]<\/p>\n<p>GO<\/p>\n<p>EXEC sys.sp_addextendedproperty @name=N&#8217;AutoDeployed&#8217;, @value=N&#8217;yes&#8217; , @level0type=N&#8217;SCHEMA&#8217;,@level0name=N&#8217;dbo&#8217;, @level1type=N&#8217;FUNCTION&#8217;,@level1name=N&#8217;UDF_CPER_GetValueByMatrixID&#8217;<\/p>\n<p>EXEC sys.sp_addextendedproperty @name=N&#8217;SqlAssemblyFile&#8217;, @value=N&#8217;UserDefinedFunctions.cs&#8217; , @level0type=N&#8217;SCHEMA&#8217;,@level0name=N&#8217;dbo&#8217;, @level1type=N&#8217;FUNCTION&#8217;,@level1name=N&#8217;UDF_CPER_GetValueByMatrixID&#8217;<\/p>\n<p>EXEC sys.sp_addextendedproperty @name=N&#8217;SqlAssemblyFileLine&#8217;, @value=10 , @level0type=N&#8217;SCHEMA&#8217;,@level0name=N&#8217;dbo&#8217;, @level1type=N&#8217;FUNCTION&#8217;,@level1name=N&#8217;UDF_1&#8242;<\/p>\n<p>&nbsp;<\/p>\n<ol start=\"9\">\n<li><strong>Por ultimo para verificar que las rutinas compiladas est\u00e1n funcionando correctamente podemos ejecutar un stored procedure compilado desde sql management por ejemplo.<\/strong><\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<p>EXEC dbo.Ejemplo.GetCustomers[\/vc_column_text][\/vc_column][\/vc_row]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Las funciones definidas por el usuario son rutinas que pueden aceptar par\u00e1metros, realizar c\u00e1lculos u otras acciones y devolver un resultado.<\/p>\n","protected":false},"author":1,"featured_media":3136,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[59,58,56],"tags":[],"_links":{"self":[{"href":"https:\/\/www.inttao.com\/es\/wp-json\/wp\/v2\/posts\/3617"}],"collection":[{"href":"https:\/\/www.inttao.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inttao.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inttao.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inttao.com\/es\/wp-json\/wp\/v2\/comments?post=3617"}],"version-history":[{"count":3,"href":"https:\/\/www.inttao.com\/es\/wp-json\/wp\/v2\/posts\/3617\/revisions"}],"predecessor-version":[{"id":3632,"href":"https:\/\/www.inttao.com\/es\/wp-json\/wp\/v2\/posts\/3617\/revisions\/3632"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.inttao.com\/es\/wp-json\/wp\/v2\/media\/3136"}],"wp:attachment":[{"href":"https:\/\/www.inttao.com\/es\/wp-json\/wp\/v2\/media?parent=3617"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.inttao.com\/es\/wp-json\/wp\/v2\/categories?post=3617"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inttao.com\/es\/wp-json\/wp\/v2\/tags?post=3617"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}