Your SlideShare is downloading. ×
Udf eficientes
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

Udf eficientes

175
views

Published on

Una antigua presentación sobre UDFs en SQL Server. la primera vez que presenté una sesión en público con Miguel Egea, en la conferencia PortalFox, en Coruña, España, en febrero del 2003

Una antigua presentación sobre UDFs en SQL Server. la primera vez que presenté una sesión en público con Miguel Egea, en la conferencia PortalFox, en Coruña, España, en febrero del 2003

Published in: Software

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
175
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Conferencia Visual FoxPro España 2003 Diseñando Funciones definidas por usuario eficientes en SQL-Server 2000 Fernando G. Guerrero - Solid Quality Learning Miguel Egea – PortalSQL.COM
  • 2. Conferencia Visual FoxPro España 2003 PortalFox.com Información Breve sobre Fernando (2 milisegundos)  MCSD, MCSE+Internet (W2K), MCDBA, MCT, SQL Server MVP  Articulista de SQL-Server Magazine y SQL-Server Profesional.  Mi web-sites http://www.callsql.com y http://www.solidqualitylearning.com  Mi libro. Escrito junto a Carlos E. Rojas  Principal Mentor en Solid Quality Learning
  • 3. Conferencia Visual FoxPro España 2003 PortalFox.com Información Breve sobre Miguel (1 milisegundo)  SQL Server MVP  Articulista en MSDN  Webmaster de http://www.portalsql.com  El libro que más me gusta
  • 4. Conferencia Visual FoxPro España 2003 PortalFox.com ¿Que debe esperar de las UDF’s?  Las UDFs son flexibles, eficientes, versátiles, pero …no están demasiado bien documentadas.  Debe conocer cuando y como usarlas.  La siguiente versión de Sql-Server deberá extender enormemente la funcionalidad de las UDF’s, así que debe empezar con ellas a.s.a.p.  Obtendrá beneficios conociendo que pasa en los escenarios que las use (espera a ver algunas trazas de Profiler)  Quisiéramos enseñaros un montón de ejemplos y un montón más On-Line
  • 5. Conferencia Visual FoxPro España 2003 PortalFox.com ¿Que debería aprender en esta sesión?  Por qué las UDFs son una funcionalidad importante en la programación  Como crear UDFs:  Definidas por el usuario  UDFs del sistema  Como ejecuta SQL-Server las UDF’s  Como convertir vistas y procedimientos almacenados en UDF’s  Como usar algunas funciones indocumentadas del sistema  Como querer a las UDF’s un poquito más cada dia 
  • 6. Conferencia Visual FoxPro España 2003 PortalFox.com Agenda  Introducción a las funciones definidas por el usuario (UDF)  UDF Ventajas y limitaciones  Comentarios sobre funciones no deterministas  Añadiendo funcionalidad A T-SQL con UDF escalares  Redefiniendo vistas como UDF de tabla en línea.  Convirtiendo procedimientos almacenados en Funciones de valores de tabla de múltiples instrucciones  UDFs en las definiciones de integridad Referencial.
  • 7. Conferencia Visual FoxPro España 2003 PortalFox.com Introducción a las UDF’s  Tipos:  Funciones Escalares  De tabla de valores en línea  De tabla de valores de múltiples instrucciones.  Proporcionadas por el sistema  Oficialmente soportadas.  Algunas funciones más (útiles)  Usando plantillas del Analizador de Consultas para crear UDFS  Usando el Analizador para detectar el uso de funciones
  • 8. Conferencia Visual FoxPro España 2003 PortalFox.com Ventajas de las UDF’s   Pueden generalmente ser usadas en cualquier lugar de una consulta  Extienden la funcionalidad de T-SQL.  Son compiladas, como los procedimientos almacenados, ¡Ejecución más rápida!  La creación y el uso son similares a los procedimientos almacenados.
  • 9. Conferencia Visual FoxPro España 2003 PortalFox.com Limitaciones de las UDF’s   Algunas funciones no deterministas no están permitidas dentro de UDF’s.  Devuelven un solo valor.  No pueden modificar datos ….. directamente.  Comparten los 32 niveles de recursión con triggers y procedimientos almacenados.
  • 10. Conferencia Visual FoxPro España 2003 PortalFox.com Máximo 32 niveles de llamada SQL Transaction 1: Stored Procedure 2: Stored Procedure 3: Trigger 30: Trigger 29: Stored Procedure 31: Trigger 32: Stored Procedure 33: ¿ahora una UDF ?        
  • 11. Conferencia Visual FoxPro España 2003 PortalFox.com Ilimitado, sin llamadas recursivas SQL Transaction 1: Stored Procedure 2: Stored Procedure 3: Trigger 30: Trigger 29: Stored Procedure 31: Trigger 32: Stored Procedure 33: Ahora una UDF       
  • 12. Conferencia Visual FoxPro España 2003 PortalFox.com Funciones no deterministas, que no pueden usarse dentro de UDF’s (I)  Funciones no deterministas, no permitidas en UDFs:  CURRENT_TIMESTAMP, GETDATE, GetUTCDate, @@DBTS  IDENTITY, NEWID  TEXTPTR  @@MAX_CONNECTIONS  Ninguna de las funciones estadísticas del sistema están permitidas  Todas las otras funciones del sistema están permitidas menos… veamos la siguiente diapositiva.
  • 13. Conferencia Visual FoxPro España 2003 PortalFox.com Funciones no deterministas, que no pueden usarse dentro de UDF’s (II)  CAST es determinista excepto convirtiendo fechas.  Convert es determinista, excepto convirtiendo fechas sin un estilo de conversión implícito.  CHECKSUM es determinista, excepto CHECKSUM(*)  IsDate es no determinista, en su lugar use Convert con un estilo como 0,100,9 o 109.  RAND es no determinista excepto que se especifique un valor de semilla.
  • 14. Conferencia Visual FoxPro España 2003 PortalFox.com ¿Cuándo es una UDF Determinista?  Todas las funciones, propias o definidas por el usuario referenciadas son deterministas.  La función se ha definido con WITH SCHEMABINDING  No ejecuta procedimientos almacenados extendidos.  No hay que olvidar que según BOL puedes usar funciones nativas SQL dentro de una UDF
  • 15. Conferencia Visual FoxPro España 2003 PortalFox.com Extender la funcionalidad T-SQL con UDF’s  Las funciones escalares son exactamente funciones.  Las puedes usar en cualquier lugar que SQL espere una expresión  Las UDF’s son funciones multi-comando similares a los procedimientos almacenados.  Las UDF’s aceptan parámetros de entrada (Hasta 2100 pese a que los BOL dicen 1024).  Las UDF’s no usan parámetros tipo OUPUT.  Las UDF’s devuelven cualquier valor (excepto BLOB’s)
  • 16. Conferencia Visual FoxPro España 2003 PortalFox.com Ejemplo de función escalar FV (Valor Futuro) CREATE FUNCTION dbo.fn_FV (@rate float, @nper int, @pmt money, @pv money = 0.0, @type bit = 0) RETURNS money AS BEGIN DECLARE @fv money IF @rate = 0 SET @fv = @pv + @pmt * @nper ELSE SET @fv = @pv * POWER(1 + @rate, @nper) + @pmt * (((POWER(1 + @rate, @nper + @type) - 1) / @rate) – @type) RETURN (-@fv) END
  • 17. Conferencia Visual FoxPro España 2003 PortalFox.com UDF’s escalares indocumentadas  ¿Dónde encontrarlas?  $SQLInstallDir$InstallReplsys.sql  $SQLInstallDir$InstallProcsyst.sql  Algunos ejemplos de uso  fn_chariswhitespace  fn_replquotename  fn_replmakestringliteral  fn_mssharedversion  Hay muchas definidas para el uso interno de la replicación. No he encontrado un uso práctico de ellas, pero su estructura es muy interesante.
  • 18. Conferencia Visual FoxPro España 2003 PortalFox.com Limitaciones y algunos trucos para UDF’s escalares  Como obtener números aleatorios de una UDF.  Como usar fechas en una UDF.  Recursividad en una UDF escalar.  Como modificar datos dentro de una UDF. VEAMOS TODO ESTO MÁS EN DETALLE
  • 19. Conferencia Visual FoxPro España 2003 PortalFox.com Como obtener valores aleatorios en una UDF  RAND no está permitido en una UDF.  Podemos tomar información de hora de sysprocesses (last_batch).  Solo es significativo para conexiones de usuarios.  Podemos usar cuando se lanzan procesos del sistema (como el LAZY WRITER).  No es excesivamente buen enfoque.  Se puede completar todo esto con funciones trigonométricas como PI  Se puede usar OPENQUERY para hacer una ‘auto’ llamada y estará todo permitido…. INCLUSO RAND
  • 20. Conferencia Visual FoxPro España 2003 PortalFox.com Como usar Fechas en UDF’s  Las funciones relacionadas con fechas no están permitidas en las UDF’s.  Podemos usar la información de la hora desde sysprocesses como antes, pero no es una información segura.  También podemos usar OPENQUERY u OPENROWSET para llamar a Sql. Entonces todo está permitido, incluso GETDATE  ¿Por qué no se permiten las funciones de fecha dentro de las UDF’s.  Quizá alguien de MS las odie.. 
  • 21. Conferencia Visual FoxPro España 2003 PortalFox.com Recursividad en las UDF’s  Nada nos impide usarla ….. Pero deberíamos intentar otra via.  Está limitada a 32 niveles de recursión.  Puede ser usada para navegar en árboles binarios.  Son una alternativa válida a procedimientos almacenados recursivos que devuelven datos.  Ejemplo : El árbol de empleados
  • 22. Conferencia Visual FoxPro España 2003 PortalFox.com ¿Cómo modificar datos desde una UDF?  No se puede …… por definición.  Pero si puedes usar objetos ADO desde VB o Foxpro para conectar a SQL-SERVER y modificar datos…..  Podrás usar lo mismo desde las UDF’s mediante los procedimientos sp_OAxxx .  Sin embargo si no es imprescindible yo usaría siempre procedimientos almacenados para modificar datos.  Pero es posible… Veámos un ejemplo.
  • 23. Conferencia Visual FoxPro España 2003 PortalFox.com ¿Insertar datos con OPENQUERY?  OPENQUERY está diseñado para devolver datos de cualquier proveedor OLE-DB.  Pero actualmente ejecuta secuencias de instrucciones.  Veamos que hace…
  • 24. Conferencia Visual FoxPro España 2003 PortalFox.com Usos avanzados de UDF’s escalares  Usar variable de tipo tabla en UDF’s (Listado 6)  Usar y devolver XML (Listado 7)  Consideraciones de rendimiento.  Trazando UDF’s escalares con profiler (analizador).
  • 25. Conferencia Visual FoxPro España 2003 PortalFox.com Redefiniendo vistas como UDF’s de tabla en línea  Son como las vistas….casi.  Trabajan como las vistas.  Tienen las mismas limitaciones que las vistas… y unas pocas más.  Pero : ¡Aceptan parámetros de entrada!
  • 26. Conferencia Visual FoxPro España 2003 PortalFox.com Redefiniendo vistas como UDF’s de tabla en línea (continuación)  Sin embargo:  Deben ser definidas como un solo comando SELECT.  Nunca son ‘ejecutadas’.  Son insensibles a cambios de estructura.  PERO: no pueden tener índices y no puedes declarar triggers sobre ellas.
  • 27. Conferencia Visual FoxPro España 2003 PortalFox.com Ejemplo de UDF’s de tabla en línea. -- Devuelve los pedidos de un día determinado CREATE FUNCTION dbo.GetOrdersFromDay (@date as smalldatetime) RETURNS TABLE AS RETURN (SELECT * FROM Orders WHERE DATEDIFF(day, OrderDate, @date) = 0) GO SELECT * FROM dbo.GetOrdersFromDay('2002-09-14')
  • 28. Conferencia Visual FoxPro España 2003 PortalFox.com UDF de tabla en línea documentada.  ::fn_trace_gettable(@filename, @numfiles)  Devuelve información de traza en formato tabla.  @filename es el directorio físico de la traza  @numfiles es el número de renovación (default son todos) SELECT * FROM ::fn_trace_gettable( 'c:my_trace.trc', default)
  • 29. Conferencia Visual FoxPro España 2003 PortalFox.com Y una UDF del sistema no documentada  ::fn_dblog(@start, @end)  Lee el log de transacciones  @start es el Log Sequence Number (LSN)  @end es el último LSN  Se usa (null,null) para leerlo todo  Se cuidadoso con el formato de @start y @end SELECT TOP 10 [Current LSN], Operation FROM ::fn_dblog(NULL, NULL) ORDER BY [Current LSN] DESC
  • 30. Conferencia Visual FoxPro España 2003 PortalFox.com Limitaciones y algunos trucos en las UDF’s de tabla en línea.  Usar ORDER BY dentro de una UDF (Listado 8)  Joins entre UDF’s con otras UDF’s y otras tablas. (listado 9)  Modificar datos desde una UDF (Listado 10)  ¿Cómo usa SQL-SERVER estas funciones?  Intentar detectarlas en el analizador (profiler)  Intentar detectarlas en el plan de ejecución.
  • 31. Conferencia Visual FoxPro España 2003 PortalFox.com Convirtiendo SP’s en UDF’s multicomando.  Las UDF’s multicomando  Son como los procedimientos almacenados.. casi.  Están compilados como los procedimientos almacenados.  Tienen las mismas limitaciones que los procedimientos almacenados.  Pero.. Pueden ser usadas en la cláusula FROM de cualquier secuencia de comandos.
  • 32. Conferencia Visual FoxPro España 2003 PortalFox.com Convertir SP’s en UDF’s multicomando (continuación)  ¿Por qué $#%£! debería convertir mis procedimientos almacenados?  Es muy fácil convertir procedimientos almacenados en funciones.  Son tan rápidas como los procedimientos almacenados.  Aunque, no pueden usar parámetros de salida (OUTPUT)  Aunque, no pueden modificar datos … directamente. Esto es por lo que LAS QUIERO 
  • 33. Conferencia Visual FoxPro España 2003 PortalFox.com Ejemplos de creación de UDFs multicomando. CREATE FUNCTION dbo.tv_GetOrdersFromDay (@date as smalldatetime) RETURNS @list TABLE (OrderID int, OrderDate datetime) AS BEGIN INSERT @List SELECT OrderID, OrderDate FROM Orders WHERE DATEDIFF(day, OrderDate, @date) = 0 RETURN END
  • 34. Conferencia Visual FoxPro España 2003 PortalFox.com Algunas UDF’s multicomando más complejas.  MakeList(@ParamArray, @Separator)  Convierte una cadena de strings en una tabla con un solo campo con cada item separado por @separator en una fila. (Listado 11)  OrderDetailsComplete(@ID, @Key)  Muestra un listado de pedidos con información completa y descriptiva, con cada primary key para unir con otras tablas( Listado 12)  La lista se producirá para cada :  Order (@Key = 'ORD') Product (@Key = 'PRO')  Customer (@Key = 'CUS') Category (@Key = 'CAT')  Full List (@Key NOT IN ('ORD', 'PRO', 'CUS', 'CAT'))
  • 35. Conferencia Visual FoxPro España 2003 PortalFox.com Limitaciones y trucos con las UDF’s multicomando  Solo puedes devolver un conjunto de resultados  Uniendo UDF’s de tabla en línea, con UDF’s multicomando u otras Tablas.  No puedes modificar los datos dentro de una UDF… directamente.  ¿Cómo usa SQL-SERVER estas funciones?  Intentar detectarlas en el analizador (profiler)  Intentar detectarlas en el plan de ejecución.
  • 36. Conferencia Visual FoxPro España 2003 PortalFox.com Creando UDF’s del sistema  Deben ser creadas en master.  SQL-SERVER debe estar configurado para permitir actualizaciones en las tablas del sistema.  El propietario debe ser system_function_schema  Y ya está!!!  Son muy útiles para convertir procedimientos almacenados del sistema en UDF’s  Si quieres usar esos procedimientos almacenados en cláusulas FROM  Y el procedimiento almacenado tiene un código válido para una UDF.
  • 37. Conferencia Visual FoxPro España 2003 PortalFox.com Ejemplo. Convirtiendo sp_lock en fn_lock.  Fn_lock te puede proporcionar más funcionalidad que sp_lock:  Buscando procesos bloqueados.  Buscando bloqueos que afectan a algunos objetos.  Mostrando los bloqueos que afecta a una conexión.  Mostrando bloqueos que afectan al mismo recurso.  Mira el código.  Por ejemplo : SELECT * FROM ::fn_lock() WHERE Status = 'WAIT‘
  • 38. Conferencia Visual FoxPro España 2003 PortalFox.com Ejemplo: Obteniendo información de grupos y usuarios de Windows  fn_getntgroupmembers te informa de los miembros de un grupo de usuarios de windows  gn_getntgroups Te informa de los grupos a los que pertenece un usuario.  Veamos el código:  Por ejemplo: SELECT * FROM ::fn_getntgroups(‘MyDomainMyUse r')
  • 39. Conferencia Visual FoxPro España 2003 PortalFox.com Las UDF’s en las restricciones  Usar UDFs escalares en definiciones DEFAULT  Usar UDFs escalares en restricciones CHECK  Usar UDFs escalares en campos PRIMARY KEY  Usar UDFs escalares en columnas calculadas  “UDFs Provide a New Identity” (SQL Server Magazine, March 2001):  http://www.sqlmag.com/Articles/Index.cfm?Arti cleID=16354  Mira el código. ALTER TABLE IDTest ADD CONSTRAINT def_IDTest DEFAULT (dbo.fn_GetNewID(OBJECT_ID('IDTest'))) FOR ID
  • 40. Conferencia Visual FoxPro España 2003 PortalFox.com Recursos y referencias  Microsoft SQL Server 2000 by Example: http://www.SqlServerByExample.com  SQL Server Magazine: http://www.sqlmag.com  Professional Association of SQL Server: http://www.sqlpass.org  Newsgroups: news://msnews.microsoft.com  Swynk: http://www.swynk.com  CallSQL: http://www.callsql.com  www.SolidQualityLearning.com  PortalSQL.COM : http://www.portalsql.com  Microsoft SQL Server site: http://www.microsoft.com/sql
  • 41. Conferencia Visual FoxPro España 2003 PortalFox.com Gracias!!!!!!!!!!!!!  ¿Preguntas?  Contacte con nosotros en fernan@solidqualitylearning.com y webmaster@portalsql.com
  • 42. Conferencia Visual FoxPro España 2003 PortalFox.com ¡Gracias! Acuérdese de rellenar la hoja de evaluación