Blog Calendar
| Sun |
Mon |
Tue |
Wed |
Thu |
Fri |
Sat |
| 27 |
28 |
29 |
30 |
1 |
2 |
3 |
| 4 |
5 |
6 |
7 |
8 |
9 |
10 |
| 11 |
12 |
13 |
14 |
15 |
16 |
17 |
| 18 |
19 |
20 |
21 |
22 |
23 |
24 |
| 25 |
26 |
27 |
28 |
29 |
30 |
31 |
| 1 |
2 |
3 |
4 |
5 |
6 |
7 |
|
Programación
-
Si, eso es! ... como cualquier ejemplar de la especie humana de sexo masculino (ok, no discriminemos, igual las les, bi y hetero) que aprecie la belleza de las féminas, me declaro susceptible a la esencia de una mujer o a su perfume.
Que agradable es percibir el aroma de una mujer cuando pasa cerca de ti, cuando te saluda, te besa, se sienta a tu lado o un sin fin de sucesos que pueden despertar tu interés en el momento, si no te habías percatado de su presencia con anterioridad, en ese momento te obligue a voltear en su dirección para saber el origen del aroma.
¿Y a que viene todo ese rollo del aroma? Resulta que encontré un texto escrito por Martin Fowler que menciona un termino llamado "Olor en el código" (CodeSmells) y se me ocurrió escribir una entrada en mi blog que me permita expresar lo que pienso de un buen desarrollo de software basando mis comentarios en el texto que encontré de Fowler.
 |
Dicen algunos amigos que suelo ser muy criticon, realmente no tengo nada que decir al respecto. Si ellos lo dicen, ha de ser verdad (me queda de consuelo que suelo ser más critico con mi persona que con los demás =P ). Así que aprovechando que critico muchas cosas (objetivamente), el código no puede ser la excepción ya que es a lo que dedicamos muchos de nosotros (informáticos) la mayor parte de nuestro tiempo.
¿Te imaginas que el código fuera tan agradable como el aroma de una mujer? Que cuando lo veas puedas decir, me gusta, quiero saber quién lo escribió, quiero conocer como decidió el autor que debía estructurarse así para que yo lo pueda leer sin pasar horas rastreando variables, métodos, instancias y artefactos fumados. Que no necesite documentación para saber que el código hace lo que debe de hacer. Que simplemente el código me susurre al oído como si quisiera seducir mis sentidos y hacerme parte de él.
Te sugiero leas el artículo de Fowler, lo tienes en inglés y español.
Se despide, /me ... disfrutando de sus problemas =).
|
-
Que bonito es eso de que el motor de SQL haga las cosas más comunes automáticamente, ejemplo de esto pueden ser los valores calculados, un trigger o insertar un valor numérico auto incremental, los tres son muy similares.
Sin embargo esto puede causar un dolor de cabeza si no sabemos como emplearlos, a veces necesitamos usar el identificador de un registro que apenas insertamos en una tabla desde la sesión 52 en la sesión 53 del SQL o bien puede ser útil el conocer el último identificador insertado en una tabla sin tener que hacer un max sobre el campo.
Haber, tenemos IDENT_CURRENT tal como en el SQL Server 2000 SCOPE_IDENTITY y @@IDENTITY. Las tres funciones regresan el ultimo valor generado automáticamente. Peeeeroooo, tienen un alcance de sesión que se pueden definir de la siguiente manera:
- IDENT_CURRENT Regresa el último valor generado por una tabla específica en cualquier sesión y cualquier alcance(scope).
- @@IDENTITY Regresa el último valor generado por cualquier tabla en la sesión actual en todos los alcances (scope).
- SCOPE_IDENTITY Regresa el último valor generado para cualquier tabla en la sesión actual y el alcance actual (scope).
Osea, si me explican ... entiendo! Ahora si ya todo claro =).
NOTA: cuando el valor de IDENT_CURRENT es null (porque la tabla ha sido truncada o no contiene datos), la función regresa el valor de siembra (seed), esto es el valor autoincrmental.
Ahora los ejemplos, que "hermosa weba"... para que hacerlo todo? mejor reutilizo lo que está en la ayuda de MSDN  :
Que se puede encontrar en http://msdn.microsoft.com/es-es/library/ms175098.aspx
Vale la pena darle un vistazo a :
- IDENT_SEED ( 'table_or_view' )
- IDENT_CURRENT ( 'table_or_view' )
- DBCC CHECKIDENT()
http://msdn.microsoft.com/es-es/library/ms176057.aspx
-
Continuando con el tema de SQL Server 2005 del post anterior, ahora se me antoja compartir lo que me ha "liado" cuando he tenido que hacer un refactoring a una base de datos modificada sin cuidado alguno y obvio, como está hecha por seres humanos debe tener no uno, sino mucho errores.
En fin, que la idea es encontrar las dependencias de un SP o bien de una tabla, en el caso de la tabla o vista nos basta con:
sp_depends 'dbo.nombre_tabla'
Esto muestra que procedimientos llaman a la tabla.
Si por el contrario se trata de un procedimiento:
sp_depends 'dbo.nombre_sp'
Esto nos regresaría [1]
| Nombre columna |
Tipo de Dato |
Descripción |
| name |
nvarchar(257) |
Nombre del elemento para el que existe una dependencia |
| type |
nvarchar(16) |
Tipo del elemento |
| updated |
nvarchar(7) |
Si el elemento es actualizable |
| selected |
nvarchar(8) |
Si el elemento es usado en un select |
| column |
sysname |
Columna o parámetro en el que existe dependencia |
| Nombre Columna |
Tipo de Dato |
Descripción |
| name |
nvarchar(257) |
Name of the item for which a dependency exists. |
| type |
nvarchar(16) |
Type of the item. |
Si existe alguna duda bien se puede tomar alguna base de datos de ejemplo como la de AdventureWorks y ejecutar lo siguiente:
sp_depends uspUpdateEmployeeLogin
GO
sp_depends 'HumanResources.uspUpdateEmployeeLogin'
GO
Como siempre existe la posibilidad de que hayan hecho marranadas en el código, entonces podemos buscar sobre el texto de los objetos para que sea más simple la localización de elementos incluidos en scripts u objetos de la base de datos:
DECLARE _at_TextToFind AS VARCHAR(300)
SELECT _at_TextToFind = 'HumanResources.Employee'
SELECT S.Name AS [Schema], P.Name, M.definition
FROM sys.procedures P
INNER JOIN sys.schemas S ON P.schema_id = S.schema_id
INNER JOIN sys.sql_modules M ON M.object_id = P.object_id
WHERE OBJECT_DEFINITION(P.object_id) LIKE '%'+_at_TextToFind+'%'
ORDER BY S.Name, P.Name
Enjoy your code!
[1] http://msdn.microsoft.com/es-es/library/ms189487.aspx
-
Cuando inicie en esto del desarrollo de software tuve mi primer acercamiento con las tablas del sistema de SQL Server, al atender una incidencia y eliminar una tabla de producción, por tratar de recuperar los datos me dispuse a modificar algunas cosillas, cubrir un par de rastros, etc. Después de eso pasaron un par de años antes de saber más sobre las tablas del sistema.
Hace poco buscando en Internet una consulta mediante las estadísticas que permita hacer el conteo de filas me encontré con un post donde se comentaba que Pablo Álvarez Doval daría una charla sobre optimización de SQL Server 2005.
La charla estuvo genial, se abordaron temas bastante interesantes en tan poco tiempo, tengo mucho por aprender y mucho que compartir, pero sobre todo tengo la gran fortuna de disfrutar mi trabajo, coincidir en tiempo y espacio con grandes desarrolladores (freakies, geeks, etc) y de vez en cuando con uno que otro Técnicoless (para definición del termino, dirigirse al blog de Chema Alonzo.
Bueno después de todo este rollo ¿Que paso con el count de las rows?. Fue el motivo por lo que inicie el post =P, para que no se me olvide como hacer dicho count lo pondré enseguida.
SELECT S.Name AS [Schema], O.Name AS [TableName], PS.Row_Count
FROM sys.indexes AS [INDEX]
INNER JOIN sys.objects AS O ON [INDEX].object_id = O.object_id
INNER JOIN sys.schemas AS S ON O.Schema_Id = S.Schema_Id
INNER JOIN sys.dm_db_partition_stats AS PS
ON [INDEX].object_id = PS.object_id AND [INDEX].index_id = PS.index_id
WHERE [INDEX].index_id < 2
AND O.is_ms_shipped = 0
AND PS.row_count > 0
ORDER BY PS.row_count DESC, S.Name, O.Name
Después de la charla me han dado más y más ganas de conocer los meta datos, como funciona internamente el SQL y después de platicar un poco con el buen Pablo me ha animado a conocer Windbg (que ya solicité la charla igual). 
-
Los que nos dedicamos a esto del desarrollo del software y lidiar constantemente con código duro o embebido en scripts, bases de datos, etc, etc. requerimos automatizar muchas cosas para facilitar el mantenimiento y desarrollo de sistemas, para esto siempre nos acercamos a san google y vemos con que nos sale. Después de un tiempo creo que es momento de contribuir con la información que en muchas ocasiones he encontrado en google después de varias consultas infructuosas.
En este caso mi intención será de aquí en adelante aportarle algo a google, mostrar más información sobre todo lo que tengo que hacer día a día en el trabajo y aportar un poco a la comunidad de las mejores prácticas con el ideal de hacer de este mundo ... un mundo mejor. =) jajaja.
Iniciando ...
La siguiente consulta nos ayuda a buscar cadenas de texto en los procedimientos almacenados y cuando son bastantes realmente es un dolor de cabeza.
SELECT S.name, OBJECT_NAME(M.object_id), *
FROM sys.sql_modules M
INNER JOIN sys.objects O ON O.object_id = M.object_id
INNER JOIN sys.schemas S ON O.schema_id = S.schema_id
WHERE M.Definition LIKE '%texto_a_buscar%'
Esto nos debe de valer para SQL 2000 en adelante.
Otra forma de hacer la búsqueda bien puede ser con el siguiente código:
DECLARE _at_TextToFind AS VARCHAR(300)
SELECT _at_TextToFind = 'texto_a_buscar'
SELECT S.Name AS [Schema], P.Name, M.definition
FROM sys.procedures P
INNER JOIN sys.schemas S ON P.schema_id = S.schema_id
INNER JOIN sys.sql_modules M ON M.object_id = P.object_id
WHERE OBJECT_DEFINITION(P.object_id) LIKE '%'+_at_TextToFind+'%'
ORDER BY S.Name, P.Name
Ya estaré agregando algo de código tan simple como este para facilitarnos la vida.
|
|
Recent Comments On Blog