Mostrando entradas con la etiqueta Snippets. Mostrar todas las entradas
Mostrando entradas con la etiqueta Snippets. Mostrar todas las entradas
domingo, 23 de septiembre de 2018
SQL Server Snippets - Aproximación de valor real a N-ésimo decimal superior/inferior
Supóngase que se tiene un valor real o float, que se quiere aproximar al N-ésimo decimal superior. Por ejemplo:jueves, 16 de agosto de 2018
SQL Server Snippets - Columna de fecha de última modificación en SQL Server
Supongamos que por cuestiones de control de modificaciones y auditoría, se quiere contar con un campo de fecha de última modificación en todas las tablas de una base de datos de SQL Server.El inconveniente es que SQL Server no posee nativamente un tipo de dato que guarde la fecha de última modificación de un registro, el cual se actualice automáticamente al modificar una fila de datos. Por ello, una alternativa a esto es definir una columna de tipo datetime en cada tabla que se actualice cada vez que se modifique uno o más registros de esta, a través de un trigger.
sábado, 7 de julio de 2018
Cambiar la URL de repositorio GIT remoto
Hola, este es un pequeño snippet para cambiar la URL de un repositorio remoto de GIT, en un repositorio local.Primero, para listar las URL actuales del repositorio remoto, ejecutamos el siguiente comando, dentro de la carpeta que contiene nuestro repositorio local:
$ git remote -v
Esto mostrará un resultado similar al siguiente:
origin https://github.com/mi-usuario/mi-repositorio.git (fetch) origin https://github.com/mi-usuario/mi-repositorio.git (push)
Puede notarse que el único repositorio remoto referenciado es origin, que suele ser el nombre por defecto asignado al repositorio remoto al clonarlo.
Para asignar una nueva url a dicho remoto, basta ejecutar el siguiente comando:
$ git remote set-url origin https://github.com/mi-usuario/mi-repositorio-nueva-url.git
Para verificar el cambio, podemos listar nuevamente los repositorios remotos, obteniendo el siguiente resultado:
$ git remote -v origin https://github.com/mi-usuario/mi-repositorio-nueva-url.git (fetch) origin https://github.com/mi-usuario/mi-repositorio-nueva-url.git (push)
Saludos.
lunes, 18 de junio de 2018
Leer N caracteres en C/C++ con scanf + vaciar buffer
Hola, en esta ocasión quería compartirles un pequeño snippet de código de C/C++ que encontré un día de estos: Como leer una cadena de N caracteres con scanf.
Supongamos que queremos leer como máximo los primeros 8 caracteres que ingrese el usuario en la entrada estándar (stdin), y guardaremos el resultado en un arreglo de caracteres. Para ello, primero declaramos el arreglo con una longitud de 9 posiciones, que corresponderán a los 8 caracteres que deseamos leer, más una posición más para el caracter nulo, que marcará el fin de la cadena.
char cadena[9];
Luego procedemos a leer con scanf los 8 caracteres desde la entrada estandar:
scanf("%8s",cadena);
Lo importante a notar es el especificador de formato s, que indica que lo que se leerá es una cadena de caracteres (string). La entrada se termina con un espacio en blanco, pero el número 8 indica que solamente se tomarán los primeros 8 caracteres que se encuentran en el buffer de la entrada estándar. Además, un caracter nulo es guardado al final de la cadena de caracteres. Es por ello que el arreglo utilizado debe ser por lo menos un caracter más grande que la longitud de entrada especificada. De no ser así podría darse el caso que se sobrescriban porciones de memorias adyacentes, generando resultados inesperados.
Finalmente, para limpiar el buffer de la entrada estándar: leer mientras se encuentre el caracter de salto de línea (\n) o el caracter de finalización.
char c;
while ((c = getchar()) != '\n' && c != EOF) { }
El código completo es el siguiente:
Saludos.
jueves, 8 de febrero de 2018
SQL Server Snippets - Buscar columna en base de datos
Publicado originalmente el 2013-02-19, en https://itsouvenirs.wordpress.com/2013/02/19/sql-server-snippets-buscar-columna-en-base-de-datos/.Saludos a todos. Aprovechando un poco mi hora de almuerzo (para escribir el post, aunque lo publiqué en la noche, jejeje), quería compartirles este pequeño snippet, que consiste en una consulta para obtener el listado de tablas en las que exista una determinada columna, y es básicamente el siguiente:
Dónde nombre_columna es el nombre de la columna que se desea buscar.
El snippet puede modificarse para buscar también las columnas en cuyo nombre se incluya cierta palabra, cambiando el igual (=) de la condición por un LIKE, así:
En este caso, el nombre de las tablas podría repetirse, en casos en los que más de una columna de la tabla posea la palabra buscada.
A modo de ejemplo, al ejecutar el siguiente script en la base de datos AdventureWorks:
La consulta nos devuelve los siguientes resultados:
Esta consulta me ha sido de gran ayuda en casos en los que la base de datos “relacional” no posee todas las debidas relaciones entre las tablas, ya que me permite encontrar las tablas en las que aparece cierta columna, para tratar de descubrir las posibles relaciones faltantes.
La consulta ha sido probada en SQL Server 2005 hasta SQL Server 2012, y funciona sin problemas. Muy posiblemente funcionará en versiones posteriores.
SQL Server Snippets - Pausa
Publicado originalmente el 2013-02-13, en https://itsouvenirs.wordpress.com/2013/02/13/sql-server-snippets-pausa/.En esta ocasión les dejo un snippet corto, pero muy interesante, que consiste en hacer cómo hacer una pausa en SQL Server. Esto vendría siendo similar a un sleep en otros lenguajes de programación.
El comando es sencillo:
waitfor delay '00:01:00'En dicho ejemplo se muestra el comando para hacer una pausa por un minuto.
Ahora, ¿por qué diantres quería yo hacer una pausa en SQL Server? En mi caso, lo utilicé para hacer pruebas con un trigger. Puse el comando dentro de un trigger "on update" porque quería saber si la aplicación actualizaba los datos de cierta tabla antes de realizar una determinada acción. Si la acción se realizaba luego de la pausa, sabría que el trigger se ejecutaba antes de dicha acción, y esto a su vez me indicaría que los datos de la tabla eran actualizados antes de la acción.
Este es solo un ejemplo, pero pueden haber muchos otros casos. La verdad es que si la sentencia existe, es porque alguien pensó que serviría para algo, jejeje...
Por cierto, esta sentencia solo la he probado en SQL Server 2005, pero probablemente aún siga disponible, incluso en la versión
miércoles, 6 de diciembre de 2017
WP - Nueva sección: SQL Server Snippets
Saludos. En este día quiero anunciarles que he decidido iniciar una nueva sección, llamada SQL Server Snippets, con el objetivo de no dejar de lado el blog debido a la falta de tiempo, y compartir algunas de las cosas que aprendo día a día en mi trabajo con SQL Server. Esta sección consistirá básicamente en entradas breves con segmentos de código (snippets) generalmente cortos, pero muy útiles e interesantes.Los invito a ver mi primera entrada de esta sección: Tablas con columna autonumérica
Feliz día.
Publicado originalmente el 09/02/2013, en https://itsouvenirs.wordpress.com/2013/02/09/nueva-seccion-sql-server-snippets/.
sábado, 12 de agosto de 2017
Obtener documentación de base de datos SQL Server
Por cuestiones de tiempo, esta entrada es solo un "dump" de código fuente. Asumiendo que hiciste tu tarea de colocar los comentarios de los objetos de la base de datos utilizando la propiedad extendida MS_Description, a continuación incluyo unas consultas para obtener la documentación respectiva de los objetos más relevantes de la base de datos.Esquemas
SELECT
s.name AS esquema,
ep.value AS descripcion
FROM sys.schemas s
left join sys.extended_properties ep
ON s.schema_id = ep.major_id
AND ep.name = 'MS_Description'
WHERE s.name NOT IN (
-- Lista de esquemas a ignorar
'db_accessadmin',
'db_backupoperator',
'db_datareader',
'db_datawriter',
'db_ddladmin',
'db_denydatareader',
'db_denydatawriter',
'db_owner',
'db_securityadmin',
'guest',
'INFORMATION_SCHEMA',
'sys'
)
ORDER BY 1
Tablas
SELECT
SCHEMA_NAME(schema_id) esquema,
t.name AS tabla,
ep.value AS descripcion
FROM sys.tables AS t
left join sys.extended_properties ep
ON t.object_id = ep.major_id
AND 0 = ep.minor_id
AND ep.name = 'MS_Description'
ORDER BY 1, t.name
Columnas
Nota: No he descubierto aún por qué, pero hay ciertos casos en los que la columna que es llave primaria me aparece duplicada. Cualquier ayuda es bienvenida :)SELECT
SCHEMA_NAME(schema_id) + '.' + t.name AS tabla,
c.name AS columna,
TYPE_NAME(c.system_type_id) AS tipo_de_datos,
CASE c.max_length
WHEN -1 THEN 'MAX'
ELSE CAST(c.max_length AS VARCHAR(100))
END tamano,
CASE c.is_nullable
WHEN 1 THEN 'Sí'
ELSE 'No'
END AS permite_nulos,
CASE i.is_primary_key
WHEN 1 THEN 'Sí'
ELSE 'No'
END AS llave_primaria,
CASE
WHEN fk.referenced_column_id IS NOT NULL THEN 'Sí'
ELSE 'No'
END AS llave_foranea,
ep.value AS descripcion
FROM sys.tables AS t
INNER JOIN sys.columns c
ON t.object_id = c.object_id
LEFT JOIN sys.index_columns AS ic
ON ic.OBJECT_ID = c.OBJECT_ID AND ic.column_id = c.column_id
LEFT JOIN sys.indexes AS i
ON i.OBJECT_ID = ic.OBJECT_ID AND i.index_id = ic.index_id
LEFT JOIN sys.foreign_key_columns AS fk
ON fk.parent_object_id = c.object_id
AND fk.parent_column_id = c.column_id
LEFT JOIN sys.extended_properties ep
ON t.object_id = ep.major_id
AND c.column_id = ep.minor_id
AND ep.name = 'MS_Description'
ORDER BY 1, c.column_id
Llaves foráneas
Nota: Esta consulta devuelve una fila por columna, por lo que aparecerán tantas filas como columnas incluya la llave.SELECT
SCHEMA_NAME(t.schema_id) + '.' + t.name as tabla_hija,
c.name as tabla_hija_columna,
SCHEMA_NAME(tr.schema_id) + '.' + tr.name tabla_padre,
cr.name tabla_padre_columna,
fk.name fk_nombre,
CASE fk.update_referential_action
WHEN 0 THEN 'NO ACTION'
WHEN 1 THEN 'CASCADE'
WHEN 2 THEN 'SET NULL'
WHEN 3 THEN 'SET DEFAULT'
END regla_actualizacion,
CASE fk.delete_referential_action
WHEN 0 THEN 'NO ACTION'
WHEN 1 THEN 'CASCADE'
WHEN 2 THEN 'SET NULL'
WHEN 3 THEN 'SET DEFAULT'
END regla_eliminacion
FROM sys.foreign_key_columns as fkc
INNER JOIN sys.foreign_keys fk
ON fkc.constraint_object_id = fk.object_id
INNER JOIN sys.tables as t
ON fkc.parent_object_id = t.object_id
INNER JOIN sys.columns as c
ON fkc.parent_object_id = c.object_id
and fkc.parent_column_id = c.column_id
INNER JOIN sys.tables as tr
ON fkc.referenced_object_id = tr.object_id
INNER JOIN sys.columns as cr
ON fkc.referenced_object_id = cr.object_id
and fkc.referenced_column_id = cr.column_id
ORDER BY 1, fkc.constraint_column_id
Índices
Nota: Esta consulta devuelve una fila por índice, y muestra las columnas separadas por comas.SELECT DISTINCT
da.tabla AS tabla,
i.name AS indice,
da.tipo AS tipo,
CASE i.is_primary_key
WHEN 1 THEN 'Sí'
ELSE 'No'
END AS llave_primaria,
CASE i.is_unique
WHEN 1 THEN 'Sí'
ELSE 'No'
END AS llave_unica,
CASE i.is_unique_constraint
WHEN 1 THEN 'Sí'
ELSE 'No'
END AS restriccion_unicidad,
LEFT(cols.names, LEN(cols.names) - 1) columnas
FROM sys.tables AS t
INNER JOIN sys.columns c
ON t.object_id = c.object_id
INNER JOIN sys.index_columns AS ic
ON ic.OBJECT_ID = c.OBJECT_ID AND ic.column_id = c.column_id
INNER JOIN sys.indexes AS i
ON i.OBJECT_ID = ic.OBJECT_ID AND i.index_id = ic.index_id
CROSS APPLY (
SELECT
SCHEMA_NAME(schema_id) + '.' + t.name tabla,
CASE i.index_id
WHEN 1 THEN 'CLUSTERED'
ELSE 'NONCLUSTERED'
END AS tipo
) da
CROSS APPLY (
SELECT c_i.name + ','
FROM sys.columns c_i
INNER JOIN sys.index_columns AS ic_i
ON ic_i.OBJECT_ID = c_i.OBJECT_ID AND ic_i.column_id = c_i.column_id
WHERE i.OBJECT_ID = ic_i.OBJECT_ID AND i.index_id = ic_i.index_id
FOR XML PATH ('')
) cols(names)
ORDER BY 1, 2, 3
jueves, 6 de noviembre de 2014
WP - SQL Server Snippets – Tablas con columna autonumérica
Este primer snippet consiste en una consulta para obtener las tablas de la base de datos en uso (es decir, la base de datos seleccionada actualmente), que poseen una columna autonumerada (IDENTITY), incluyendo el nombre de dicha columna.La consulta en T-SQL es la siguiente:
USE [BASE_DATOS] GO SELECT TABLA.object_id AS object_id, SCHEMA_NAME(TABLA.schema_id) + '.' + TABLA.name AS tabla, COLUMNA.name AS columna_identity FROM sys.tables TABLA INNER JOIN sys.columns COLUMNA ON COLUMNA.object_id=TABLA.object_id WHERE TABLA.type='U' AND TABLA.name NOT LIKE 'sys%' AND COLUMNA.is_identity = 1 ORDER BY SCHEMA_NAME(TABLA.schema_id), TABLA.name
A modo de una pequeña descripción, básicamente lo que se hace es consultar las tablas del sistema sys.tables (que contiene información de las tablas), y sys.columns (que contiene información de las columnas). Ambas tablas se unen a través del object_id de la tabla.
Luego, en la cláusula WHERE se filtran los resultados para solamente incluir tablas creadas por el usuario (tipo “U” y que no inicien con “sys”, para descartar la tabla sys.diagrams), y de dichas tablas solamente tomar las columnas con la propiedad IDENTITY (is_identity = 1). Cabe señalar que una tabla en SQL Server puede tener solamente una columna IDENTITY, por lo que la consulta no devolverá más de una fila por tabla.
Nótese además que se obtiene el nombre del esquema de la tabla, a través de la función SCHEMA_NAME, y se concatena con el nombre de la tabla, para obtener el nombre completo de la tabla dentro de la base de datos.
Finalmente, y de forma opcional, se ordenan los resultados por esquema y nombre de tabla, para que se muestren de la misma forma que se muestran en el explorador de objetos del SQL Server Management Studio.
Hasta donde he probado, el script funciona para SQL Server 2005 – 2012.
Espero que les sea de utilidad. Saludos, y como dicen por allí, “happy coding!”.
viernes, 12 de septiembre de 2014
Cambiar tiempo de espera para ejecución de comandos en NHibernate vía código
Las consultas ejecutadas con NHibernate tienen un tiempo de espera predeterminado de 30 segundos. Sin embargo puede que este tiempo no sea suficiente para ejecutar algunos comandos o consultas complejas.Para cambiar el tiempo de espera a nivel global a través de la configuración NHibernate vía código, se puede establecer el valor de la propiedad command_timeout al momento de configurar la fábrica de sesiones, de la siguiente manera:
NHibernate.Cfg.Configuration configuracion; // Inicialización de configuración de NHibernate // ... // Estableciendo nuevo tiempo de espera (como cadena, en segundos) configuracion.SetProperty(NHibernate.Cfg.Environment.CommandTimeout, "150"); // Creando fábrica de sesiones ISessionFactory fabricaSesiones = configuracion.BuildSessionFactory();
Con esto se configura la fábrica de sesiones para que cada vez que ejecute comandos sobre la base de datos utilice el tiempo de espera especificado. El tiempo de espera se indica en segundos, ya que de acuerdo a la documentación es el que se asigna por defecto a los IDbCommand generados por NHibernate para las operaciones en la base de datos, y el tiempo de espera para estos se especifica en segundos.
De momento solo lo he probado en NHibernate 3, específicamente la versión 3.3.1.4000, por lo que no estoy seguro si existe en versiones previas, aunque es muy probable.
Con la tecnología de Blogger.

