Las siguientes notas se aplican únicamente a esta versión de SQL Server.
Microsoft Update
Para obtener información acerca de cómo usar Microsoft Update para identificar actualizaciones de SQL Server
2008 R2, vea el sitio web de Microsoft Update en http://go.microsoft.com/fwlink/?LinkId=108409.
Ejemplos
De manera predeterminada, las bases de datos y el código de ejemplo no se instalan como parte del programa
de instalación de SQL Server. Para instalar las bases de datos de ejemplo y el código muestra para ediciones de
SQL Server R2 diferentes de Express, vea el sitio web de CodePlex en
http://go.microsoft.com/fwlink/?LinkId=87843. Para obtener información sobre la compatibilidad con las bases
de datos de ejemplo de SQL Server y el código muestra para SQL Server Express, vea la Información general y
los ejemplos de bases de datos en el sitio web de CodePlex en http://go.microsoft.com/fwlink/?LinkId=110391.
Notas de la versión
Para obtener más información acerca de los últimos cambios en esta versión de SQL Server, vea el archivo
Léame más reciente en http://go.microsoft.com/fwlink/?LinkId=141691.
Documentación y vínculos
Para instalar .NET Framework SDK, vea “Instalar .NET Framework SDK” en los Libros en pantalla de SQL Server
2008 R2 en http://go.microsoft.com/fwlink/?LinkId=141693.
Para obtener información acerca de la configuración del Área expuesta de SQL Server 2008 R2, vea los
siguientes temas de la documentación de SQL Server 2008 R2:
En los Libros en pantalla de SQL Server 2008 R2: “Descripción de la configuración del área expuesta”.
En la ayuda del programa de instalación de SQL Server 2008 R2: “Minimizar el área expuesta en SQL Server
2008 R2”.
En los Libros en pantalla de SQL Server 2008 R2 en MSDN: Descripción de la configuración del área expuesta
en http://go.microsoft.com/fwlink/?LinkId=141692.
TIP Para conectar SQL Server 2008 (No R2) con
Windows Azure.
24 10 2011
Saludos, esta mañana me encontré con el siguiente problema, estaba tratando de conectar
una base de datos SQL Server 2008 (No R2) con Windows Azure, pero me arrojaba el
siguiente error:
Bueno primero agrega los datos de tu SQL Azure al login del SQL Server 2008:
Al parecer esto se debe a que SQL Server 2008 tiene diferencias entre objetos de la versión
SQL Server 2008 R2, pero…. para poder conectarte puedes intentar lo siguiente y así ganar
tiempo en lo que se migra a una versión R2 .
Paso 1.
Cierra el cuadro de dialogo del error y cierra la ventana de login del SQL Server.
Paso 2.
Haz clic en el botón de Nueva consulta ubicado en la barra de herramientas.
Paso 3.
Veras nuevamente la pantalla de login del SQL Server 2008, ahí deberás dar clic en el
botón “Opciones >>”, Selecciona la base de datos a la que te deseas conectar (examina el
servidor), y da clic en el botón aceptar y posteriormente en el botón Conectar.
Paso 4.
Si todo salió bien deberás ya estar conectado a la instancia de tu SQL Azure, pero
corroborarlo puedes hacer lo siguiente.
Saludos, espero les ayude un poco.
Technorati Tags: Windows Azure,SQL Azure,Connect SQL Azure
Comentarios : 1 comentario
Categorías : SQL
No puedo ver la propiedades de mis Proyectos en Visual
Studio 2008
29 06 2010
Saludos amigos, en esta ocasión me encontré con un problema en Visual Studio 2008, lo
que sucedía es que al abrir un proyecto de Windows Application y querer ver las
propiedades del mismo, estas no aparecía jamás, ni aunque abriera un nuevo proyecto, ya
investigando un poco y navegando por la red encontré la siguiente solución, la cual en mi
caso me funciono a la perfección:
1. Cierre Visual Studio 2008.
2. Abra la herramienta de símbolo de sistema de Visual Studio 2008, como administrador.
3. Escriba el siguiente comando "devenv /resetskippkgs”, este comando es para Reinstalar o
Restaurar los paquetes de Visual Studio, al ejecutar el comando se abrirá un nuevo Visual
Studio, en mi caso abrí uno de mis proyectos y me permitió ver las propiedades.
Si tienen más problemas y con lo anterior no se soluciona, puede revisar este post: Más
soluciones
Bueno amigos espero les sea de ayuda, que tengan un buen día.
Etiquetas de Technorati: Visual Studio,Project Properties,devenv,resetskippkgs
Comentarios : 5 Comentarios »
Etiquetas: devenv, Project Properties, resetskippkgs, Visual Studio
Categorías : Visual Studio
[ASP.NET] Error del Servidor en Aplicación: Error
HTTP 404.3-Not Found.
3 10 2009
Saludos amigos en esta ocasión les dejo la solución al siguiente error:
Error del servidor en aplicación
Error HTTP 404.3 – Not Found
No puede obtener acceso a la página solicitada debido a la configuración de la
extensión. Si la página es un script, agregue un controlador. Si se debe cargar el
archivo, agregue una asignación MIME.
Bueno pues la causa más común que provoca este error es que ha instalado primero alguna
versión del Visual Studio 2005 o 2008, y posteriormente se habilito el servidor IIS (Internet
Information Service). Para solucionarlo se deben de correr las siguientes líneas desde el
CMD.
Si tiene el sistema operativo Windows XP podrá ejecutar la siguiente línea de comando:
C:\Windows\Microsoft.NET\Framework\v2.0.50727>aspnet_regiis.exe -r
Si tiene el sistema operativo Windows Vista tendrá que ejecutar la siguiente línea de
comando ya que la anterior no funciona en este S.O.
C:\Windows\Microsoft.NET\Framework\v2.0.50727>aspnet_regiis.exe -u
Posteriormente hay que correr esta otra línea de comando:
C:\Windows\Microsoft.NET\Framework\v2.0.50727>aspnet_regiis.exe -i
Error inesperado
Mensaje de error: no se puede cargar el tipo
Microsoft.VisualStudio.DataDesign.SyncDesigner.SyncFacade.SyncMan
Ager del
Ensamblado VisualStudio.DataDesign.SyncDesigner.DslPacka
Ge, versión=9.0.0.0, Culture=neutral
PublicKeyToken=b03f5f7f11d50a3a.
Bueno pues espero y le ayude a resolver el Error, espero sus comentarios.
Etiquetas de Technorati: ASP .NET,Error HTTP 404.3,Error del servidor en aplicación
Comentarios : 3 Comentarios »
Etiquetas: ASP NET, Error del servidor en aplicación, Error HTTP 404.3
Categorías : ASP NET
[SQL2008] ¿Cómo instalar MS SQL Server 2008?
3 10 2009
Saludos amigos en esta ocasión les dejo una serie de imágenes con algunas indicaciones
para que puedan instalar Microsoft SQL Server 2008.
Para realizar la instalación tiene que considerar los siguientes requerimientos antes de
comenzar. (de esta manera podrán ahorrar tiempo).
Si tienen instalado el Visual Studio 2008, verifiquen que:
Tienen instalado el FrameWork 3.5 Service Pack 1.
Si no lo tienen lo pueden descargar de:
http://www.microsoft.com/downloads/details.aspx?FamilyID=d0e5dea7-ac26-4ad7-b68c-
fe5076bba986&displaylang=en
Tienen instalado el Visual Studio 2008 Service Pack 1.
Si no lo tienen lo pueden descargar de:
http://www.microsoft.com/downloads/details.aspx?FamilyID=27673c47-b3b5-4c67-bd99-
84e525b5ce61&displaylang=en
También pueden descargar la versión gratuita de SQL Server 2008 de:
http://www.microsoft.com/express/sql/download/
Listo, teniendo ya todos los requerimientos de la instalación podemos comenzar con el MS
SQL Server 2008:
Screen1:
Screen2:
Screen3:
Screen4:
Screen5:
Screen6:
Screen7:
Screen8:
Screen9:
Screen10:
Screen11:
Screen12:
Screen13:
Screen14:
Screen15:
Screen16:
Screen17:
Screen18:
Screen19:
Screen20:
Screen21:
En este momento ya deben de tener instalado el MS SQL Server 2008, espero les sea de
ayuda, dejen comentarios.
Etiquetas de Technorati: MS SQL Server 2008,Instalación de SQL Server 2008,SQL Server
2008 Installation.
Comentarios : 4 Comentarios »
Etiquetas: Instalación de SQL Server 2008, MS SQL Server 2008, SQL Server 2008
Installation.
Categorías : SQL
[SQL2008] Reduciendo el almacenamiento para
columnas Nulas – SPARSE Columns.
1 10 2009
Saludos amigos en esta ocasión les voy a escribir sobre una mejora implementada en SQL
Server 2008, la cual nos ayudara mucho cuando deseemos almacenar valores nulos (NULL)
o usados con poca frecuencia en nuestras bases de datos.
SQL Server 2008 incorpora las Sparse columns ,sin duda es una mejora que permite la
optimización del almacenamiento “zerobyte” de valores NULOS (NULL). Se permiten
definir hasta 30,000 columnas dispersas (Sparse columns) en una tabla.
Esta mejora es ideal para diseños de base de datos o aplicaciones que requieren un elevado
número de columnas que pocas veces se usan, o para tablas con una serie de columnas que
se relacionan con solo un subconjunto de datos almacenados.
Para definir una columna dispersa “Sparse column”, sólo tiene que añadir el atributo de
almacenamiento “SPARSE” después de la columna de definición en un comando CREATE
o ALTER TABLE, veamos el siguiente ejemplo:
CREATE TABLE dbo.Productos
(ProductoID int NOT NULL PRIMARY KEY IDENTITY(1,1),
Producto varchar(255) NOT NULL,
Descripcion varchar(150) SPARSE NULL,
CodigoAlterno varchar(30) SPARSE NULL,
FechaAdd datetime NOT NULL)
Realicemos unas Inserciones a la tabla Productos, una de las inserciones contendrá valores
nulos:
INSERT INTO dbo.Productos (Producto,Descripcion,CodigoAlterno,FechaAdd)
VALUES('WHISKY','Juanito el Caminador','WJC7854',GETDATE()),
('AGUA MINERAL',NULL,NULL,GETDATE())
Ahora seleccionemos los datos:
SELECT Producto,Descripcion,CodigoAlterno
FROM dbo.Productos
WHERE (Descripcion IS NOT NULL) AND (CodigoAlterno IS NOT NULL)
Noten que lo que hicimos no nos afecta en nada aparentemente, la ventaja es que estamos
haciendo más eficiente la manera de almacenar las columnas que contengan valores
nulos, en resumen estas columnas aplicaran el ZEROBYTE y ahorremos un poco más de
espacio en nuestras bases de datos.
Etiquetas de Technorati: SQL Server 2008,Sparse Columns,Columnas Dispersas,Valores
Nulo,NULL values.
Comentarios : 1 comentario
Etiquetas: Columnas Dispersas, NULL values., Sparse Columns, SQL Server 2008, Valores
Nulo
Categorías : SQL
[SQL-2008] Buscar texto en definiciones de Objetos MS
SQL Server.
21 09 2009
Saludos amigos en esta ocasión les dejo un ejemplo de como poder buscar “Cadenas de
Texto” en la definición de nuestros Procedimientos almacenados.
En este ejemplo vamos a buscar la palabra „HumanResources‟ en los procedimientos
almacenados de la base de datos „AdventureWorks2008‟.
Necesitamos ejecutar el siguiente script con la cadena de texto que se va a buscar.
USE AdventureWorks2008;
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%HumanResources%'
GO
Si se encontraron resultados, a continuación se mostrara un listado con los nombres de los
procedimientos almacenados que contienen nuestra palabra.
Bien amigos, para comprobar el resultado elegiremos uno de los procedimientos para ver su
definición e identificar que contiene la palabra que buscamos „HumanResources‟.
USE AdventureWorks2008;
EXEC sp_HelpText 'uspGetManagerEmployees'
Resultado:
Como pueden ver el resultado es sobre un Procedimiento almacenado de los de la lista que
contienen la palabra a buscar, las palabras encerradas en color morado son las que
coinciden con nuestra búsqueda, de esta manera podemos buscar lo que deseemos dentro de
nuestros Stored Procedures y ver su definición rápidamente.
Bueno amigos, espero les sea de ayuda, espero sus comentarios y por favor voten por este
blog.
Etiquetas de Technorati: OBJECT_DEFINITION,Buscar texto en SQL,SQL
2008,Definición de objetos.
Comentarios : 4 Comentarios »
Etiquetas: Buscar texto en SQL, Definición de objetos., OBJECT_DEFINITION, SQL 2008
Categorías : SQL
[SQL 2008] Como instalar las bases de datos de ejemplo
de MSSQL Server 2008.
19 09 2009
Saludos amigos, en el post anterior les indique de donde pueden descargar las bases de
datos de ejemplo de MS SQL Server, ahora en este post les dejo unas imágenes para que
vean los pasos que deben de seguir para instalar dichas bases de datos.
Si no tienen el ejecutable para instalar las bases de datos de ejemplo pueden ver el siguiente
post. BD Ejemplo MS SQL Server.
Screen 1.
Screen 2.
Screen 3. Seleccionen las bases de datos que desean instalar además de los Accesos rápidos
y archivos de ejemplo.
Screen 4. Bases de datos disponibles para instalar.
Screen 4.1. Para este ejemplo solo instalaremos dos bases de datos.
Screen 5.
Screen 6.
Screen 7. La instalación ha finalizado.
Screen 8. Listo ya tenemos instaladas las bases de datos de ejemplo que seleccionamos.
Espero les sea de ayuda, espero sus comentarios, por favor voten por mi blog.
Etiquetas de Technorati: Bases de datos de ejemplo,Samples data bases. MS SQL Server
2008,Instalar ejemplos de Base datos,Install samples Data bases.
Comentarios : 1 comentario
Etiquetas: Bases de datos de ejemplo, Instalar ejemplos de Base datos, Install samples Data
bases., Samples data bases. MS SQL Server 2008
Categorías : SQL
[SQL 2008] Bases de Datos de ejemplo de
MSSQL Server.
19 09 2009
Saludos amigos aquí les dejo los vínculos para que puedan descargar las bases de datos de
ejemplo de SQL Server “AdventureWorks” en una versión estable, ya que también existe
una versión alpha.
Vínculo: CODEPLEX Bases de Datos de ejemplo.
Contenido de la descarga:
SQL Server 2008 SR1.
Etiquetas de Technorati: SQL Server,Bases de datos de ejemplo,example data bases. MS
SQL Server 2008.
SQL2008.AdventureWorks_All_Databases.x86.msi
Other Available Downloads.
SQL2008.AdventureWorks_All_Databases.x64.msi (Recommended default)
SQL2008.AdventureWorks_All_Databases.ia64.msi (Recommended default)
SQL2008.AdventureWorks_All_Databases.zip (Recommended default)
SQL2008.AdventureWorksLT2008_Only_Database.zip (Recommended default)
Espero les sea de ayuda, dejen comentarios y por favor apóyenme votando por mi Blog.
Etiquetas de Technorati: SQL Server,Bases de datos de ejemplo,example data bases. MS
SQL Server 2008.
Comentarios : 2 Comentarios »
Etiquetas: Bases de datos de ejemplo, example data bases. MS SQL Server 2008., SQL
Server
Categorías : SQL
[SQL 2008] SP_HELPTEXT
31 08 2009
Saludos amigos aquí les dejo la manera fácil y sencilla de poder ver el contenido de los
procedimientos almacenados, funciones, vistas, triggers, columnas calculadas y
restricciones “CHECK”, en otras palabras es para ver la definición de nuestros objetos de
base de datos.
Como ejemplo veremos la definición de un procedimiento almacenado.
Resultado:
Obteniendo la definición de una función:
Resultado:
De esta manera podemos explorar raídamente las definiciones nuestros objetos,
nuevamente espero les sea de ayuda, espero sus comentarios y por favor voten por mi blog.
Etiquetas de Technorati: sp_helptext,SQL 2008
Comentarios : 3 Comentarios »
Etiquetas: sp_helptext, SQL 2008
Categorías : SQL
[SQL 2008] Accesos directos de consulta.
31 08 2009
Saludos amigos en esta ocasión les dejo un ejemplo de como configurar el SQL Server
2008 para utilizar Accesos directos con el teclado y así ejecutar sentencias SQL sin
necesidad de escribirlas.
Para esto pondré un ejemplo, por lo general al estar desarrollando en SQL Server
utilizamos el SELECT * FROM o SELECT TOP 100 * FROM, bueno pues para no
estar escribiéndolo a cada instante, configuraremos un Acceso directo,:
1. Vamos al menú Herramientas >> Opciones.
2. Se desplegara un árbol de opciones, seleccionamos la de Entorno >> Teclado.
3. Se encontrara un apartado para crear Accesos directos de consulta, el cual se compone de
dos partes:
a. Accesos directos: Son la combinación de teclas con las que ejecutaremos la consulta.
b. Procedimientos almacenados: Son los SP que se ejecutaran, pueden ser también algunas
sentencias SQL.
Ejemplo: Insertaremos dos accesos directos de consulta, uno se ejecutara con
a. Ctrl+5 = SELECT * FROM.
b. Ctrl+6 = SELECT TOP 5 * FROM
Damos clic en el botón Aceptar y abrimos una nueva consulta.
Ahora vamos a seleccionar todos lo registros de la Tabla llamada DEMO_PRODUCTO,
para esto escribiremos solo el nombre de la tabla y presionamos las teclas de acceso directo
para seleccionar todos los registros (CTRL+5).
Resultado con CTRL+5:
Resultado con CTRL+6 :
Espero les sea de ayuda a la hora de trabajar con SQL Server, Dejen comentarios y voten
por mi blog por favor.
Etiquetas de Technorati: Accesos directos de consulta,SQL 2008
Comentarios : 1 comentario
Etiquetas: Accesos directos de consulta, SQL 2008
Categorías : SQL
[SQL 2005] Lista delimitada por comas en SQL Server
2005 – COALESCE.
28 07 2009
Saludos amigos en esta ocasión les dejo un ejemplo de como obtener una lista de valores
delimitada por comas a partir de un comando SELECT en SQL Server 2005, ya que en un
post anterior tengo el método para SQL Server 2008 ( [SQL 2008] Crear una lista
delimitada por comas usando SELECT. ).
Bueno, para este ejemplo se utilizo la función COALESCE, la cual “Devuelve la primera
expresión distinta de NULL entre sus argumentos”.
Sintaxis.
COALESCE ( expression [ ,...n ] )
Si desea saber más sobre COALESCE vea: http://msdn.microsoft.com/es-
mx/library/ms190349(SQL.90).aspx
Ahora sí, veamos el ejemplo:
1. Seleccionamos los roles de nuestra tabla.
SELECT id, name_english FROM dbo.ROLES_DEMO
2. Ahora regresamos una lista delimitada por comas usando el COALESCE.
USE demo
GO
DECLARE @valores varchar(500)
SELECT @valores = COALESCE ( @valores + ',' , '' ) + name_english
FROM dbo.ROLES_DEMO
SELECT @valores AS Valores
GO
Resultado:
Tambien pueden ver este post, donde encontraran más información sobre COALESCE.
@http://blog.sqlauthority.com/2008/06/04/sql-server-create-a-comma-delimited-list-using-
select-clause-from-table-column/
Espero les sea de ayuda y me despido de ustedes, recuerden votar por mi blog, por favor
apóyenme, ya que es muy raro que la gente vote.
Etiquetas de Technorati: COALESCE,SQL 2005,Comma delimited List
Comentarios : 1 comentario
Etiquetas: COALESCE, Comma delimited List, SQL 2005
Categorías : SQL
Curso de SQL Server 2008 y ASP Net 3.5
27 07 2009
Saludos amigos, les escribo solo para informarles que los Cursos impartidos en el
Tecnológico de Estudios Superiores de San Felipe del Progreso culminaron
satisfactoriamente, a pesar de la influenza, todo salió de maravilla, los cursos impartidos
fueron sobre SQL Server 2008 y Programación ASP .Net 3.5 con Visual Studio 2008.
Gracias a los Estudiantes y Profesores que pusieron empeño e interés durante las 4 sesiones
del Curso, espero sin duda verlos en un futuro.
Quedo a sus ordenes para dudas y sugerencias,.
Su amigo Ivan Rangel Cuadros.
E-mail: [email protected]
Les dejo unas fotos tomadas en el Curso.
Comentarios :
Deja un
Comentario »
Categorías : SQL
[SQL-
2008] Creando Sinónimos para nuestros objetos de Base
de Datos.
25 07 2009
Saludos amigos en esta ocasión les dejo un ejemplo del uso y creación de sinónimos en
SQL Server 2008.
Los sinónimos sirven para hacer referencia a nuestros objetos de base de datos de una
manera más entendible, clara, o simplemente para abreviar los nombres de tal manera que
nos faciliten su uso en nuestras Consultas.
Los sinónimos se pueden aplicar a los siguientes Objetos de BD:
Procedimiento almacenado del ensamblado (CLR).
Función con valores de tabla del ensamblado (CLR).
Función escalar del ensamblado (CLR).
Funciones de agregado del ensamblado (CLR).
Procedimiento de filtro de replicación.
Procedimiento almacenado extendido.
Función escalar de SQL.
Función SQL con valores de tabla.
Función SQL con valores de tabla insertados.
Procedimiento almacenado de SQL.
Vista.
Tabla1 (definida por el usuario) se incluyen tablas temporales locales y globales.
Debemos tomar en cuenta es que el Objeto el cual usaremos, NO es necesario que exista el
momento de la CREACIÓN DEL SINÓNIMO, esto debido a que SQL Server comprueba
la existencia del Objeto al momento de llamar o ejecutar el Sinónimo.
También SQL Server 2008, nos permite Crear, Quitar y hacer Referencia a sinónimos
utilizando SQL dinámico, ¿Eso es grandioso no creen?.
Les dejo este ejemplo sencillo, en el cual crearemos un sinónimo para una Tabla (Objeto
Base).
1. Creando el Sinónimo.
USE prueba;
GO
CREATE SYNONYM dbo.DemoResultados -- Nombre del Sinónimo.
FOR dbo.DEMO_CicloEscolar_Examenes_Resultados; -- Objeto Base al cual le
aplicaremos el Sinónimo.
GO
2. Consultando datos del Sinónimo.
-- Consultando datos del Sinónimo.
SELECT alumnoID, examenID, calificacion FROM dbo.DemoResultados;
GO
3. Resultado.
Para eliminar el Sinónimo, lo pueden hacer de la siguiente manera:
USE prueba;
GO
DROP SYNONYM dbo.DemoResultados;
GO
Para más referencia les dejo este enlace: http://msdn.microsoft.com/es-
es/library/ms177544.aspx
Espero les sea de ayuda, dejen comentarios.
Etiquetas de Technorati: SQL 2008,Create SYNONYM
Comentarios : Deja un Comentario »
Etiquetas: Create SYNONYM, SQL 2008
Categorías : SQL
Curso de SQL Server 2008 y ASP Net 3.5
21 07 2009
Saludos amigos, les escribo solo para informarles que los Cursos impartidos en el
Tecnológico de Estudios Superiores de San Felipe del Progreso culminaron
satisfactoriamente, a pesar de la influenza, todo salió de maravilla, los cursos impartidos
fueron sobre SQL Server 2008 y Programación ASP .Net 3.5 con Visual Studio 2008.
Gracias a los Estudiantes y Profesores que pusieron empeño e interés durante las 4 sesiones
del Curso, espero sin duda verlos en un futuro.
Quedo a sus ordenes para dudas y sugerencias.
Su amigo Ivan Rangel Cuadros.
Blog: http://sqlpsykrest.wordpress.com/
E-mail: [email protected]
Les dejo unas fotos del Curso.
Comentarios : 3
Comentarios »
Categorías : SQL
[SQL
2008]
Delete TOP con Chunking Data.
21 07 2009
Saludos amigos después de la recuperación satisfactoria del pequeño accidente que sufrí, he
vuelto a escribir un articulo sobre una nueva opción de la clausula DELETE TOP
disponible en SQL Server 2008.
En SQL Server 2008 la clausula TOP se puede utilizar para Insertar, Eliminar, o
Actualizar datos, en pocas palabras se puede utilizar con las sentencias INSERT,
DELETE Y UPDATE.
El ejemplo que les dejo muestra el uso de TOP para fragmentar “CHUNKING”
información de una tabla, es decir, en lugar de ejecutar una sentencia DELETE para
ejecutar una sola operación, podemos fragmentar los datos en pequeñas partes y hacer que
sea más ligera la operación, y así mejorar el rendimiento y concurrencia de la base de datos
para tablas grandes que tengan un acceso frecuente.
Esta técnica se utiliza para el manejo de grandes cargas de datos para informes o
aplicaciones de tipo data warehouse. Los Grandes o Simples conjuntos de actualizaciones,
pueden hacer que se incremente considerablemente el archivo de Transacciones
“Transaction log”. Al procesar en partes la información, cada una de es confirmada
después de la terminación de su ejecución “COMMIT”, permitiendo que el servidor del
SQL reutilice potencialmente ese espacio del registro de transacciones.
Además del incremento en el registro de transacciones, en una actualización muy grande de
datos, si la consulta es cancelada, usted puede tener que esperar un gran lapso de tiempo
mientras que la transacción se deshace “Rolls Back”. Con partes más pequeñas, usted
puede continuar con su actualización de manera más rápida. También, el “Chunking”
permite más concurrencia contra la tabla modificada, permitiendo que las consultas de
usuario se ejecuten, en lugar de esperar varios minutos para que una modificación grande
termine.
Para este ejemplo crearemos una tabla temporal en la cual insertaremos 5000 registros,
posteriormente realizaremos un DELETE TOP para eliminar la información en lotes de
250 Filas, de esta manera eliminaremos la información en pequeñas partes generando
operaciones ligeras y no una sola operación que elimine todos los registros en una sola
ejecución.
1. Crearemos una tabla temporal para insertar los 5000 registros.
USE prueba;
GO
-- Creando la tabla Temporal.
DECLARE @tabla TABLE(id BIGINT, nombre VARCHAR(100));
DECLARE @j bigint = 1;
-- Insertanto los 5000 registros en la tabla temporal.
WHILE @j <= 5000
BEGIN
INSERT INTO @tabla VALUES(@j,'Usuario' + CAST(@j AS varchar(4)));
SET @j = @j + 1;
END
2. Contamos los datos Insertados.
3. Recorremos los registros y los eliminamos en fragmentos de 250 registros.
-- Recorriendo los resgistros de la tabla.
WHILE (SELECT COUNT(*)FROM @tabla)> 0
BEGIN
DELETE TOP(250) -- Eliminando en fragmentos de 250 registros
FROM @tabla
END
El script completo quedaría de la siguiente manera:
USE prueba;
GO
SET NOCOUNT ON;
-- Creando la tabla Temporal.
DECLARE @tabla TABLE(id BIGINT, nombre VARCHAR(100));
DECLARE @j bigint = 1;
-- Insertanto los 5000 registros en la tabla temporal.
WHILE @j <= 5000
BEGIN
INSERT INTO @tabla VALUES(@j,'Usuario' + CAST(@j AS varchar(4)));
SET @j = @j + 1;
END
--------------------------------------------------->>>
--------------------------------------------------->>>
-- Contando los registros antes de la eliminación.
SELECT COUNT(id) AS 'Antes de eliminar' FROM @tabla
--------------------------------------------------->>>
--------------------------------------------------->>>
SET NOCOUNT OFF;
-- Recorriendo los resgistros de la tabla.
WHILE (SELECT COUNT(*)FROM @tabla)> 0
BEGIN
DELETE TOP(250) -- Eliminando en fragmentos de 250 registros
FROM @tabla
END
--------------------------------------------------->>>
--------------------------------------------------->>>
-- Contando los registros despues de la eliminación.
SELECT COUNT(id) AS 'Despues de eliminar' FROM @tabla
--------------------------------------------------->>>
--------------------------------------------------->>>
Resultado:
Espero les sea de ayuda, dejen comentarios y por favor apóyenme votando por mi Blog.
Apóyame votando
aquí: http://blogit.ms/TopBloggers.aspx en la categoría SQL Server. Los pasos para votar
están aquí te llevara 3 min: Clic Aquí.
Etiquetas de Technorati: SQL 2008,DELETE,TOP,Chunking Data.
Comentarios : 1 comentario
Etiquetas: Chunking Data., DELETE, SQL 2008, TOP
Categorías : SQL
[SQL 2008] Manipulación de Errores MS SQL
Server 2008.
15 06 2009
Saludos amigos, nuevamente les dejo un tema que traduje y aprendí, para el manejo de
Errores en SQL Server 2008, considero es muy bueno y que será para algunos la opción
perfecta a utilizar en nuestras aplicaciones de bases de datos.
Mensajes de Error definidos por el Sistema y definidos por el Usuario.
Este tema se refiere a la visualización de errores definidos por el sistema y la agregación de
mensajes de error definidos por el usuario a la instancia de SQL Server.
La tabla sys.messages contiene una fila por cada mensaje de error definido por el usuario y
mensajes integrados en la instancia de SQL Server.
Los mensajes de error integrados son aquellos que se plantearon en respuesta a los errores
estándar de SQL Server.
Los mensajes de error definidos por el usuario se utilizan comúnmente en aplicaciones de
terceros (third-party applications), que definen un conjunto de mensajes de error para
usarse dentro de una aplicación. Los mensajes de error definidos por el usuario permiten la
parametrización, lo que significa que puede crear sus propios mensajes, los cuales
permitirán una personalización basada en parámetros.
Visualizando la Información de Error del Sistema.
Para esto puede utilizar la vista del catalogo de sistema sys.messages para ver todos los
mensajes de error del sistema y los definidos por el usuario en la instancia de SQL Server,
como se muestra a continuación.
SELECT m.message_id, m.severity, m.is_event_logged, m.[text]
FROM sys.messages m
INNER JOIN sys.syslanguages l ON m.language_id = l.msglangid
WHERE l.alias = 'Spanish'
ORDER BY m.severity DESC, m.[text]
En la consulta anterior solo se mostraran los mensajes del lenguaje Español, el resultado
filtrado para fines de ejemplo seria el siguiente:
Explicando la tabla:
message_id: Identificador del mensaje.
severity: Nivel de gravedad.
is_event_logged: Se usa si el error se escribe en el registro de eventos de Windows.
text: Texto del mensaje.
Los rangos de nivel de gravedad “Severity” son de 1 a 25, con las siguientes
categorizaciones implícitas:
0 al 10: Solo son mensajes informativos.
11 al 16: Son errores de motor de base de datos que pueden ser corregidos por el usuario,
como son los objetos de la base de datos que faltan cuando se ejecuta la consulta,
sugerencias de bloqueo no compatibles, permisos denegados, bloqueos de transacción y
errores de sintaxis. Por ejemplo, una violación de llave primaria “PRIMARY KEY”
devolverá un error de nivel de gravedad 14. Un error de división entre cero devuelve un
error de nivel de gravedad 16.
17 al 19: Son errores que necesitan ser atendidos por el sysadmin, por ejemplo, si SQL
Server se ha quedado sin recursos de memoria, o si se han alcanzado los límites del motor
de base de datos.
20 al 25: Son errores fatales y de problemas del sistema, como los son hardware o software
dañado que afecta a la base de datos, problemas de integridad y errores de los medios de
comunicación.
Como pudieron notar la columna de texto en sys.messages contiene el mensaje de error
real que se presenta al usuario desde el motor de base de datos. Observe que algunos
mensajes tienen signos de porcentaje y otros símbolos combinados dentro de ellos:
El signo % es un parámetro de sustitución que permite al motor de base de datos
personalizar la salida del mensaje de error basado en el contexto actual de la base de datos
y error de evento. Los valores concatenados para el signo % indican el tipo de dato y la
longitud del parámetro de sustitución.
Creación de un mensaje de error definido por el usuario.
Para crear un nuevo mensaje de error definido por el usuario se hace utilizando el
procedimiento almacenado de sistema sp_addmessage, tal vez desee crear sus propios
mensajes de error personalizados para sus aplicaciones, y a si garantizar la coherencia a
través de rutinas para el manejo de errores específicos de aplicación.
Para crear un nuevo mensaje de error y agregarlo a la vista de sistema sys.messages,
tendremos que ejecutar el siguiente procedimiento almacenado “sp_addmessage”, para que
posteriormente lo invoquemos con el comando RAISERROR().
Sintaxis:
sp_addmessage [ @msgnum = ] msg_id ,
[ @severity = ] severity ,
[ @msgtext = ] „msg‟
[ , [ @lang = ] „language‟ ]
[ , [ @with_log = ] „with_log‟ ]
[ , [ @replace = ] „replace‟ ]
Descripción de los parámetros:
msg_id: Es el identificador del error proporcionado por el usuario, que puede ser entre
50,001 y 2,147,483,647. El ID del mensaje no es de la clave única o llave primaría de la
tabla; en su lugar, la clave única esta compuesta por la combinación del ID del mensaje y el
ID de idioma.
severity: Define el nivel de gravedad del mensaje (1 a 25).
msg: Representa el mensaje de error real, que utiliza un tipo de datos
nvarchar(255).
language: Especifica el idioma en el que está escrito el mensaje de error.
with_log: Esto define si el mensaje se escribirá o no en el Registro de errores de
aplicación para Windows cuando se invoque el error.
Replace: Cuando se especifica, El existente error definido por el usuario (basado
en ID del mensaje y el lenguaje) es sobrescrito con los nuevos parámetros pasados
al procedimiento almacenado del sistema.
Ahora crearemos nuestro propio mensaje de error definido por el usuario:
Nota importante: En mi caso estoy trabajando sobre un servidor configurado con Español
(Spanish), y al intentar crear un mensajes de Error, me sale el siguiente mensaje de error:
Para esto debemos primero crear una versión de nuestro mensaje de error para el lenguaje
Ingles (English), esto es por que el lenguaje nativo de SQL Server es el Ingles.
Ahora si creemos nuestro mensaje de error:
Creando el mensaje en Ingles:
-- Creando un mensaje de error en Ingles.
EXEC sp_addmessage
70003,
14,
N'You dont have permission in the current table %s contact the database
administrator.', 'English'
GO
Creando el mensaje en Español:
-- Creando un mensaje de error en Español.
EXEC sp_addmessage
70003,
14,
N'No tiene permisos en la tabla actual %1! contacte al administrador de
base de datos.', 'Spanish'
GO
Invocando los mensajes de error con RAISERROR():
-- Usando el mensaje creado con el comando RAISERROR.
-- Ingles
SET LANGUAGE us_english;
RAISERROR (70003, 14, 1, N'dbo.DEMO_ROLES')
-- Español
SET LANGUAGE Español;
RAISERROR (70003, 14, 1, N'dbo.DEMO_ROLES')
Resultado:
Por último vale la pena mencionar que para crear los parámetros en versiones no inglesas,
deben utilizar números seguidos del signo de exclamación “!” que coincidan con los
parámetros del mensaje original como lo muestro en el siguiente ejemplo:
Casi lo olvido, falta indicar como eliminar un mensaje de error, esto se realiza con la
siguiente sintaxis:
sp_dropmessage [ @msgnum = ] message_number
[ , [ @lang = ] „language‟ ]
Ejemplo:
EXEC sp_dropmessage 70003
Espero se de ayuda para ustedes, por favor dejen comentarios y apóyenme votando por mi
blog.
Apóyame votando
aquí: http://blogit.ms/TopBloggers.aspx en la categoría SQL Server. Los pasos para votar
están aquí te llevara 3 min: Clic Aquí.
Etiquetas de Technorati: Error handlig SQL,Errores
SQL,RAISERROR,sp_addmessage,sp_dropmessage
Comentarios : 2 Comentarios »
Etiquetas: Error handlig SQL, Errores SQL, RAISERROR, sp_addmessage, sp_dropmessage
Categorías : SQL
[SQL] ¿Por qué utilizar Tablas Temporales Locales,
Globales o Variables de Tabla?.
12 06 2009
Saludos amigos en esta ocasión leyendo me encontré con un tema muy interesante acerca
de las tablas temporales en SQL, les dejo lo que traduje del tema con una explicación y
ejemplo de como crear tablas temporales locales, globales y variables de tabla, dentro del
Motor de Base de Datos de SQL Server 2008.
Tablas Temporales.
Las tablas temporales son consideradas tablas regulares, y estas se almacenan
automáticamente en la base de datos de tempdb.
Las tablas temporales se pueden usar en los siguientes escenarios:
Como alternativa a los cursores: por ejemplo, en lugar de utilizar un cursor de Transact-
SQL para recorrer un conjunto de resultados y realizar tareas basadas en cada fila, en su
lugar puede utilizar una tabla temporal. Usando un bucle WHILE, puede recorrer cada fila
de la tabla y realizar la acción de la fila especificada, posteriormente debe eliminar la fila
de la tabla temporal.
Como almacenamiento incremental de conjuntos de resultados: Por ejemplo,
imaginemos que tiene una sola consulta SELECT que realiza una combinación “JOIN”
con diez tablas. A veces las consultas con varias combinaciones “JOINS” pueden
funcionar de manera incorrecta. Una técnica para intentar es la de fraccionar o fragmentar
una consulta grande en consultas más pequeñas. Si usamos tablas temporales, podemos
crear conjuntos de resultados intermedios basados en consultas de menor tamaño, en lugar
de intentar ejecutar una consulta única que sea demasiado grande y de combinaciones
múltiples “multi-joined”.
Como temporal en la sobrecarga baja de búsqueda de tabla: Por ejemplo, imagine que
usted está utilizando una consulta que tarda varios segundos en ejecutarse, pero sólo
muestra un pequeño conjunto de resultados, el cual desea utilizar en varias áreas de su
procedimiento almacenado, pero cada vez que se llama se incurre en el tiempo de ejecución
de la consulta general. Para resolver esto, puede ejecutar la consulta una sola vez en el
procedimiento, llenando una tabla temporal, de esta manera se puede hacer referencia a la
tabla temporal en varios lugares en su código, sin incurrir en una sobrecarga de resultados
adicional.
Existen dos tipos de tablas temporales: Globales y Locales.
Las tablas temporales Locales se escriben anteponiendo el símbolo # y tablas temporales
Globales con el doble símbolo ##.
Tablas temporales Locales.
Las tablas temporales Locales están disponibles para usarse por cada conexión actual del
usuario que los cree.
Varias conexiones pueden crear una tabla temporal con mismo nombre, esto solo para para
tablas temporales Locales sin causar conflictos. La representación interna de la tabla local
tiene un nombre único, para no estar en conflicto con otras tablas temporales con el mismo
nombre creado por otras conexiones en la tempdb.
Las tablas temporales locales son eliminadas con el comando DROP o se eliminan
automáticamente de memoria cuando se cierra la conexión del usuario.
Creando la tabla temporal Local:
CREATE TABLE #ProductosResumen
( idProducto int NOT NULL PRIMARY KEY,
nombre varchar(75) NULL,
precio smallmoney NULL
);
Insertando datos en la tabla temporal global.
INSERT #ProductosResumen (idProducto, nombre , precio)
SELECT id,nombre, precio FROM dbo.DEMO_PRODUCTO
ORDER BY nombre;
Seleccionando los datos de la tabla temporal.
--Seleccionando los datos de la tabla temporal
SELECT * FROM #ProductosResumen;
-- Resumen de precios de la tabla temporal
SELECT AVG(precio) FROM #ProductosResumen;
Resultado.
Eliminando la tabla.
-- Eliminando la tabla temporal
DROP TABLE #ProductosResumen;
Nota: Para que el ejemplo funcione deben de ejecutar en un solo bloque de instrucciones
todo el código que coloque anteriormente. Para este caso yo llene mi tabla temporal con
datos de una tabla que ya tenia creada en la base de datos, ustedes pueden utilizar un
insert normal.
Tablas Temporales Globales.
Las tablas temporales Globales tienen un alcance diferente al de las tablas temporales
Locales. Una vez que una conexión crea una tabla temporal Global, cualquier usuario con
permisos adecuados sobre la base de datos puede acceder a la tabla. A diferencia de tablas
temporales Locales, no se pueden crear versiones simultáneas de una tabla temporal
Global, ya que esto generará un conflicto de nombres.
Las tablas temporales Globales de eliminan explícitamente de SQL Server ejecutando
DROP TABLE. También se eliminan automáticamente después de que se cierra la
conexión que la creo, la tabla temporal Global no es referenciada por otras conexiones,
pero es muy raro ver que se utilicen tablas temporales Globales en bases de datos en
producción.
Es importante considerar cuando una tabla va o debe ser compartida a través de
conexiones, se debe crear una tabla real, en lugar de una tabla temporal Global. No
obstante, SQL Server ofrece esto como una opción.
Creando la tabla temporal Global:
--Creando la tabla temporal Global
CREATE TABLE ##Roles
( idRol int NOT NULL PRIMARY KEY,
nombre varchar(30) NULL,
activo bit NULL
);
Insertando y seleccionando datos de la tabla temporal global:
-- Insertando datos en la tabla temporal global
INSERT INTO ##Roles
VALUES(1,'Administrador',1),
(2,'Supervisor',1),
(3,'Programador',0)
-- Seleccionando los datos de la tabla temporal global
SELECT * FROM ##Roles;
Resultado:
Eliminando la tabla temporal global desde la conexión original que la creo.
-- Eliminando la tabla temporal global
DROP TABLE ##Roles;
Variables de Tabla.
Por otro lado tenemos las Variables de Tabla que son un tipo de datos que puede ser
utilizados en un lote Transact-SQL (Batch), procedimiento almacenado o función; estas
variables de tabla son creado y definidas de forma similar a una tabla, sólo con un alcance
de vida estrictamente definido. Las Variables de tabla suelen ser buenos reemplazos de
tablas temporales siempre y cuando el conjunto de datos es pequeño.
Razones para usar las variables de tabla:
Duración o alcance. La duración de la variable de tabla sólo vive durante la
ejecución del lote, función, o procedimiento almacenado.
Tiempos de bloqueo más cortos. Por el estrecho alcance o tiempo de vida.
Menos re compilaciones cuando se usa en los procedimientos almacenados.
Como se menciono anteriormente, hay inconvenientes para utilizar las variables de tabla. El
rendimiento de las variable de tabla se ve afectado cuando el resultado es demasiado
grande o cuando los datos de la columna de cardinalidad son fundamentales para la
optimización del proceso de consulta.
La sintaxis para crear una variable de tabla es similar a la de crear una tabla normal, se
utiliza la palabra clave DECLARE y el nombre de tabla, anteponiendo el símbolo @:
DECLARE @TableName TABLE
(column_name <data_type> [ NULL | NOT NULL ] [ ,...n ] )
Creando una variable de tabla:
-- Creando la variable de tipo tabla.
DECLARE @EstatusUsuarios TABLE
( idEstatus int NOT NULL PRIMARY KEY,
nombre varchar(30) NULL
)
Insertando y seleccionando datos de la variable tabla:
-- Insertando en la variable de tipo tabla.
INSERT INTO @EstatusUsuarios VALUES (1,'Activo'),
(2,'Inactivo'),
(3,'Bloqueado')
-- Consultando datos de la variable de tipo tabla.
SELECT * FROM @EstatusUsuarios;
Al terminar la ejecución del batch o bloque de instrucciones se eliminara la variable tabla, o
si colocamos una instrucción GO automáticamente se eliminara y no la podremos utilizar
como los muestro en el siguiente ejempló, recuerde que los ejemplo para claridad los
coloque separados, pero los debe de ejecutar completos como lo hago abajo para el caso de
la variables de tabla:
-- Creando la variable de tipo tabla.
DECLARE @EstatusUsuarios TABLE
( idEstatus int NOT NULL PRIMARY KEY,
nombre varchar(30) NULL
)
-- Insertando en la variable de tipo tabla.
INSERT INTO @EstatusUsuarios VALUES (1,'Activo'),
(2,'Inactivo'),
(3,'Bloqueado')
-- Consultando datos de la variable de tipo tabla.
SELECT * FROM @EstatusUsuarios;
-- Al ejecutarse el go o el bloque de instrucciones
--la variable tabla se eliminara auitomaticamente.
Go
SELECT * FROM @EstatusUsuarios;
Como podrán notar en el primer select nos regreso:
Y para el segundo select:
Esto es por que como lo
comente anteriormente el tiempo de vida de la variable tabla termina al ejecutarse el bloque
de instrucciones, en este caso termino con el GO.
Cuando encontremos problemas de rendimiento, debemos de asegurarnos de probar todas
las soluciones y alternativas, y no necesariamente asumir que una de las opciones (tablas
Temporales) son menos deseables que otras (variables de tabla).
Espero les sea de ayuda, se que esta un poco largo el Post, pero creo vale la pena leerlo.
Apóyame votando
aquí: http://blogit.ms/TopBloggers.aspx en la categoría SQL Server. Los pasos para votar
están aquí te llevara 3 min: Clic Aquí.
Etiquetas de Technorati: Tablas temporales,temporary tables,Local Tables,Global
Tables,Variables de Tabla,SQL 2008
Comentarios : 10 Comentarios »
Etiquetas: Global Tables, Local Tables, SQL 2008, Tablas temporales, temporary tables,
Variables de Tabla
Categorías : SQL
¿Cómo votar por este Blog?
2 06 2009
Amigos, en esta ocasión les pido su apoyo para contar con su invaluable voto, es la primera
vez que concurso en Blog IT, como sabrán es una competencia de blogs con diferentes
categorías, yo estoy participando en la de SQL Server, para hacer esto más breve espero
contar con su voto, les dejo los pasos para que lo puedan hacer, me despido enviándoles un
cordial saludo.
Nota: En ocasiones el sitio de votación esta muy lento, por favor se paciente y
apóyame es importante para mi contar con tu voto.
Paso 1. Ir al siguiente enlace: http://www.blogit.ms/TopBloggers.aspx o hacer clic en el
siguiente botón:
Paso 2. Seleccione la categoría de SQL Server y haga clic en el botón buscar.
Nota: No se a que se deba pero se tarda unos instantes en cargar la página, por favor
sea paciente y espere un poco .
Paso 3. Busque mi blog http://sqlpsykrest.wordpress.com y de clic en el botón Votar.
Paso 4. Ingrese su correo electrónico.
Paso 5. Confirme el voto. Le llegara un correo electrónico en el cual se le pedirá que haga
clic en un enlace para confirmar el voto. Nota: el correo muchas veces llega al SPAM o
correo no deseado.
Listo amigos con esto su voto quedara contabilizado, el tiempo estimado es de 3 min, por
favor apóyenme, sin duda espero contar con ustedes.
Comentarios : 9 Comentarios »
Categorías : SQL
[SQL] Previniendo la Inyección de código.
1 06 2009
Saludos amigos, encontré un ejemplo de una función escalar “Scalar User-Defined
Functions”, por @Joseph Sack, la cual verifica si una instrucción TSQL esta intentando
ejecutar código malintencionado que puede afectar de manera catastrófica la información y
estructura de nuestras bases de datos. Como muchos de ustedes sabrán al tener sentencias
TSQL no parametrizadas corremos un enorme riesgo de sufrir ataques de inyección, el
script que a continuación les comparto verifica que la sentencia a ejecutar no contenga
código que intente alterar los datos o la estructura de los mismos.
1. Creamos una tabla llamada DEMO_ROLES, a la cual insertaremos datos a través de
Sentencias dinámicas SQL.
Creando la tabla:
USE prueba;
GO
CREATE TABLE dbo.DEMO_ROLES(
id_rol bigint IDENTITY(1,1) NOT NULL,
rol varchar(50) NOT NULL,
CONSTRAINT PK_DEMO_ROLES PRIMARY KEY CLUSTERED
([id_rol] ASC)
);
GO
Insertando datos:
INSERT INTO dbo.DEMO_ROLES
VALUES ('Administrador'),
('Gerente'),
('Supervisor'),
('Desarrollador');
Seleccionando datos con “sp_executesql”.
DECLARE @SQLtext nvarchar(350);
SET @SQLtext = N'SELECT * FROM dbo.DEMO_ROLES';
EXEC sp_executesql @SQLtext;
GO
Resultado:
2. Simulando la Inyección de código. Para este paso simularemos que la cadena de código
que se va a ejecutar fue modificada malintencionadamente y le concatenaron (Inyectaron)
una sentencia que borra la tabla DEMO_ROLES.
Ejecutando la sentencia:
DECLARE @SQLtext nvarchar(350);
SET @SQLtext = N'SELECT * FROM dbo.DEMO_ROLES' + ';DROP TABLE
dbo.DEMO_ROLES';
EXEC sp_executesql @SQLtext;
GO
Nota: Por el orden en el que se ejecutan las sentencias, primero se seleccionan los
datos y después se elimina la tabla, por lo tanto hasta la próxima ejecución de las
sentencias se producirá una excepción donde el SQL nos indicara que la tabla
DEMO_ROLES no existe, esto a cause de que fue eliminada por la simulación de la
inyección de código.
Resultado 1 (Primera ejecución con inyección simulada):
Resultado 2 (Ejecuciones posteriores a la inyección simulada):
Ahora como lo resolvemos:
1. Para esto tenemos que crear la tabla DEMO_ROLES, e insertar los datos (vea la parte
inicial del Post).
2. Crear una función escalar la cual se encargara de verificar si las sentencias a ejecutar son
maliciosas y contienen código que pueda alterar nuestra base de datos.
USE prueba;
GO
CREATE FUNCTION [dbo].[udf_CheckForSQLInjection]
(@TSQLString varchar(max))
RETURNS BIT
AS
BEGIN
DECLARE @IsSuspect bit
-- UDF assumes string will be left padded with a single space
SET @TSQLString = ' ' + @TSQLString
IF (PATINDEX('% xp_%' , @TSQLString ) <> 0 OR
PATINDEX('% sp_%' , @TSQLString ) <> 0 OR
PATINDEX('% DROP %' , @TSQLString ) <> 0 OR
PATINDEX('% GO %' , @TSQLString ) <> 0 OR
PATINDEX('% INSERT %' , @TSQLString ) <> 0 OR
PATINDEX('% UPDATE %' , @TSQLString ) <> 0 OR
PATINDEX('% DBCC %' , @TSQLString ) <> 0 OR
PATINDEX('% SHUTDOWN %' , @TSQLString )<> 0 OR
PATINDEX('% ALTER %' , @TSQLString )<> 0 OR
PATINDEX('% CREATE %' , @TSQLString ) <> 0OR
PATINDEX('%;%' , @TSQLString )<> 0 OR
PATINDEX('% EXECUTE %' , @TSQLString )<> 0 OR
PATINDEX('% BREAK %' , @TSQLString )<> 0 OR
PATINDEX('% BEGIN %' , @TSQLString )<> 0 OR
PATINDEX('% CHECKPOINT %' , @TSQLString )<> 0 OR
PATINDEX('% BREAK %' , @TSQLString )<> 0 OR
PATINDEX('% COMMIT %' , @TSQLString )<> 0 OR
PATINDEX('% TRANSACTION %' , @TSQLString )<> 0 OR
PATINDEX('% CURSOR %' , @TSQLString )<> 0 OR
PATINDEX('% GRANT %' , @TSQLString )<> 0 OR
PATINDEX('% DENY %' , @TSQLString )<> 0 OR
PATINDEX('% ESCAPE %' , @TSQLString )<> 0 OR
PATINDEX('% WHILE %' , @TSQLString )<> 0 OR
PATINDEX('% OPENDATASOURCE %' , @TSQLString )<> 0 OR
PATINDEX('% OPENQUERY %' , @TSQLString )<> 0 OR
PATINDEX('% OPENROWSET %' , @TSQLString )<> 0 OR
PATINDEX('% EXEC %' , @TSQLString )<> 0)
BEGIN
SELECT @IsSuspect = 1
END
ELSE
BEGIN
SELECT @IsSuspect = 0
END
RETURN (@IsSuspect)
END;
GO
3. Ejecutando las sentencias TSQL con la ayuda de la función para verificar la inyección de
código.
DECLARE @SQLtext nvarchar(350);
SET @SQLtext = N'SELECT * FROM dbo.DEMO_ROLES' + ';DROP TABLE
dbo.DEMO_ROLES';
IF dbo.udf_CheckForSQLInjection(@SQLtext) = 1
BEGIN
PRINT ('Advertencia: El código es sospecho de contener código
malicioso (TSQL Inyection).')
END
ELSE
BEGIN
EXEC sp_executesql @SQLtext;
END
Resultado 1 con inyección de código:
Resultado 2 sin inyección de código:
Pueden hacer la modificaciones que crean necesarias a la función de inyección de código,
ya que el funcionamiento y validación depende de las necesidades que deseemos cubrir.
Bueno amigos me despido y con gusto espero comentarios, por favor apóyenme
votando por mi blog en http://blogit.ms en la categoría de SQL Server.
Etiquetas de Technorati: TSQL Injection,Inyección de código SQL,SQL
Comentarios : Deja un Comentario »
Etiquetas: Inyección de código SQL, SQL, TSQL Injection
Categorías : SQL
[SQL] Cifrando un Procedimiento almacenado en MS
SQL Server 2008
29 05 2009
Saludos amigos, he preparado un breve ejemplo de como Cifrar “Encriptar” un
procedimiento almacenado desde MS SQL Server 2008.
Para empezar crearemos un procedimiento almacenado básico, este procedimiento ejecutara
una consulta a una tabla llamada “DEMO_USUARIOS” de la base de datos “PRUEBA”.
1.Insertando los datos:
USE prueba;
GO
INSERT INTO DEMO_USUARIOS VALUES
('Ivan','Ragel','[email protected]','trew',GETDATE()),
('Claudia','Pérez','[email protected]','456789',GETDATE()),
('Mariana','Ragel','[email protected]','123456',GETDATE()),
('Noriga','Rojas','[email protected]','963852',GETDATE()),
('Pedro','Infante','[email protected]','789456',GETDATE());
GO
SELECT * FROM DEMO_USUARIOS;
GO
Resultado:
2. Transformando la consulta a Procedimiento Almacenado básico:
--Creando el Procediemiento almacenado.
CREATE PROCEDURE dbo.ObteniendoUsuariosDemo
AS
SELECT * FROM DEMO_USUARIOS ORDER BY nombre,apellidos
GO
--Ejecutando el Procedimiento almacenado.
EXEC dbo.ObteniendoUsuariosDemo;
GO
--Mostrando la definición del Procedimiento almacenado.
EXEC sp_helptext ObteniendoUsuariosDemo;
GO
En el batch de T-SQL anterior podemos observar que:
a. Estamos creando un procedimiento almacenado.
b. Ejecutando el procedimiento almacenado.
c. Mostrando la definición del procedimiento almacenado.
Ahora vamos a CIFRAR (Encriptar) el procedimiento almacenado aplicando un ALTER
PROCEDURE en combinación con la clausula WITH ENCRYPTION como se muestra
en el siguiente ejemplo:
ALTER PROCEDURE dbo.ObteniendoUsuariosDemo
WITH ENCRYPTION
AS
SELECT * FROM DEMO_USUARIOS ORDER BY nombre,apellidos
GO
d. Modificando el procedimiento almacenado para el cifrado de seguridad.
Es importante mencionar que al aplicar “WITH ENCRYPTION” no podrá tener acceso a
la definición del procedimiento almacenado, ni podrá modificar al código del mismo, así
que cuando aplique el cifrado debe de estar completamente seguro de tener guardado el
código con el que creo dicho procedimiento almacenado.
e. Ejecutando el procedimiento almacenado CIFRADO (funciona de manera similar al
creado de manera no cifrada).
f. Consultando la definición del procedimiento almacenado cifrado.
g. Tratando de modificar el procedimiento cifrado.
Bueno, espero les sea de ayuda, espero sus comentarios, dudas o sugerencias, por favor
apóyenme botando por mi blog en la categoría de SQL Server en www.blogit.ms
Etiquetas de Technorati: WITH ENCRYPTION,CIFRADO DE SP,SQL,Procedimiento
almacenados
Comentarios : 12 Comentarios »
Etiquetas: CIFRADO DE SP, Procedimiento almacenados, SQL, WITH ENCRYPTION
Categorías : SQL
[SQL] Creando un resumen de las Tablas de una Base de
Datos en SQL 2008/2005.
26 05 2009
Saludos amigos en esta ocasión he elaborado un pequeño script en T-SQL 2008 el cual
obtiene un Resumen de la estructura de las tablas de una base de datos. Todo esto consiste
en consultar las siguientes 3 tablas de sistema:
sys.tables sys.columns sys.types
La tabla sys.tables contiene todas las tablas de una base de datos.
La tabla sys.columns contiene todas la columnas que se encuentran en una tabla con
información como el el orden de la columna, tipo de dato, si se le puede asignar un valor
nulo o no, si es una columna de identidad, etc.
La tabla sys.types contiene los tipos de datos que utilizamos al crear las columnas de una
tabla en una base de datos como son: Varchar, Char, Int, Bigint, Bit, datetime, etc.
La consulta:
USE prueba;
GO
SELECT t.name AS Tabla, t.type_desc AS TipoTabla , c.column_id AS Orden,
c.name AS Columna, tp.name AS TipoDato,
c.max_length AS Longitud,
(CASE c.is_nullable WHEN 1 THEN 'Sí'
WHEN 0 THEN 'No'
END) AS ValorNulo,
(CASE c.is_identity WHEN 1 THEN 'Sí'
WHEN 0 THEN 'No'
END) AS LlavePrimaria
FROM sys.tables t
INNER JOIN sys.columns c ON t.object_id = c.object_id
INNER JOIN sys.types tp ON c.system_type_id = tp.system_type_id
ORDER BY t.name, c.column_id
Etiquetas de Technorati: SQL 2008,SQL 2005. Tablas de Systema de base de
datos,Columnas de BD,Tipos de columna,resumen de una BD
Ahora vean el resultado de la consulta anterior y la estructura de la tabla desde el
explorador de objetos.
espero les sea de ayuda, a la hora de elaborar un resumen de una base de datos o algo que
les pida su jefe , con gusto espero sus cometarios.
Comentarios : 2 Comentarios »
Etiquetas: Columnas de BD, resumen de una BD, SQL 2005. Tablas de Systema de base de
datos, SQL 2008, Tipos de columna
Categorías : SQL
[SQL] Como planear un Procedimiento almacenado en
SQL Server 2008 (Creación y ejecución).
26 05 2009
Saludos amigos, no se si sea realmente el nombre correcto para este post, le idea es que a
partir de una sentencia SQL (Select, Insert, Update, Delete, Etc) puedan lograr parametrizar
la consulta y posteriormente elaborar su procedimiento almacenado.
Paso 1. Sentencia SQL a ejecutar.
USE prueba;
GO
INSERT INTO dbo.DEMO_PRODUCTO (nombre, precio, descripcion, fecha)
VALUES('Whisky', 275.50,'12 Años de añejamiento, promoción
2x1',GETDATE());
GO
SELECT TOP 1 * FROM dbo.DEMO_PRODUCTO ORDER BY id DESC;
GO
Nota: deben de asegurarse que la sentencia SQL que ejecuten se realice correctamente.
Paso 2. Parametrizar la Sentencia SQL.
Por cada uno de los campos que se requieren al insertar (para el caso de este ejemplo),
deben de convertirse en variables T-SQL con el tipo de dato correspondiente, asignarles el
valor del campo a Insertar y sustituirlos en la sentencia SQL.
USE prueba;
GO
DECLARE @producto varchar(100),
@precio smallmoney,
@descripcion varchar(750);
SET @producto = 'Agua mineral';
SET @precio = 12.50;
SET @descripcion = 'Agua mineral de 2 litros';
INSERT INTO dbo.DEMO_PRODUCTO (nombre, precio, descripcion, fecha)
VALUES(@producto, @precio,@descripcion,GETDATE());
GO
SELECT TOP 2 * FROM dbo.DEMO_PRODUCTO ORDER BY id DESC;
GO
Paso 3. Convertir el Bacth T-SQL a Procedimiento almacenado.
Ya que tenemos la sentencia parametrizada, el paso final es convertirla en procedimiento
almacenado, para esto tenemos que agregar la estructura de un “STORE PROCEDURE –
SP” de SQL Server 2008 como lo muestra el siguiente ejemplo:
CREATE PROCEDURE <Procedure_Name, sysname, Procedure_Name>
<@param1, sysname, @p1> <datatype_for_param1, , int> =
<default_value_for_param1, , 0>,
<@param2, sysname, @p2> <datatype_for_param2, , int> =
<default_value_for_param2, , 0>
AS
<Instrucciones T-SQL (Insert, Select, Update, Delete, ETC)>
GO
La primera parte es asignarle un nombre al SP.
La Segunda parte es crear los parámetros que recibirá el SP.
Como tercera parte es crear el Batch de T-SQL que se ejecutara al llamar a nuestro SP.
Ejemplo:
El código:
CREATE PROCEDURE InsertaProductoSP
@producto varchar(100),
@precio smallmoney,
@descripcion varchar(750)
AS
INSERT INTO dbo.DEMO_PRODUCTO (nombre, precio, descripcion, fecha)
VALUES(@producto, @precio,@descripcion,GETDATE());
GO
La ejecución:
USE prueba;
GO
EXEC InsertaProductoSP 'Hielos', 12.90, 'Bolsa de hielos de 3 kilos';
GO
SELECT TOP 3 * FROM dbo.DEMO_PRODUCTO ORDER BY id DESC;
GO
Resultado:
Espero les sea de ayuda, para algunos usuarios el ejemplo les puede parecer sumamente
sencillo (y lo es), pero también creo que a los usuarios que inician los ubicara un poco más
de como desarrollar en Transact SQL 2008, espero sus comentarios.
Etiquetas de Technorati: Store Procedure,SQL 2008,Crear Procedieminto
almacenado,SQL,EXEC SP
Comentarios : 10 Comentarios »
Etiquetas: Crear Procedieminto almacenado, EXEC SP, SQL, SQL 2008, Store Procedure
Categorías : SQL
[ASP .NET] Creando una WebSlice con datos de una BD
y un Repeater SQL 2008
15 05 2009
Saludos amigos, una novedad de ASP .Net en conjunto con Internet Explorer 8, es que nos
permite crear Web Slice, que son pequeños extractos con información de páginas Web, las
cuales podemos agregar a nuestra Barra de favoritos de Internet Explorer 8. A
continuación les dejo un ejemplo de la creación de una Web Slice, la cual se llena con
información de una base de datos en SQL Server 2008 a través de un objeto Repeater.
Nota: Debe configurar la cadena de conexión a la base de datos, vea la entrada anterior:
http://sqlpsykrest.wordpress.com/2009/05/14/vs-2008asp-net-crear-una-cadena-de-conexin-
en-asp-net-y-ejecutar-un-comando-a-una-bd-de-sql-server-2008/
Paso 1, debemos agregar la Web Slice, esto consiste en insertar un DIV que tenga una
clase CSS llamada hslice y ID igual a 1.
Ejemplo:
<div class="hslice" id="1">
<p class="entry-title">Título de la Web Slice</p>
<div class="entry-content">
<!--Contenido de la Web Slice-->
</div>
</div>
Para indicar el título de la Web Slice, se debe colocar una clase CSS aplicada a un elemento
XHTML Párrafo <p> llamada “entry-title”, el contenido de la Web Slice se determina
agregando un elemento DIV con una clase CSS llamada “entry-content” dentro del DIV
principal hslice.
Paso 2, Agregaremos como contenido de la Web Slice un objeto REPEATER, el cual
selecciona datos sobre Productos de una base de datos en SQL Server 2008.
Ejemplo:
<h2>Ejemplo de WebSlice</h2>
<div class="hslice" id="1">
<p class="entry-title">WebSlice desde SqlPsyKrest Blog.</p>
<div class="entry-content">
<asp:Repeater runat="server" ID="rProductos">
<HeaderTemplate>
<table class="tabla" cellpadding="3px"
cellspacing="0" >
<tr>
<td colspan="4" class="titulo"
align="center" >Productos</td>
</tr>
</HeaderTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
<ItemTemplate>
<tr>
<td
class="nombre"><%#DataBinder.Eval(Container.DataItem, "nombre")%></td>
<td
class="precio"><%#DataBinder.Eval(Container.DataItem, "precio")%></td>
</ItemTemplate>
<AlternatingItemTemplate>
<td
class="nombre"><%#DataBinder.Eval(Container.DataItem, "nombre")%></td>
<td
class="precio"><%#DataBinder.Eval(Container.DataItem, "precio")%></td>
</tr>
</AlternatingItemTemplate>
</asp:Repeater>
</div>
</div>
El DataBinder.Eval obtiene los datos de las columnas del comando que se ejecuta en la
base da datos.
Paso3, Agreguemos en el code-behine en el evento Load del formulario Web la ejecución
del comando de la base datos, el cual obtendrá la información de los productos que se
cargaran en un objeto Repeater llamado repeatProductos que posteriormente se mostrarán
en la Web Slice.
Ejemplo:
Imports System.Web
Imports System.Web.Configuration
Imports System.Data
Imports System.Data.SqlClient
Partial Class _Default
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Me.Load
If Not Me.IsPostBack Then
Dim conn As New
SqlConnection(WebConfigurationManager.ConnectionStrings("cnx").Connection
String)
Dim comm As New SqlCommand("SELECT nombre, precio FROM
DEMO_PRODUCTO", conn)
comm.CommandType = CommandType.Text
Dim ds As DataSet = Nothing
Dim da As SqlDataAdapter = Nothing
Try
Using conn
conn.Open()
ds = New DataSet()
da = New SqlDataAdapter()
da.SelectCommand = comm
da.Fill(ds)
End Using
comm.Dispose()
Catch ex As Exception
Finally
If conn.State = ConnectionState.Open Then
conn.Close()
conn.Dispose()
End If
End Try
Me.repeatProductos.DataSource = ds
Me.repeatProductos.DataBind()
End If
End Sub
End Class
En el ejemplo anterior utilizamos un objeto Dataset y un SqlDataAdapter, los cuales
reciben la información de la base da datos y la almacenan para cargarla en el objeto
Repeater llamado repeatProductos, una vez obtenida la información, la Web Slice esta
terminada y lista para mostrando datos de los productos al usuario.
Paso 4, Agreguemos la Web Slice al Barra de favoritos de Internet Explorer 8:
Por último observen como se agrego la Web Slice a la Barra de favoritos de Internet
Explorer 8, de esta manera los usuario pueden estar viendo información especifica y
actualizada de sus sitios Web con solo dar clic en ella.
Espero les sea de ayuda, me despido de ustedes y quedo en espera de sus comentarios.
Etiquetas de Technorati: Web Slice,ASP Net y Base de datos,Repeater
Comentarios : 1 comentario
Etiquetas: ASP Net y Base de datos., Repeater, Web Slice
Categorías : ASP NET, SQL
[VS 2008–ASP NET] Crear una cadena de conexión en
ASP .NET y ejecutar un comando a una BD de SQL
Server 2008.
14 05 2009
Saludos amigos, en esta ocasión les mostrare un ejemplo de como crear una cadena de
conexión en ASP .NET con Visual Studio 2008 hacia una base de datos creada en SQL
Server 2008.
1. El primer paso es conocer la siguiente información de la base de datos y la instancia de
SQL a la cual nos vamos a conectar.
a) Nombre de la instancia.
b) Nombre de la base de datos.
c) Usuario y contraseña del usuario que tiene permisos sobre la base de datos.
Ejemplo:
Instancia: EQUIPO.
BD: prueba.
User: sa.
Pass: sasysadmin.
Nota: Si no conoces el nombre de la instancia del SQL server ejecuta el siguiente comando.
USE master;
GO
SELECT [name], data_source FROM sys.servers;
Resultado:
Nota: SI quieres ver las bases de datos que están en la instancia del SQL server ejecuta el
siguiente comando.
USE master;
GO
SELECT [name] FROM sys.databases;
Resultado:
2. Ahora creamos un nuevo sitio Web en Visual Studio 2008, en el archivo de
configuración Web ( web.config ), buscamos el elemento <connectionStrings> contenido
dentro del elemento raíz <configuration> y agregamos una cadena de conexión como lo
muestra el siguiente ejemplo:
<connectionStrings>
<add name="cnxCurso"
connectionString="Data source=EQUIPO; Initial catalog=Prueba;
User id=admIvan; Password=123456"
providerName="System.Data.SqlClient"/>
</connectionStrings>
Explico brevemente la cadena:
Deben dar un nombre a la cadena de conexión en esta caso la llamaremos CNX .
El atributo connectionString debe tener los siguientes datos:
Data source es la instancia que utilizamos en SQL Server.
Initial catalog es el nombre de la base de datos a utilizar.
User id es el nombre de usuario que se conectara a la base de datos.
Password es la contraseña del usuario de la base de datos.
Por último el providerName que es un espacio de nombres de System.Data.SqlClient.
3. Agregaremos dos cajas de texto, un botón y una etiqueta en un formulario web.
4. En el Code-Behine de nuestro formulario web agregamos los siguientes espacios de
nombres necesarios para conectarnos a las base da datos y trabajar de manera efectiva.
Nota: Para ir al code-behine debemos presionar la tecla F7 estando en el formulario Web.
Imports System.Web
Imports System.Web.Configuration
Imports System.Data
Imports System.Data.SqlClient
5. Agregar el siguiente código en el evento clic del botón del formulario web.
Protected Sub btnAceptar_Click(ByVal sender As Object, ByVal e As
System.EventArgs) Handles btnAceptar.Click
Dim idUsuario As Integer = 0
Dim msg As String = "Usuario no encontrado en la base de datos."
Dim conn As New
SqlConnection(WebConfigurationManager.ConnectionStrings("cnxCurso").Conne
ctionString)
Dim comm As New SqlCommand("SELECT id FROM dbo.PRB_Usuario WHERE
Email = @email AND [Password] = @pass", conn)
Try
With comm
.CommandType = CommandType.Text
.Parameters.AddWithValue("email", Me.txtUser.Text.Trim())
.Parameters.AddWithValue("pass", Me.txtPass.Text.Trim())
End With
Using conn
conn.Open()
With comm
idUsuario = .ExecuteScalar()
.Parameters.Clear()
.Dispose()
End With
If idUsuario > 0 Then
msg = "El usuario esta registrado en la base de
datos."
End If
End Using
Catch ex As SqlException
'Controlar excepción SQL
Catch ex As Exception
'Controlar exception
Finally
If conn.State = ConnectionState.Open Then
conn.Close()
conn.Dispose()
End If
End Try
Me.lblMsg.Text = msg
End Sub
Es importante poner atención a la hora de crear la cadena de conexión ya que el nombre
debe de ser el mismo al que se agrego en el archivo de configuración web (web.config).
El comando al crearlo lleva dos parámetros iniciales, el comando de base de base de datos (
el cual selecciona el id de nuestro usuario) , y la cadena de conexión que utilizara para
llevar acabo la ejecución.
Agregamos los parámetros que recibirá el comando para poder consultar los datos, a esto se
le llama parametrizar sentencias o comandos SQL, para evitar los ataques de inyección de
código.
Para terminar se abre la conexión, y se ejecutamos el comando SQL de manera Scalar
(ExecuteScalar), es decir que solo nos regrese el valor de la primer fila y primer columna
del conjunto de resultados obtenidos, para este caso siempre nos regresara un valor, este
valor se asigna a nuestra etiqueta que mostrara si el usuario se encuentra o no en la base de
datos.
Resultado:
Bueno amigos, espero les sea de ayuda, próximamente subiré videos.
Etiquetas de Technorati: Cadena de conexión
VS,connectionString,sqlCommand,sqlConnection,Visual Studio,Select Command ASP
Net,ASP Net y Base de datos.
Comentarios : 19 Comentarios »
Etiquetas: ASP Net y Base de datos., Cadena de conexión VS, connectionString, Select
Command ASP Net, sqlCommand, sqlConnection, Visual Studio
Categorías : ASP NET, SQL
[SQL 2008] Métodos abreviados de teclado de MSSQL
Server Management Studio.
22 04 2009
Saludos amigos en esta ocasión les dejo un documento que elabore con información del
MSDN de Microsoft referente a los métodos abreviados del teclado para el Management
Studio de SQL Server 2008. les dejo una tabla de ejemplo y el enlace para que lo puedan
descargar he implementar.
Métodos abreviados de teclado para activar menús.
Métodos abreviados de teclado para administrar ventanas y barras de herramientas.
Métodos abreviados de teclado para mover el cursor.
Métodos abreviados de teclado para seleccionar texto.
Métodos abreviados de teclado para marcadores.
Métodos abreviados de teclado para el control de árbol.
Métodos abreviados de teclado para el Editor de código.
Métodos abreviados de teclado del depurador de Transact-SQL.
Métodos abreviados de teclado para Microsoft IntelliSense.
Métodos abreviados de teclado para la ventana de documento y el explorador.
Métodos abreviados de teclado para el Explorador de soluciones.
Métodos abreviados de teclado para la Ayuda y los Libros en pantalla.
Métodos abreviados de teclado para búsquedas.
Métodos abreviados de teclado para cortar y pegar.
Métodos abreviados de teclado para el visor de registros.
Métodos abreviados de teclado para el Monitor de actividad.
Métodos abreviados de teclado para el Monitor de replicación.
Métodos abreviados de teclado para el Visor de conflictos de replicación.
Métodos abreviados de teclado para administrar ventanas y barras de herramientas.
Acción Estándar SQL Server 2000
Cerrar la ventana secundaria MDI
actual
CTRL+F4 CTRL+F4
Imprimir CTRL+P CTRL+P
Salir ALT+F4 ALT+F4
Pasar al modo de pantalla
completa
MAYÚS+ALT+ENTRAR MAYÚS+ALT+ENTRAR
Cerrar la ventana de herramientas
actual
MAYÚS+ESC MAYÚS+ESC
Desplazarse por las siguientes
ventanas secundarias MDI
CTRL+TAB CTRL+TAB
Desplazarse por las ventanas
secundarias MDI anteriores
CTRL+MAYÚS+TAB CTRL+MAYÚS+TAB
Ir a la barra de herramientas de la
ventana de herramientas actual
MAYÚS+ALT Sin equivalencia
Ir a la siguiente ventana de
herramientas
ALT+F6 ALT+F6
Ir a la ventana seleccionada
anteriormente
MAYÚS+ALT+F6 MAYÚS+ALT+F6
Abrir una nueva ventana del
Editor de consultas
Sin equivalencia CTRL+O
Mostrar el Explorador de objetos F8 F8
Mostrar Servidores registrados CTRL+ALT+G Sin equivalencia
Mostrar el Explorador de plantillas CTRL+ALT+T CTRL+ALT+T
Mostrar el Explorador de
soluciones
CTRL+ALT+L CTRL+ALT+L
Mostrar la ventana Resumen F7 F7
Mostrar la ventana Propiedades F4 F4
Mostrar el cuadro de herramientas CTRL+ALT+X CTRL+ALT+X
Mostrar la ventana Marcadores CTRL+K, CTRL+W Sin equivalencia
Mostrar la ventana del explorador CTRL+ALT+R CTRL+ALT+R
Mostrar la ventana Lista de
errores (sólo Editor de Transact-
SQL)
CRTL+\, CTRL+E CRTL+\, CTRL+E
@http://msdn.microsoft.com/es-es/library/ms174205.aspx
Aquí esta el enlace:
http://cid-
597f52750e26b4c6.skydrive.live.com/self.aspx/.Public/M%c3%a9todos%20abreviados%2
0de%20teclado%20para%20MSQL%20Server%202008.pdf
Etiquetas de Technorati: Teclas rápidas,Métodos abreviados,Hot keys,SQL 2008
Comentarios : 2 Comentarios »
Etiquetas: Hot keys, Métodos abreviados, SQL 2008, Teclas rápidas
Categorías : SQL
[SQL 2008] Libro Gratis SQL Server 2008.
21 04 2009
Saludos amigos aquí les dejo un link donde pueden descargar un e-Book de SQL server
2008, les dejo el listado de capítulos y el enlace.
Introducing Microsoft SQL Server 2008
by Peter DeBetta, Greg Low, and Mark Whitehorn
ISBN: 9780735625587
Introducing Microsoft SQL Server 2008:
Chapter 1: Security and Administration
Chapter 2: Performance
Chapter 3: Type System
Chapter 4: Programmability
Chapter 5: Storage
Chapter 6: Enhancements for High Availability
Chapter 7: Business Intelligence Enhancements
Free e-Book: http://csna01.libredigital.com/?urss1q2we6
Nota: Si no los deja descargar el libro, visualizando el libro en el explorador tecleen Ctrl+F
y les habilitara el menú de Adobe para poder guardar el libro.
Etiquetas de Technorati: SQL 2008,Libro Gratis,Free E-Book,Introducing SQL
Comentarios : 2 Comentarios »
Etiquetas: Free E-Book, Introducing SQL, Libro Gratis, SQL 2008
Categorías : SQL
[SQL 2008] Error al modificar Tablas.
3 04 2009
Saludos amigos, en esta ocasión les dejo la solución para el problema que se produce
cuando intentamos modificar una tabla en SQL 2008.
Esto sucede por que por default SQL 2008 hablita una opción que consiste en bloquear
cualquier cambio o modificación que requiera que la tabla se vuelva a crear.
La solución consiste en ir al menú Herramientas>> Opciones.
En la ventana de opciones seleccionar la opción Designers >> Diseñadores de tablas y
bases de datos. y en Opciones de tabla, debe desactivar la casilla: Impedir guardar
cambios que requieran volver a crear tablas.
Listo con eso deben de poder realizar las modificación en las tablas de se base de datos en
SQL Server 2008.
Espero les sea de ayuda, dejen comentarios.
Etiquetas de Technorati: SQL 2008,Guardar cambios en tablas,Tablas SQL
Comentarios : 5 Comentarios »
Etiquetas: Guardar cambios en tablas, SQL 2008, Tablas SQL
Categorías : SQL
[SQL 2008] Error al modificar Tablas.
3 04 2009
Saludos amigos, en esta ocasión les dejo la solución para el problema que se produce
cuando intentamos modificar una tabla en SQL 2008.
Esto sucede por que por default SQL 2008 hablita una opción que consiste en bloquear
cualquier ´cambio o modificación que requiera que la tabla de vuelva a crear.
La solución consiste en ir al menú Herramientas>> Opciones.
En la ventana de opciones seleccionar la opción Designers >> Diseñadores de tablas y
bases de datos. y en Opciones de tabla, debe desactivar la casilla: Impedir guardar
cambios que requieran volver a crear tablas.
Listo con eso deben de poder realizar las modificación en las tablas de se base de datos en
SQL Server 2008.
Espero les sea de ayuda, dejen comentarios.
Etiquetas de Technorati: SQL 2008,Guardar cambios en tablas,Tablas SQL
Comentarios : 17 Comentarios »
Etiquetas: Guardar cambios en tablas, SQL 2008, Tablas SQL
Categorías : SQL
[SQL 2008] Insertar múltiples filas con valores (Nuevo).
31 03 2009
Hola amigos, probablemente alguna vez tratamos de insertar múltiples filas en una tabla, y
lo hacíamos repitiendo el comando INSERT (copiando y pegando) y solo cambiando el
valor de las columnas. En SQL 2008 se puede hacer una múltiple inserción solo escribiendo
una vez el INSERT <TABLE> y separando por comas los grupos de valores a insertar, les
dejo el ejemplo, que en lo personal se me hace muy práctico e interesante.
1. Creamos una tabla “PRB_USUARIOS” .
CREATE TABLE dbo.PRB_USUARIOS
(Nombre VARCHAR(40),
Apellidos VARCHAR(40))
GO
2. Insertamos múltiples filas (Observe la sintaxis).
--Insertando múltiples filas con valores.
INSERT dbo.PRB_USUARIOS
VALUES ('Ivan','Rangel'),
('Cruz','Treviño'),
('Pepe','El toro'),
('María','Félix'),
('Mario','Cantinflas'),
('Pedro','Infante')
Observe que en el comando INSERT:
a. No aparece INTO, ya no es necesario en SQL 2008 (es opcional).
b. No se repite INSERT, solo se escribe una vez al igual que VALUES.
c. Por cada conjunto de valores a insertar tiene que separarlos por coma.
3. Ahora seleccionamos los datos insertados.
SELECT * FROM dbo.PRB_USUARIOS
Me despido y espero les sea de ayuda, dejen comentarios.
Etiquetas de Technorati: SQL 2008,Insert,Múltiple insert.
Comentarios : 12 Comentarios »
Etiquetas: INSERT, Múltiple insert., SQL 2008
Categorías : SQL
[SQL 2008] Actualización de columnas con tipo de
valor largo.
27 03 2009
Saludos, me encontré con una nueva funcionalidad en SQL 2008, esta es la implementación
del comando UPDATE con la clausula .WRITE, para tipo de datos con VALOR-
LARGO, Cabe mencionar que la inserción de tipos de datos de valor-largo es la misma que
en otras versiones de SQL server; Ahora SQL Server 2008 para la actualización de estos
tipos de datos incluye el método .WRITE.
Sintaxis:
UPDATE <table_or_view_name>
SET column_name = .WRITE ( expression , @Offset , @Length )
FROM <table_source>
WHERE <search_condition>
Parámetros del método .WRITE:
Argumento Descripción
expresión La expresión define el fragmento de texto
que se coloca en la columna.
@offset @Offset determina la posición inicial de los
datos existentes en donde el nuevo texto
debe ser colocado. Si @Offset es NULL,
significa que la nueva expresión se añadirá
al final de la columna (omitiendo también el
segundo parámetro @length).
@length @length determina la longitud de la sección
de la superposición.
Para que esto quede claro crearemos una tabla la cual tenga un campo de tipo de valor-largo
y posteriormente actualizaremos el valor.
1. Creando la tabla:
CREATE TABLE dbo.PRB_Articulo
(ArticuloID INT NOT NULL,
Contenido VARCHAR(MAX) NOT NULL)
GO
2. Insertando un valor:
INSERT dbo.PRB_Articulo (ArticuloID, Contenido)
VALUES (1, 'El sqlPsyKrest Blog, Es un blog de apoyo a las personas
interesadas en
el aprendizaje de SQL con el fin de aumentar y compartir los
conocimientos
con todos ustedes, atte. su amigo autor.' )
GO
3.Seleccionamos este primer valor del campo “Contenido”:
4. Actualicemos agregando más texto al final del campo “Contenido” utilizando el método
.WRITE:
UPDATE dbo.PRB_Articulo
SET Contenido .WRITE (' Como ven ahora podemos agregar más lineas a
nuestros textos largos con una simple
actualización, interesante ¿no creen?',
NULL, NULL)
WHERE ArticuloID = 1
GO
5. Seleccionamos el campo “Contenido” y veamos que la parte marcada en amarillo es la
que se actualizo y se añadió al final del texto.
6. Ahora vamos a reemplazar la palabra autor la cual esta en el texto de la columna
“Contenido”, se sustituirá por mi nombre: Iván Rangel Cuadros.
UPDATE dbo.PRB_Articulo
SET Contenido .WRITE('Iván Rangel Cuadros', 182, 5)
WHERE ArticuloID = 1
GO
7. Mostramos el resultado final de la sustitución por medio de la actualización con el
método .WRITE.
Espero les sea de ayuda, dejen comentarios.
Etiquetas de Technorati: SQL 2008,Método WRITE,UPDATE – WRITE,Clausula
WRITE,Valores Largos SQL
Comentarios : Deja un Comentario »
Etiquetas: Clausula WRITE, Método WRITE, SQL 2008, UPDATE - WRITE, Valores
Largos SQL
Categorías : SQL
[SQL 2008] Crear una lista delimitada por comas
usando SELECT.
26 03 2009
Saludos amigos, una ventaja de SQL 2008 es que nos permite hacer el uso de una
sobrecarga del operador “=”, para poder asignar múltiples valores a una variable
TSQL como:
SELECT @Var = @Var
La instrucción anterior en SQL 2005 no marca error pero solo nos guarda el ultimo valor
asignado. Les dejo un ejemplo que aseguro que a muchos nos será de gran utilidad.
Ha!!! se me olvidaba que en SQL 2008 podemos asignar un valor directo a una variable
cuando la declaramos ahorrándonos el SET.
DECLARE @txt AS VARCHAR(250) = ”
También es necesario mencionar que inicializamos la variable con un valor vacío ya que no
es correcto concatenar valores NULL a una cadena.
1. Creamos la tabla de ejemplo.
CREATE TABLE dbo.PRB_USUARIOS
(Nombre VARCHAR(40),
Apellidos VARCHAR(40))
GO
2. Insertamos algunos datos.
INSERT INTO dbo.PRB_USUARIOS VALUES ('Ivan','Rangel')
INSERT INTO dbo.PRB_USUARIOS VALUES ('Claudia','Perez')
INSERT INTO dbo.PRB_USUARIOS VALUES ('Maria','Cuadros')
INSERT INTO dbo.PRB_USUARIOS VALUES ('Mariana','Rangel')
INSERT INTO dbo.PRB_USUARIOS VALUES ('Mario','Cantinflas')
INSERT INTO dbo.PRB_USUARIOS VALUES ('Pedro','Infante')
GO
3. Ejecutamos la consulta de concatenación (Muy fácil ).
DECLARE @txt AS VARCHAR(250) = ''
SELECT @txt = @txt + Nombre + ' ' + Apellidos + ', ' FROM
dbo.PRB_USUARIOS
SELECT @txt AS txtConcatenado
GO
Y nos da el siguiente resultado.
Espero les sea de ayuda, dejen comentarios!!!.
Etiquetas de Technorati: SQL 2008,Concatenar String SQL,Texto separado por
comas,SELECT para concatenar
Comentarios : 5 Comentarios »
Etiquetas: Concatenar String SQL, SELECT para concatenar, SQL 2008, Texto separado por
comas
Categorías : SQL
[SQL(2005/2008)-UNPIVOT] Normalización de Datos
con UNPIVOT.
26 03 2009
Saludos nuevamente amigos, leyendo nuevamente sobre TSQL, me encontré el tema de
Normalización de datos con la clausula UNPIVOT.
El comando UNPIVOT hace lo contrario de PIVOT cambiando columnas en filas,
utilizando la misma sintaxis que PIVOT.
Nota: Este ejemplo funciona en SQL 2008 y 2005.
Este ejemplo demuestra cómo UNPIVOT se puede utilizar para eliminar la repetición de
grupos de columna, a menudo visto en tablas no normalizadas.
1. Creamos una tabla no normalizada con la repetición de la columna de Idioma:
CREATE TABLE dbo.TraductorIdioma
(IdTraductor INT NOT NULL,
Idioma1 VARCHAR(50),
Idioma2 VARCHAR(50),
Idioma3 VARCHAR(50))
GO
2. Insertamos datos en la tabla.
INSERT dbo.TraductorIdioma(IdTraductor, Idioma1, Idioma2, Idioma3)
VALUES( 1, 'Español', 'Inglés', 'Alemán')
INSERT dbo.TraductorIdioma(IdTraductor, Idioma1, Idioma2, Idioma3)
VALUES( 2, 'Español', 'Portugués', 'Francés')
INSERT dbo.TraductorIdioma(IdTraductor, Idioma1, Idioma2, Idioma3)
VALUES( 3, 'Español', NULL, NULL)
GO
3. Realizamos un SELECT normal (Resultado no normalizado).
4. Por último aplicamos un UNPIVOT para normalizar la información en nuestro
SELECT.
SELECT IdTraductor,
TipoIdioma,
Idioma
FROM
(SELECT IdTraductor, Idioma1, Idioma2, Idioma3
FROM dbo.TraductorIdioma) c
UNPIVOT
(Idioma FOR TipoIdioma IN ([Idioma1], [Idioma2], [Idioma3])
) AS p
Resultado (Normalizado).
Espero les sea de ayuda, dejen comentarios.
Etiquetas de Technorati: SQL 2005,SQL 2008,UNPIVOT
Comentarios : 4 Comentarios »
Etiquetas: SQL 2005, SQL 2008, UNPIVOT
Categorías : SQL
[SQL-Select] Porque no utilizar SELECT *.
25 03 2009
Saludos amigos leyendo un libro de SQL 2008, me encontré con un párrafo muy interesante
que creo les será de ayuda a las personas que empiezan con el desarrollo en TSQL,
considero que no importa si es SQL 2000, 2005 o 2008.
El símbolo asterisco (*) devuelve todas las columnas para cada fila de tabla o vista en la
que se consulta.
Recordemos que, como buena práctica, es mejor hacer referencia explícita a las columnas
que deseemos recuperar en lugar de utilizar “SELECT *”.
Referencia explícita.
SELECT Id, Nombre, Apellidos FROM PRB_Usuario
Si desarrolla una aplicación que usa “SELECT *”, la aplicación pueden esperar las mismas
columnas (en el mismo orden) de la consulta. Si más adelante se agrega una nueva columna
a la tabla o vista, o si se reordenan las columnas de la tabla, se puede romper el llamando
a la aplicación, ya que la nueva columna puede provocar un resultado inesperado.
Usar “SELECT *” también puede repercutir negativamente en:
1. El rendimiento, ya que la consulta puede devolver más datos de los que se
necesitan.
2. El aumento del tamaño del conjunto de resultados y operaciones de recuperación de
datos en la instancia de SQL Server.
3. Para aplicaciones que requieren miles de transacciones por segundo, el número de
columnas devueltas en el resultado puede tener un fuerte impacto.
En resumen use mejor: SELECT campo1, campo2, campo3 FROM TUTABLA
Evite usar: SELECT * FROM TUTABLA.
Espero les sea de ayuda, dejen comentarios.
Etiquetas de Technorati: SQL,Select *
Comentarios : 2 Comentarios »
Etiquetas: SELECT, SQL
Categorías : SQL
[SQL CREATE] CREAR DATABASE-LOGIN-USER.
25 03 2009
Saludos amigos, a veces al estar administrando bases de datos o crear nuevas realizamos
tareas repetitivas, les comparto un script el cual nos crea una Base de Datos, pero eso no es
todo también se creara un Inicio de sesión (Login) y un usuario (User) en la base de datos
que se cree, todo esto para no estar usando los Wizard y perder un poco de tiempo, no se
tardan ni 2 minutos .
Aun no existe la BD:
Ejecutamos el Script:
USE master
GO
--Si existe la BD la eliminamos.
IF EXISTS( SELECT Name FROM sys.sysdatabases WHERE Name = 'BDPrueba' )
DROP DATABASE BDPrueba
GO
--Creando la BD.
CREATE DATABASE BDPrueba
GO
--Si existe el Inicio de sesión lo eliminamos.
IF EXISTS( SELECT name FROM sys.syslogins WHERE name = 'UserPrueba' )
DROP LOGIN UserPrueba
GO
--Creando el inicio de sesión.
CREATE LOGIN UserPrueba
WITH PASSWORD = '987654',
CHECK_POLICY = OFF,
CHECK_EXPIRATION = OFF
GO
--Usamos la BD que creamos 'BDPrueba'
USE BDPrueba
GO
--Creamos el usuario a la BD, el usuario debe de ir asociado a un inicio
de sesión.
CREATE USER UserPrueba
FOR LOGIN UserPrueba
GO
--Le agregamos un Rol al Usuario.
sp_addrolemember 'db_owner', 'UserPrueba'
GO
--Ahora ya pueden conectarse a la BD con la sesión creada y hacer lo que
quieran!!!.
Ahora ya existe la BD:
Solo nos queda conectarnos con el Inicio de sesión que creamos:
Listo, espero les sea de ayuda, dejen comentarios!.
Etiquetas de Technorati: CREATE DATABASE,CREATE LOGIN,CREATE USER,SQL
2005.
Comentarios : 1 comentario
Etiquetas: CREATE DATABASE, CREATE LOGIN, CREATE USER, SQL 2005
Categorías : SQL
[SQL-LOG] – Reducir el LOG de una Base de Datos.
23 03 2009
Saludos amigos después de un tiempo de no postear nada, les dejo un script que reduce el
log de una base de datos.
Supongamos que el siguiente archivo LOG pesa demasiado y lo queremos reducir.
Como primer paso y previniendo cualquier error que se pueda generar durante la ejecución
de la reducción del LOG tendremos que hacer un respaldo de la BD.
USE master
GO
BACKUP DATABASE prueba
TO DISK = N'C:\RespaldosBD\Prueba_Full.BAK'
GO
BEGIN TRY
DECLARE @backupSetId AS INT
SELECT @backupSetId = position
FROM msdb..backupset
WHERE database_name=N'Prueba'
AND backup_set_id=(SELECT MAX(backup_set_id)
FROM msdb..backupset
WHERE database_name=N'Prueba' )
IF @backupSetId IS NULL
BEGIN
RAISERROR(N'Fallo la verificación. La información de reapaldo para
la base de datos, no se encontro.', 16, 1)
END
RESTORE VERIFYONLY
FROM DISK = N'C:\RespaldosBD\Prueba_Full.BAK'
WITH FILE = @backupSetId
PRINT 'La verificación se realizo correctamente, el respaldo de la
base de datos esta listo para utilizarse.'
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE()
PRINT ERROR_LINE()
PRINT ERROR_NUMBER()
END CATCH
GO
Si todo salió bien tendremos nuestro respaldo en la ubicación indicada en el script anterior.
Ahora, respaldamos el archivo de LOG y le aplicamos un SHRINKFILE.
El SHRINKFILE Reduce el tamaño del archivo de datos o de registro para la base de
datos actual, o vacía un archivo moviendo los datos del archivo especificado a otros
archivos del mismo grupo de archivos, permitiendo quitar el archivo de la base de datos.
Puede reducir un archivo a un tamaño menor que el tamaño especificado cuando se creó.
Así se restablece el tamaño mínimo de archivo al valor nuevo.
@http://msdn.microsoft.com/es-es/library/ms189493.aspx
El CHECKPOINT Escribe en disco todas las páginas desfasadas de la base de datos
actual. Las páginas desfasadas son páginas de datos que se han incluido en el caché la
memoria y se han modificado, pero todavía no se han guardado en el disco. Los puntos de
comprobación permiten ahorrar tiempo en una recuperación posterior al crear un punto en
el que se garantiza que todas las páginas desfasadas se hayan escrito en el disco.
El script final:
USE Prueba
CHECKPOINT
BACKUP LOG Prueba TO DISK = 'C:\RespaldosBD\Prueba_Log.trn'
DBCC SHRINKFILE (N'Prueba_Log' , 0, TRUNCATEONLY)
GO
Si todo se ejecuto correctamente tendremos el archivo LOG reducido „”Truncado” (para
este caso).
Resultado:
Me hubiera gustado hacer el ejemplo con LOG más grande, pero al momento solo cuento
con este, aun así debe funcionar de la misma manera.
Nota: Me paso que al ejecutar el SHRINKFILE a una base de datos desde un acceso
remoto, me decía que el archivo LOG no existía aunque físicamente ahí estuviera, después
de probar un rato, logre que funcionara, en lugar de utilizar el nombre del archivo LOG,
utilice el file_id y listo todo se resolvió.
¿Como saber el File_id?
Si ejecutamos el siguiente query obtendremos los siguientes resultados.
USE Prueba
SELECT * FROM SYS.DATABASE_FILES
Ahora que ya sabes el file_id lo usamos en el SHRINKFILE:
USE Prueba
CHECKPOINT
BACKUP LOG Prueba TO DISK = 'C:\RespaldosBD\Prueba_Log.trn'
DBCC SHRINKFILE (2 , 0, TRUNCATEONLY)
GO
Listo, con eso se debe reducir el archivo LOG de una BD.
Espero les sea de ayuda, espero comentarios!!!.
Etiquetas de Technorati: SQL,SHRINKFILE,CHECKPOINT,SQL LOG,REDUCIR
LOG,TRUNCATE LOG
Comentarios : 11 Comentarios »
Etiquetas: CHECKPOINT, REDUCIR LOG, SHRINKFILE, SQL, SQL LOG, TRUNCATE
LOG
Categorías : SQL
[SQL RANDOM] RAND() Generar cadenas aleatorias.
25 02 2009
Saludos nuevamente amigos, supongo que en varias ocasiones han intentado generar
cadenas aleatorias en SQL, ya sea que contengan caracteres, números o ambos, bueno pues
me encontré algunos ejemplos de como hacer una función en SQL para lograr nuestro
objetivo de la forma más eficiente.
Les dejo un script de una función escalar la cual recibe dos parámetros, uno para el tamaño
de la cadena aleatoria y el segundo para seleccionar si se requieren números, letras o
ambos.
Vale la pena comentarles que se requiere crear una vista “VIEW” para poder hacer uso de
la función RAND(), ya que no es valido su uso dentro de una función escalar, si lo intentan
hacer las marcara el siguiente error.
Para que no suceda esto crearemos una vista:
CREATE VIEW vwRandom
AS
SELECT RAND() as Rnd
GO
Aquí esta el script de la función (vean la parte donde se utiliza la vista vwRandom para no
generar un error):
CREATE FUNCTION fnCustomPass
(
@size AS INT, --Tamaño de la cadena aleatoria
@op AS VARCHAR(2) --Opción para letras(ABC..), numeros(123...) o
ambos.
)
RETURNS VARCHAR(62)
AS
BEGIN
DECLARE @chars AS VARCHAR(52),
@numbers AS VARCHAR(10),
@strChars AS VARCHAR(62),
@strPass AS VARCHAR(62),
@index AS INT,
@cont AS INT
SET @strPass = ''
SET @strChars = ''
SET @chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
SET @numbers = '0123456789'
SET @strChars = CASE @op WHEN 'C' THEN @chars --Letras
WHEN 'N' THEN @numbers --Números
WHEN 'CN' THEN @chars + @numbers --Ambos (Letras
y Números)
ELSE '------'
END
SET @cont = 0
WHILE @cont < @size
BEGIN
SET @index = ceiling( ( SELECT rnd FROM vwRandom ) *
(len(@strChars)))--Uso de la vista para el Rand() y no generar error.
SET @strPass = @strPass + substring(@strChars, @index, 1)
SET @cont = @cont + 1
END
RETURN @strPass
END
GO
Ahora solo nos falta ejecutar la función y ver cuales son los resultados que nos genera:
SELECT dbo.fnCustomPass(15,'C') AS 'Cadena aleatoria','Solo Letras' AS
Contiene --Cadena aleatoria que contiene Letras.
UNION ALL
SELECT dbo.fnCustomPass(15,'N'),'Solo Números' --Cadena aleatoria que
contiene Números.
UNION ALL
SELECT dbo.fnCustomPass(15,'CN'), 'Letras y Números'--Cadena aleatoria
que contiene Letras y Números.
Resultado:
Espero les sea de ayuda, dejen comentarios o escriban si necesitan ayuda sobre algún tema.
Etiquetas de Technorati: SQL RAND(),RAND Function,Función Rand SQL 2005,Cadenas
aleatorias SQL
Comentarios : 2 Comentarios »
Etiquetas: Cadenas aleatorias SQL, Función Rand SQL 2005, RAND Function, SQL RAND()
Categorías : SQL
[SQL DATE FUNCTIONS] DATENAME
24 02 2009
Saludos amigos ya que estoy recordando lo de las fechas aquí les dejo otro ejemplo de
función para el manejo de fechas con DATENAME.
Con esta función podemos obtener el nombre de ciertas partes que forman una fecha, como
lo son el mes, el día de la semana, etc.
Sintaxis: DATENAME ( datepart ,date ).
Consulta:
--DATENAME ( datepart , date )
DECLARE @fecha AS DATETIME
SET @fecha = '24/02/2009 09:19:04.267'
SELECT DATENAME(day, @fecha) AS 'nombreFecha', 'Día' AS 'Parte'
UNION ALL
SELECT DATENAME(month, @fecha),'Mes'
UNION ALL
SELECT DATENAME(year, @fecha),'Año'
UNION ALL
SELECT DATENAME(dayofyear, @fecha),'Día del año'
UNION ALL
SELECT DATENAME(week, @fecha),'Semana'
UNION ALL
SELECT DATENAME(weekday, @fecha),'Día de la semana'
UNION ALL
SELECT DATENAME(hour, @fecha),'Hora'
UNION ALL
SELECT DATENAME(minute, @fecha),'Minuto'
UNION ALL
SELECT DATENAME(second, @fecha),'Segundo'
UNION ALL
SELECT DATENAME(millisecond, @fecha),'Milisegundo'
Resultado:
les dejo otro ejemplo usando la función DATENAME:
SELECT 'Hoy es ' + DATENAME(weekday, GETDATE()) + ' ' +
DATENAME(day, GETDATE()) + ' de ' +
DATENAME(month, GETDATE()) + ' ' + DATENAME(year, GETDATE())
La consulta anterior da como resultado:
Les dejo una tabla con abreviaturas para hacer referencia a las partes de la fecha con
DATENAME.
Parte de la fecha Abreviaturas
year yy, yyyy
quarter qq, q
month mm, m
dayofyear dy, y
day dd, d
week wk, ww
weekday dw
hour hh
minute mi, n
second ss, s
millisecond ms
@http://msdn.microsoft.com/es-es/library/ms174395(SQL.90).aspx
Espero les sirva, dejen comentarios!!!.
Etiquetas de Technorati: SQL DATE,Fechas SQL,DATENAME,Funciones de fecha
SQL,date functions.
Comentarios : Deja un Comentario »
Etiquetas: date functions, DATENAME, Fechas SQL, funciones de fecha SQL, SQL DATE
Categorías : SQL
[SQL DATE FUNCTIONS] DATEPART.
24 02 2009
Saludos amigos en esta ocasión les traigo un ejemplo del manejo de fecha con la función
DATEPART de SQL 2005, con la cual podemos obtener el día, mes, año, día de la semana,
día del año, horas, minutos, segundos, etc.
A continuación les dejo una consulta con la cual podrán ver el resultado de la ejecución de
DATEPART.
Sintaxis: DATEPART ( datepart , date ).
Consulta:
--DATEPART ( datepart , date )
DECLARE @fecha AS DATETIME
SET @fecha = '24/02/2009 09:19:04.267'
SELECT DATEPART(day, @fecha) AS 'datepart SQL', 'día' AS '#'
UNION ALL
SELECT DATEPART(month, @fecha) ,'mes'
UNION ALL
SELECT DATEPART(year, @fecha) ,'año'
UNION ALL
SELECT DATEPART(hour, @fecha) ,'horas'
UNION ALL
SELECT DATEPART(minute, @fecha) ,'minutos'
UNION ALL
SELECT DATEPART(second, @fecha) ,'segundos'
UNION ALL
SELECT DATEPART(millisecond, @fecha) ,'milisegundos'
UNION ALL
SELECT DATEPART(dayofyear, @fecha) ,'día del año'
UNION ALL
SELECT DATEPART(week, @fecha) ,'semana'
UNION ALL
SELECT DATEPART(weekday, @fecha) ,'día de la semana'
Resultado:
Por último les dejo una tabla con abreviaturas para hacer referencia a las partes de fecha.
Columna1 Columna2
Parte de la fecha Abreviaturas
year yy, yyyy
quarter qq, q
month mm, m
dayofyear dy, y
day dd, d
week wk, ww
weekday dw
hour hh
minute mi, n
second ss, s
millisecond ms
@http://msdn.microsoft.com/es-es/library/ms174420(SQL.90).aspx
Espero les sirva, dejen comentarios!!!
Etiquetas de Technorati: SQL DATE,SQL,date functions,datepart,funciones de fecha SQL
Comentarios : 1 comentario
Etiquetas: date functions, datepart, funciones de fecha SQL, SQL, SQL DATE
Categorías : SQL
[SQL] CIFRAR(encriptar) / DECIFRAR(desencriptar)
Campos en SQL2005
17 02 2009
Saludos amigos, en esta ocasión prepare un ejemplo de como en cifrar un campo en una
tabla en SQL 2005. Para hacer esto es usando la función:
ENCRYPTBYPASSPHRASE: Para cifrar y
DECRYPTBYPASSPHRASE: Para descifrar.
Como primer paso tienen que preparar el campo de la base de datos para que sea de tipo
VARBINARY.
Como segundo paso creamos una función escalar en SQL 2005 para poder colocar el valor
cifrado. Hagan clic derecho sobre la opción “Funciones con valores escalares” y
seleccionen “Nueva función con valores escalares”.
La función quedaría de la siguiente manera.
CREATE FUNCTION [dbo].[fnColocaClave]
(
@clave VARCHAR(25)
)
RETURNS VarBinary(8000)
AS
BEGIN
DECLARE @pass AS VarBinary(8000)
------------------------------------
------------------------------------
SET @pass = ENCRYPTBYPASSPHRASE('dbCurso09',@clave)--dbCurso09 es la
llave para cifrar el campo.
------------------------------------
------------------------------------
RETURN @pass
END
Ahora ejecutamos la función al insertar un nuevo campo a una tabla.
--El campo a cifrar es contrasena y se guarda el valor sqlPsyKrest.
INSERT INTO USUARIO_CUR (nombre, apellidos, email, contrasena, activo,
fecha_add)
VALUES('Ivan','Rangel','[email protected]',dbo.fnColocaClave('sqlPsyKrest'),1,
GETDATE())
Si consultamos el valor de nuestro campo seria:
SELECT id, nombre, apellidos, email, contrasena
FROM USUARIO_CUR
Resultado:
Listo ya nos devuelve el valor d nuestro campo de manera cifrada, ahora el siguiente paso
es crear la función para leer el campo cifrado.
CREATE FUNCTION fnLeeClave
(
@clave VARBINARY(8000)
)
RETURNS VARCHAR(25)
AS
BEGIN
DECLARE @pass AS VARCHAR(25)
------------------------------------
------------------------------------
--Se descifra el campo aplicandole la misma llave con la que se cifro
dbCurso09
SET @pass = DECRYPTBYPASSPHRASE('dbCurso09',@clave)
------------------------------------
------------------------------------
RETURN @pass
END
GO
Por ultimo consultamos la tabla aplicándole al campo cifrado la función para leer el campo
cifrado.
SELECT id, nombre, apellidos, email, dbo.fnLeeClave(contrasena)
FROM USUARIO_CUR
Y el resultado seria el siguiente:
Espero les sea de ayuda!!!.
Apóyame votando aquí: http://blogit.ms en la categoría SQL Server.
Los pasos para votar están aquí te llevara 3 min: Clic Aquí.
Etiquetas de Technorati: ENCRYPT,DECRYPT,Encriptar,Desencriptar,Cifrar campos,SQL
2005.
Comentarios : 21 Comentarios »
Etiquetas: Cifrar campos, DECRYPT, Desencriptar, Encriptar, ENCRYPT, SQL 2005
Categorías : SQL
[SQL Dynamic] Consultas dinámicas con SQL 2005.
7 02 2009
Hola amigos, en esta ocasión colocare un ejemplo de la realización de consultas SQL de
manera dinámica, para esto utilizaremos el procedimiento almacenado de sistema
sp_executesql, el cual nos permite ejecutar cadenas de tipo cadena como comandos SQL.
Sintaxis:
EXEC sp_executesql „<Cadena de comando SQL a ejecutar>‟
El siguiente ejemplo realiza un select a una tabla de forma dinámica.
DECLARE @strSql NVARCHAR(255) --Variable de tipo cadena que almacenara el
comando SQL.
SELECT @strSql=N'SELECT * FROM dbo.USUARIO_SYS';--Asignamos la consulta a
la variable.
EXEC sp_executesql @strSql--Ejecutamos la cadena como comando
Y nos da como resultado:
Otra de la ventajas de sp_execsql es que nos permite usar parámetros en nuestras consultas:
Ahora seleccionaremos los usuarios que se encuentren con una fecha de alta entre el 7 y 9
de febrero.
DECLARE @sql nvarchar(255)
Select @sql=N'SELECT * FROM dbo.USUARIO_SYS WHERE fecha_add between @de
AND @hasta';
exec sp_executesql @sql, N'@de datetime,@hasta
datetime','07/02/2009','09/02/2009'
Resultado:
Como se dieron cuenta se omitió la primera fila ya que no cumple con el criterio de fechas
de la búsqueda, ahora ya saben que al utilizar el TSQL dinámico también pueden hacer uso
de parámetros en sus consultas.
Espero les sirva.
Etiquetas de Technorati: sp_executesql,SQL dinámico,SQL 2005,TSQL Dinámico.
Comentarios : Deja un Comentario »
Etiquetas: sp_executesql, SQL 2005, SQL dinámico, TSQL Dinámico.
Categorías : SQL
[BackUp SQL] Crear respaldos de BD con TSQL.
6 02 2009
Saludos amigos aquí les dejo un script de TSQL que sirve para realizar respaldos completos
de base de datos y posteriormente verificar que el respaldo este creado de manera correcta
para su futura implementación.
1. Script para generar el respaldo.
BACKUP DATABASE [tubasededatos]--BD que se va a respaldar.
TO DISK = N'C:\RespaldosDB\tubasededatos_full.BAK'--Ruta a donde se va a
generar el respaldo.
WITH DESCRIPTION = N'Respaldo completo de la base de datos
tubasededatos', --Descripción del respaldo.
NOFORMAT,
INIT,
NAME = N'tubasededatos_respaldo_completo', --Alias del respaldo a nivel
logico.
SKIP,
NOREWIND,
NOUNLOAD,
STATS = 10,
CHECKSUM
2. Ahora verificaremos que el respaldo se haya generado correctamente y este listo para su
utilización.
BEGIN TRY
DECLARE @backupSetId AS INT
--Seleccionamos el identificador del respaldo de la base de datos.
SELECT @backupSetId = position
FROM msdb..backupset
WHERE database_name=N'tubasededatos'
AND backup_set_id=(SELECT MAX(backup_set_id)
FROM msdb..backupset
WHERE database_name=N'tubasededatos' )
--Si no regresa ningun identificador generamos un error.
IF @backupSetId IS NULL
BEGIN
RAISERROR(N'Fallo la verificación. La información de reapaldo para
la base de datos ''tubasededatos'' no se encontro.', 16, 1)
END
--Si el identificador es valido, verificamos el respaldo creado.
RESTORE VERIFYONLY
FROM DISK = N'C:\RespaldosDB\tubasededatos_full.BAK'
WITH FILE = @backupSetId,
NOUNLOAD,
NOREWIND
PRINT 'La verificación se realizo correctamente, el respaldo de la
base de datos ''tubasededatos'' esta listo para utilizarse'
END TRY
BEGIN CATCH--En caso de error, mostramos el mensaje, línea y número de
error.
PRINT ERROR_MESSAGE()
PRINT ERROR_LINE()
PRINT ERROR_NUMBER()
END CATCH
Ya solo les queda verificar la ruta física del respaldo y listo.
Espero les sea de ayuda, dejen comentarios!!!
Etiquetas de Technorati: SQL Backup,TSQL Backup,Respaldos,Copias de seguridad.
Comentarios : 2 Comentarios »
Etiquetas: Copias de seguridad., Respaldos, SQL Backup, TSQL Backup
Categorías : SQL
[SQL] Reiniciar una llave primaria.
6 02 2009
Saludos amigos, aquí les dejo el comando para reiniciar una llave primaria en SQL 2005.
Supongamos que tenemos una tabla de la cual queremos eliminar todos los registros y que
en el próximo insert el valor de la llave primaria sea 1.
Tenemos la siguiente tabla:
Primero borramos todos los registros he inmediatamente insertamos y seleccionamos,
observen el consecutivo de la lleva primaria.
DELETE FROM dbo.USUARIO_SYS
INSERT INTO dbo.USUARIO_SYS VALUES('Ivan',
'Rangel','[email protected]','trew01', GETDATE(),GETDATE())
SELECT * FROM dbo.USUARIO_SYS
Ahora antes de ejecutar la instrucción para reiniciar la lleva primaria tenemos que eliminar
todos los registros.
DELETE FROM dbo.USUARIO_SYS --Eliminamos todos los registros.
DBCC CHECKIDENT('dbo.USUARIO_SYS', RESEED, 0)--Reinicia la lleva
primaria.
INSERT INTO dbo.USUARIO_SYS VALUES('Ivan',
'Rangel','[email protected]','trew01', GETDATE(),GETDATE())--
Insertamos
SELECT * FROM dbo.USUARIO_SYS--Seleccionemos y observemos el id
Espero les sea de ayuda.
Etiquetas de Technorati: SQL,Reiniciar llave primaria,DBCC,CHECKIDENT
Comentarios : 1 comentario
Etiquetas: CHECKIDENT, DBCC, Reiniciar llave primaria, SQL
Categorías : SQL
[SQL] Instrucciones básicas de SQL 2005.
30 01 2009
Hola amigos, en esta ocasión este post va dedicado a las personas que se inician en las
consultas de base de datos y sus operaciones básicas como lo son el INSERT, UPDATE,
DELETE y SELECT.
Colocare un ejemplo de cada instrucción:
INSERT:
INSERT INTO <TABLA> (<CAMPOS A INSERTAR>) VALUES (<VALORES A INSERTAR>)
INSERT INTO dbo.USUARIO_SYS (nombre, apellidos, email, pass, fecha_add)
VALUES
('JOSE','PEREZ','[email protected]','a47825',GETDATE() )
SELECT:
SELECT <CAMPOS> FROM <TABLA>
WHERE <CONDICIONES> ORDER BY <CRITERIOS DE ORDENACION>
SELECT id, nombre, apellidos, email, pass, fecha_add FROM dbo.USUARIO_SYS
WHERE id < 12 ORDER BY nombre, apellidos
UPDATE:
UPDATE <TABLA> SET <CAMPO N> = <VALOR>
WHERE <CONDICION DE ACTUALIZACION>
UPDATE dbo.USUARIO_SYS SET nombre = 'FLORIPONDIO', apellidos = 'MADALENO'
WHERE id = 12
DELETE:
DELETE FROM <TABLA> WHERE <CONDICION DE ELIMINACION>
DELETE FROM dbo.USUARIO_SYS WHERE id = 12
Espero les sea de ayuda, dejen comentarios!!!
Etiquetas de Technorati: INSERT,SELECT,UPDATE,DELETE,SQL OPERACIONES
BASICAS,COMANDOS SQL BASICOS,SQL,SQL 2005,INSTRUCCIONES SQL
Comentarios : 2 Comentarios »
Etiquetas: COMANDOS SQL BASICOS, DELETE, INSERT, INSTRUCCIONES SQL,
SELECT, SQL, SQL 2005, SQL OPERACIONES BASICAS, UPDATE
Categorías : SQL
[SQL Mail TSQL] Envió de correos desde SQL 2005
parte 2.
28 01 2009
Saludos nuevamente amigos, si leyeron el post anterior y todo les funciono correctamente,
les será sumamente sencillo realizar el siguiente script TSQL, lo que haremos es enviar
correos electrónicos con código TSQL desde un perfil ya configurado en el post anterior, a
continuación les coloco el código:
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'sqlPsyPerfil',--Perfil de correo configurado.
@recipients = '[email protected]', -- A quien se va enviar el
correo.
@body = 'Este correo es enviado desde SQL Server 2005 con código TSQL
por sqlPsyKrest Blog',--Cuerpo del correo.
@subject = 'Correo desde TSQL - MS SQL 2005 sqlPsyKrest.',--Asunto
del correo.
@importance = 'High' --[Low | Normal| High] Prioridad del correo.
En el script anterior se hizo uso del procedimiento almacenado de Sistema
sp_send_dbmail, su función es la de enviar mensajes de correo electrónico desde la base
de datos, para ejecutarlo este necesita una serie de parámetros, los cuales no todos son
necesarios, los que en este caso se utilizan son:
@profile_name: Perfil de correo de donde se enviara el correo.
@recipients: Destinatarios del correo uno o más.
@body: Cuerpo del correo, por default es de tipo texto.
@subject: Asunto del correo.
@importance = Prioridad del envío del correo.
Dependiendo de la carga que tenga su servidor y de la prioridad configurada en el envió del
correo, el correo llegara o se tardara mas tiempo en ser enviado, si no existieron problemas,
el correo llegara correctamente a su destino.
Ahora enviaremos un correo electrónico con TSQL a partir de una consulta a una Tabla
formateada en Tabla HTML.
DECLARE @tableHTML NVARCHAR(MAX);
SET @tableHTML =
N'<table border="1" cellpadding="5" cellspacing="0">'+
N'<thead>'+
N'<tr style=''background: Navy; color: White;font-weight: bold;''>'+
N'<th>Id</th>'+
N'<th>Nombre</th>'+
N'<th>Apellidos</th>'+
N'<th>Email</th>'+
N'<th>Pass</th>'+
N'</tr>'+
N'</thead>'+
N'<tbody>'+
CAST ( ( SELECT td = id, '',
td = nombre, '',
td = apellidos, '',
td = email, '',
td = pass, ''
FROM dbo.USUARIO_SYS
ORDER BY nombre, apellidos
FOR XML PATH('tr'), TYPE
) AS NVARCHAR(MAX) ) +
N'</tbody>'+
N'</table>'
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'sqlPsyPerfil',
@recipients = '[email protected]',
@subject = 'Correo desde TSQL 2005 con HTML',
@body = @tableHTML,
@body_format = 'HTML',
@importance = 'High'
Como primer paso declaramos un variable @tablaHTML la cual contendra el cuerpo del
mensaje en formato de tabla HTML con ayuda de la clausula FOR XML vista ya en posts
anteriores, lo que hace la consulta es tranformar los datos de consulta en texto con
características de lenguaje de marcado HTML.
Por ultimo solo nos queda asignar la variable @tablaHTML como nuestro contenido del
mensaje, he indicar que el formato del mensaje será HTML con @body_format =
„HTML‟, los demas parametros ya sabemos como configurarlos, y de nuevo solo nos
queda esperar a que llegue el correo a su destino como lo muestra la siguiente imagen.
Espero les sea de ayuda. Dejen Comentarios!!!
Etiquetas de Technorati: SQL Mail,TSQL Mail,Envio de correos SQL,Correos de prueba
desde SQL,correos HTML con SQL 2005,sp_send_dbmail
Comentarios : 28 Comentarios »
Etiquetas: Correos de prueba desde SQL., correos HTML con SQL 2005, Envio de correos
SQL, sp_send_dbmail, SQL Mail, TSQL Mail
Categorías : SQL
[SQL Mail] Envió de Correos desde SQL 2005.
28 01 2009
Saludos amigos, en esta ocasión explicare un breve ejemplo de como configurar la
Superficie de SQL Server para el envió de correos electrónicos.
Como primer paso tienen que ir a la opción del menú de Microsoft SQL Server 2005
>> Herramientas de configuración >> Configuración de superficie de SQL server.
Aparecerá una ventana de configuración de la cual deben de dar clic en la opción de
Configuración de superficie para características.
En la ventana que se abre, del árbol de opciones, en el nodo Motor de base de datos>>
Correo electrónico de base de datos, deben de activar la casilla que dice: Habilitar
procedimientos almacenados de correo electrónico de base de datos y dar clic en el
botón aplicar.
La otra opción a configurar es la de SQL Mail al mismo nivel del árbol de opciones, y
activar la casilla que dice: Habilitar procedimientos almacenados de SQL Mail, dar clic
en el botón aplicar y posteriormente en aceptar.
Hasta este momento están habilitadas las opciones de correo electrónico, falta configurar
una cuenta y un perfil, el cual servirá para enviar los correos electrónicos. Antes de
comenzar necesitas los siguientes datos que son los mismos de una cuenta que se configura
en Microsoft Outlook.
1. Dirección de correo electrónico.
2. Servidor de correo saliente SMTP.
Nota: Si tu servidor de salida requiere autenticación necesitas anexar:
1. Nombre de usuario (SMTP).
2. Contraseña (SMTP).
Ya que tienes a la mano esos datos, te vas al Explorador de objetos de SQL Server 2005 y
en la opción del árbol de opciones Administración >> Correo electrónico de base de
datos haces clic derecho y del menú contextual seleccionas la opción Configurar correo
electrónico de base de datos.
En el asistente de configuración de correo, seleccionen la casilla de Instalar Correo
electrónico de base de datos y den clic en siguiente.
Les aparecerá una ventana para crear un perfil de correo, escriban un nombre de perfil y
una descripción.
ahora tendremos que crear una cuenta SMTP al perfil, hacemos clic en el botón Agregar…,
Aparecerá una ventana para agregar una nueva cuenta de correo, escriban un nombre de
cuenta, descripción, la dirección de correo de la que se enviaran los correos, un nombre a
mostrar, el nombre del servidor de salida, y si lo requiere, los datos de autenticación SMTP
con el nombre de usuario y contraseña, den clic en el botón Aceptar y posteriormente en el
botón siguiente .
Aparecerá una ventana de Administrar la seguridad del perfil, de la lista de perfiles
seleccionen el que acabamos de crear y damos clic en el botón Siguiente.
En la ventana de Configurar parámetros del sistema hacemos clic en Siguiente.
En la ventana de Finalización del asistente damos clic en Finalizar.
Si todos los datos fueron correctos, aparecerá una ventana de Configurando que indicara
que la configuración de correo se ejecuto correctamente, no debe de aparecer ningún error o
advertencia y por ultimo damos clic en el botó Cerrar.
Ahora solo nos queda enviar un correo electrónico de prueba, nos vamos al explorador de
objetos en el nodo Administración >> Correo electrónico de base da datos, damos clic
derecho y seleccionamos la opción Enviar correo electrónico de prueba.
Aparecer una pequeña ventana donde seleccionaremos el perfil que creamos hace algunos
pasos, escribiremos la dirección de correo a la que queremos enviar, un asunto y cuerpo del
mensaje, damos clic en el botón Enviar correo electrónico.
Ahora solo nos queda esperar que haya llegado el correo electrónico y si es así listo!!! ya
tenemos todo funcionando para el envió de Correos desde SQL Server 2005.
En el próximo Post enviaremos correos desde código TSQL utilizando el perfil que
acabamos de crear.
Espero les sea de ayuda, Dejen cometarios!!!
Etiquetas de Technorati: SQL Mail,Correo electrónico desde SQL Server,Emails desde
SQL 2005,SQL 2005,Correos de prueba desde SQL.
Comentarios : 26 Comentarios »
Etiquetas: Correo electrónico desde SQL Server, Correos de prueba desde SQL., Emails
desde SQL 2005, SQL 2005, SQL Mail
Categorías : SQL
[XML] Generar XML con SQL 2005.
23 01 2009
Saludos amigos, en esta ocasión estoy preparando algunos ejemplos de como generar
código XML desde consultas en SQL 2005, algunas de las opciones más sencillas y rápidas
para obtener datos con formato XML son:
Tabla a la cual aplicaremos las consultas:
Primera forma de obtener XML con la clausula FOR XML AUTO:
SELECT * FROM dbo.USUARIO_SYS AS Usuario
FOR XML AUTO, TYPE, ROOT('Usuarios')
Devuelve un nodo Raíz llamado Usuarios y un nodo Usuario por cada una de las filas
devueltas en la consulta, las cuales contienen atributos que son cada uno de los campos de
la tabla.
<Usuarios>
<Usuario id="7" nombre="Claudia" apellidos="Perez Torres"
email="[email protected]" pass="a220109" fecha_add="2009-01-22T12:18:36.343"
fecha_upd="2009-01-22T12:18:36.343" />
<Usuario id="10" nombre="Ivan" apellidos="Rangel Cuadros"
email="[email protected]" pass="852465" fecha_add="2009-01-23T00:00:00"
fecha_upd="2009-01-23T00:00:00" />
<Usuario id="11" nombre="Carol" apellidos="Rangel" email="Zepeda"
pass="789123" fecha_add="2009-01-23T00:00:00" fecha_upd="2009-01-
23T00:00:00" />
<Usuario id="12" nombre="Tin" apellidos="Tin" email="[email protected]"
pass="456798" fecha_add="2009-01-24T00:00:00" fecha_upd="2009-01-
24T00:00:00" />
</Usuarios>
Segunda forma con la clausula FOR XML RAW:
SELECT * FROM dbo.USUARIO_SYS AS Usuario
FOR XML RAW('NodoUsuario'), ROOT('Usuarios')
Devuelve el nodo raíz Usuarios, y por cada fila devuelta en la consulta un nodo llamado
NodoUsuario, por lo tanto con RAW podemos asignar un nombre a cada fila de retorno de
nuestras consultas.
<Usuarios>
<NodoUsuario id="7" nombre="Claudia" apellidos="Perez Torres"
email="[email protected]" pass="a220109" fecha_add="2009-01-22T12:18:36.343"
fecha_upd="2009-01-22T12:18:36.343" />
<NodoUsuario id="10" nombre="Ivan" apellidos="Rangel Cuadros"
email="[email protected]" pass="852465" fecha_add="2009-01-23T00:00:00"
fecha_upd="2009-01-23T00:00:00" />
<NodoUsuario id="11" nombre="Carol" apellidos="Rangel" email="Zepeda"
pass="789123" fecha_add="2009-01-23T00:00:00" fecha_upd="2009-01-
23T00:00:00" />
<NodoUsuario id="12" nombre="Tin" apellidos="Tin" email="[email protected]"
pass="456798" fecha_add="2009-01-24T00:00:00" fecha_upd="2009-01-
24T00:00:00" />
</Usuarios>
Tercera forma con la clausula XML AUTO, Elements:
SELECT * FROM dbo.USUARIO_SYS AS Usuario
FOR XML AUTO, Elements, ROOT('Usuarios')
Devuelve un XML formado por elementos, es decir que por cada fila que devuelva la
consulta se agregara al XML como un elemento y por cada columna se agregara un nodo
sin atributos.
<Usuarios>
<Usuario>
<id>7</id>
<nombre>Claudia</nombre>
<apellidos>Perez Torres</apellidos>
<email>[email protected]</email>
<pass>a220109</pass>
<fecha_add>2009-01-22T12:18:36.343</fecha_add>
<fecha_upd>2009-01-22T12:18:36.343</fecha_upd>
</Usuario>
<Usuario>
<id>10</id>
<nombre>Ivan</nombre>
<apellidos>Rangel Cuadros</apellidos>
<email>[email protected]</email>
<pass>852465</pass>
<fecha_add>2009-01-23T00:00:00</fecha_add>
<fecha_upd>2009-01-23T00:00:00</fecha_upd>
</Usuario>
<Usuario>
<id>11</id>
<nombre>Carol</nombre>
<apellidos>Rangel</apellidos>
<email>Zepeda</email>
<pass>789123</pass>
<fecha_add>2009-01-23T00:00:00</fecha_add>
<fecha_upd>2009-01-23T00:00:00</fecha_upd>
</Usuario>
<Usuario>
<id>12</id>
<nombre>Tin</nombre>
<apellidos>Tin</apellidos>
<email>[email protected]</email>
<pass>456798</pass>
<fecha_add>2009-01-24T00:00:00</fecha_add>
<fecha_upd>2009-01-24T00:00:00</fecha_upd>
</Usuario>
</Usuarios>
Estas son algunas de las formas de generar datos XML, espero y les sirva de ayuda, en otro
post preparare información para guardar y consultar datos de variables o documentos XML.
Dejen comentarios!!!
Etiquetas de Technorati: SQL XML,XML,FOR XML,SQL XML 2005,SELECT FOR
XML
Comentarios : 2 Comentarios »
Etiquetas: FOR XML, SELECT FOR XML, SQL XML, SQL XML 2005, XML
Categorías : SQL
[SQL] Procedimiento almacenado para Insertar datos
con transacción y control de errores.
22 01 2009
Hola amigos, en muchas ocasiones no sabemos si estamos realizando correctamente un
proceso de inserción, actualización o eliminación de datos a una tabla(s), esto para muchos
es sumamente sencillo, pero me di a la tarea de preparar un pequeño ejemplo de esto. El
script de T-Sql consiste en realizar un procedimiento almacenado que reciba los datos
necesarios para insertarlos en la tabla, para garantizar la ejecución correcta de las
inserciones utilizo las transacciones “Transact SQL” y para validar la reversión de la
transacción en caso de que ocurra un ERROR utilizo el control de Errores Try – Catch
con RollBack.
¿Qué es una Transacción?
Una transacción es un conjunto de operaciones T-SQL que funcionan como un solo bloque
de instrucciones, esto significa que si ocurre un fallo durante la ejecución de alguna
instrucción del bloque todas las demás fallaran, lo que implica que nada más se ejecutara y
la transacción tendrá que deshacer todo lo que había ejecutado hasta donde ocurrió el fallo,
a eso se la llama reversión de la transacción y se ejecuta con un ROLLBACK, en caso de
una ejecución correcta se tendrá que grabar la transacción con COMMIT, el objetivo de las
transacciones es garantizar que los datos que se inserten, actualicen o eliminen queden
CONSISTENTES en la base de datos.
Después de una ligera explicación de las Transacciones veremos el siguiente ejemplo de
una inserción dentro de un procedimiento almacenado con transacción.
Definiendo las estructuras.
1. La estructura del SP es:
CREATE PROCEDURE nombreProdedimiento
-- Parámetros del SP
@Param1 AS Varchar(25),
@Param2 AS Bigint
.
.
.
AS
BEGIN
-- Insertar bloque de instrucciones a ejecutar.
/*
SELECT
UPDATE
INSERT
DELETE
Lo que quieras....
*/
END
GO
2. La estructura del control de errores TRY-CATCH es:
Begin Try
/*Bloque de instrucciones a validar.
-----------------------------------------
-----------------------------------------
-----------------------------------------*/
End Try
Begin Catch
/*Bloque de instrucciones que se ejecutan si ocurre
un ERROR.
-----------------------------------------
-----------------------------------------
-----------------------------------------*/
End Catch
3. La estructura de una Transacción es:
Begin Tran NombreTransaccion--Inicio de la transacción con su nombre Tadd
o el que elijas.
/*Bloque de instrucciones a ejecutar en la Transacción
---------------------------------------
---------------------------------------*/
Commit Tran NombreTransaccion--Confirmación de la transacción.
Rollback Tran NombreTransaccion--Reversión de la transacción.
4. Para finalizar veremos todo lo anterior armado ya en conjunto de SP, Transacción y
control de Errores.
-- =============================================
-- Author: Ivan Rangel Cuadros.
-- Create date: 22/Ene/2009
-- Description: Procedimiento para Insertar registros en una Tabla con
transacción y control de errores.
-- =============================================
CREATE PROCEDURE spAgregaUsuario
@nom AS VARCHAR(50),
@ape AS VARCHAR(50),
@ema AS VARCHAR(30),
@pas AS VARCHAR(20),
@idJer AS BIGINT,
@msg AS VARCHAR(100) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
Begin Tran Tadd
Begin Try
INSERT INTO dbo.USUARIO_SYS (nombre, apellidos, email, pass,
fecha_add) VALUES (@nom, @ape, @ema, @pas, GETDATE())
INSERT INTO dbo.USUARIO_JERARQUIAS_SYS (id_usuario, id_jerarquia)
VALUES (@@IDENTITY, @idJer)
SET @msg = 'El Usuario se registro correctamente.'
COMMIT TRAN Tadd
End try
Begin Catch
SET @msg = 'Ocurrio un Error: ' + ERROR_MESSAGE() + ' en la línea
' + CONVERT(NVARCHAR(255), ERROR_LINE() ) + '.'
Rollback TRAN Tadd
End Catch
END
GO
Explicando el procedimiento:
1. Recibe los datos a través de parámetros de los cuales uno es de salida OutPut , que
servirá para indicar si la Inserción se realizo correctamente o no.
2. Crea una transacción llamada Tadd, valida con TRY-CATCH las inserciones a las tablas
USUARIO y USUARIO_JERARQUIAS.
3. Si las operaciones de inserción se ejecutan correctamente las confirma con COMMIT
TRAN Tadd y regresa la variable @msg con un valor de confirmación correcto, si ocurre
un error se revierte la transacción con ROLLBACK TRAN Tadd y devuelve en @msg un
valor de error.
Ejecutando el Procedimiento:
DECLARE @msg AS VARCHAR(100);
EXEC spAgregaUsuario 'Claudia','Perez
Torres','[email protected]','a220109',1,@msg OUTPUT
SELECT @msg AS msg
Mensaje de inserción correcta:
Mensaje de Error en la Transacción:
Apóyame votando aquí: http://blogit.ms/TopBloggers.aspx en la categoría SQL Server.
Los pasos para votar están aquí te llevara 3 min: Clic Aquí.
Espero les sea de ayuda. Dejen comentarios!!!
Etiquetas de Technorati: SQL,SQL 2005,Procedimeintos almacenados,Trasacciones,T-
SQL,TSQL,Control de errores,Try-Catch,Transact SQL,Store Procedure
Comentarios : 31 Comentarios »
Etiquetas: Control de errores, Procedimeintos almacenados, SQL, SQL 2005, Store Procedure,
T-SQL, Transact SQL, Trasacciones, Try-Catch, TSQL
Categorías : SQL
[SQL] Obtener las FK y sus relaciones de una Base de
datos SQL 2005.
21 01 2009
El día de hoy un amigo me pregunto como ver las relaciones foráneas (FK) de una tabla(s)
en SQL 2005 desde código y no en vista de diseño. Poniéndome a buscar encontré algunos
ejemplos, de los cuales considero el más eficaz. El siguiente ejemplo muestra como obtener
las llaves foráneas en conjunto con sus relaciones a otras tablas en SQL Server 2005. Todo
consiste en acceder al catalogo de sistema que contiene las llaves foráneas y el catalogo de
columnas de las mismas llaves.
USE tuBaseDeDatos;
GO
SELECT fk.name AS FK,
OBJECT_NAME(fk.parent_object_id) AS TableName,
COL_NAME(fc.parent_object_id,fc.parent_column_id) AS ColumnName,
OBJECT_NAME (fk.referenced_object_id) AS ReferenceTableName,
COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS
ReferenceColumnName
FROM sys.foreign_keys AS fk
INNER JOIN sys.foreign_key_columns AS fc ON fk.OBJECT_ID =
fc.constraint_object_id
@http://blog.sqlauthority.com/2007/09/04/sql-server-2005-find-tables-with-foreign-key-
constraint-in-database/
En base al código anterior y para efectos de claridad prepare la siguiente consulta que
obtiene el nombre de una relación foránea (FK) y el nombre de la columna la cual funciona
como FK, todo esto a partir de una determinada tabla.
USE tuBaseDeDatos;
GO
DECLARE @tabName AS Varchar(50)
SET @tabName = 'dbo.TU_TABLA'--Nombre de la Tabla de la cual se obtendrán
las FK's.
SELECT OBJECT_NAME(f.constid) AS 'FKName', c.name AS 'ColName'
FROM sysforeignkeys f
INNER JOIN syscolumns c ON f.fkeyid = c.id AND f.fkey = c.colid
WHERE fkeyid = OBJECT_ID(@tabName)
Espero les sea de ayuda. Dejen comentarios!!!