Mostrando entradas con la etiqueta SQL Server. Mostrar todas las entradas
Mostrando entradas con la etiqueta SQL Server. 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.
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
Con la tecnología de Blogger.

