Buscar en el Blog

Mostrando entradas con la etiqueta sql server. Mostrar todas las entradas
Mostrando entradas con la etiqueta sql server. Mostrar todas las entradas

viernes, 26 de septiembre de 2014

Sql Server - Obtener el Nombre del mes y del dia de una Fecha



Para obtener el nombre del mes basta con colocar la siguiente instruccion.

datename(MONTH,fecha)

Utilizando el codigo

alter procedure sp_reporteventasMes
as begin 
SELECT     datename(MONTH,fecha) as dia, sum(total) as total
FROM         dbo.DocumentoVenta
where YEAR(fecha)=YEAR(getdate())
group by datename(month,fecha)
end
  Para el Dia de la semana seria de la siguiente manera
datename(weekday,fecha) 

martes, 4 de febrero de 2014

Generar Codigo Alfanumerico en Sql Server

¿Como generar un codigo alfanumerico para poder insertar en nuestra tabla?
Primero vamos con la estructura de la tabla de ejemplo


Nota: Como pueden apreciar el campo CodAlumno es del tipo Char de longitud 4, este campo almacenara el codigo con el siguiente formato:

Primera Letra del nombre +000
Por ejemplo L001



Declaramos nuestras variables o parametros de entrada que en este caso son el nombre y el apellido
la Variable Autoincremento sera la que contendra el valor maximo del codigo, para eso hacemos uso de la funcion max , pero el codigo es del tipo string, por eso realizamos una extraccion y su respectiva conversion de dato al tipo numerico.

luego simplemente incrementamos en uno con Set @Autoincremento=@Autoincremento + 1
la variable @numero contendra la parte del codigo numero, pero sera del tipo char.
Con la funcion extraemos los tres ultimos caracteres para obtener un numero con formato 001.


Probando el procedimiento Almacenado

jueves, 16 de enero de 2014

Usar Funciones Sql Server desde PowerBuilder

Primero creamos nuestra funcion en  Sql Server

--Suma de dos numeros
Create FUNCTION FuncionSuma (@n1 int, @n2 int)
RETURNS int
AS
BEGIN
DECLARE @r int
SET @r = @n1 + @n2
RETURN (select @r)
END 



//En powerBuilder
integer n1,n2,r//no necesariamente deben ser iguales que en la funcion

n1 =8
n2 = 5

Select dbo.FuncionSuma (:n1, :n2)
Into :r
From producto;//producto es una tabla de la base cambia
//cambia el nombre por cualquiera que tengas en la tabla es
Using SqlCa;

sle_1.text = string(r) 

jueves, 19 de septiembre de 2013

Habilitar xp_cmdshell, ante error SQL Server blocked access to procedure ‘sys.xp_cmdshell’

Para poder habilitar el  xp_cmdshell necesitamos ejecutar las siguientes instrucciones

--Permitir que las opciones avanzadas puedan ser cambiadas.
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO

--Permitir el uso de SP XP_CMDSHELL.
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO




Con esto ya podremos usar el comnado XP_CMDSHELL

martes, 27 de agosto de 2013

Sql Server 2008 no se permite guardar los cambios

Cuando Sql Server no permite guarda los cambios de las tablas, debemos cambiar la configuracion




 Quitamos el check en la opcion Impedir guardar cambios que requieran volver  a crear tabla

jueves, 20 de septiembre de 2012

¿Que son los indices en una base de datos?


INDICES EN SQL SERVER
¿Para qué sirven los índices?
Para mejorar la performance de una consulta.
Es una buena practica, incluso indispensable, tener un índice en las claves primarias, pero no es exclusivo de estas, también se puede tener en cualquier columna de una tabla  de la BD.
Si una tabla no tiene ningún índice creado, SQL Server tratará la tabla como un HEAP.  Un heap es una estructura de datos que almacena la posición física en la que se almacenó cada nueva fila dentro de las páginas asignadas a la tabla.

¿Es lo mismo una clave primaria que un índice?
Una clave primaria puede estar compuesta por más de un campo. Por ejemplo, si tomamos una tabla de empleos, podemos distribuirla ordenada por departamentos, y dentro de cada departamento por niveles. Hacemos clave primaria ambos campos (departamento-nivel) de manera que se podrá repetir departamento, o nivel, pero no se podrá repetir el conjunto de un departamento y un nivel.
La principal diferencia entre un índice y una clave primaria es la repetición de valores. En una clave primaria no pueden repetirse y en un índice si podrían.
Una clave primaria es un campo o varios que identifican cada registro de la base de manera unívoca, es decir, sin posibilidad de confusión.
Un índice es un campo o varios por los que se pueden "ordenar" los registros de manera que acceder a uno concreto es más rápido.

¿Cómo es que un índice puede mejorar la performance de una consulta?
Fácil, los índices ordenan los registros de una tabla, esta ordenación finalmente permite acceder a los registros de manera más rápida, pues se llega más rápido al lugar donde se encuentra la información requerida, ya que estos índices funcionan de similar manera a los índices de un libro.
La recomendación es usar índices sobre las columnas que participan en la cláusula WHERE de una consulta.
Una tabla puede tener un índice clusterado y 249 índices no clusterados. Con lo que da como resultado un total de 250 índices.

Hay dos tipos de índices (en SQL Server):

Índices Agrupados (CLUSTERED).
Ordenan físicamente las filas de una tabla.
Cualquier tabla puede tener ninguno o un índice agrupado (CLUSTERED). Los índices agrupados son la propia tabla, es decir, cuando creamos un índice agrupado sobre una tabla, estamos convirtiendo a la propia tabla en un índice, lo cual tiene varias implicaciones.
A efectos de rendimiento, es importante tener en cuenta, que una tabla con un índice agrupado se almacenará de forma ordenada, lo cual, facilitará la satisfacción de consultas con cláusulas ORDER BY o GROUP BY coincidentes con los campos del índice, por poner un ejemplo representativo.

Índices No Agrupados (NONCLUSTERED).
Se trata de estructuras ajenas a la propia tabla, que consumen su propio almacenamiento. Esto permite, que la tabla se pueda almacenar sobre un Grupo de Ficheros (File Group) y los índices no agrupados sobre un Grupo de Fichero diferente. Es posible crear índices no agrupados, sobre tablas sin índices y sobre tablas con índices (incluso aunque tenga un índice agrupado).

Los índices No Agrupados, suelen ser especialmente efectivos para satisfacer cláusulas WHERE sobre los campos del índice que devuelven un conjunto muy pequeño de registros. También son muy apropiados para satisfacer consultas cuyos campos están todos incluidos en el índice (de este modo, no es necesario acceder a la tabla, pues toda la información está en el índice).

Recuerda que un índice puede estar conformado por varias columnas.
Un índice no es lo mismo que una clave primaria

TRANSACT/SQL BASICO video 2

Creando y relacionando tablas con transact/sql





lunes, 5 de diciembre de 2011

Encriptar un password con SQL Server

Saludos a todos los seguidores de este blog!.
Muchas veces necesitamos encriptar es password de nuestra aplicacione en la base de datos, es decir que el campo donde almacenamos el password(contraseña) no este como simple texto, si no que este valor no sea legible.

Para eso podemos usar lo siguiente:
Pwdencryp() y Pwdcompare() 
Estas son dos funciones de sql server, la primera sirve para encriptar y la segunda sirve para comparar el password con la cadena encriptada.

Por ejemplo si colocamos lo siguiente en el analizador de consultas:

select pwdencrypt('lexblas')

nos arrojara el siguiente valor

0x0100D101C65D0C4F2A6714337E7E9E7CCD88C9583C9428B2E9A2

El valor anterior es nuestro password encriptado.

Ahora para comparar nuestro password ingresado con el que tenemos en la base de datos, hacemos lo siguiente:

select pwdcompare ('lexblas',0x0100D101C65D0C4F2A6714337E7E9E7CCD88C9583C9428B2E9A2)

donde: El primer argumento es el password en texto, el cual estamos ingresando en nuestra ventana de inicio de sesion y el segundo parametro es el password encriptado.


El campo donde se almacenara el password debe ser del tipo varbinary.
Por ejemplo:


create table passwords
(
usuario varchar(15),
password varbinary(255)
)



Para validar el usuario, pueden crear un procedimiento almacenado que haga el trabajo.
Tambien hay otra alternativa.






create proceduresp_verificarUsuario @usuario varchar(15),@pass varchar(15),@r int output
as
if exists (select * from usuario where usuario=@usuario and 1 = pwdcompare(@pass,password))
set @r=1

else
set @r=0
Si el password concuerda con el que esta en la base de datos devolvera el valor de 1, de caso contrario cero.


SQL 2005 nos da otra posibilidad de realizar una encriptación de datos para campos de la base de datos. Tiene una función para ello: HashBytes.

A esta función, simplemente se le pasan como parámetros el algoritmo de encriptación (que pueden ser MD2, MD4, MD5, SHA, SHA1) y la cadena (o variable) a encriptar, devolviendo el valor encriptado para el algoritmo usado.

Un ejemplo:

DECLARE @myCrypVar varchar(max);
SELECT @myCrypVar = CONVERT(varchar,'cadena a encriptar');
SELECT HashBytes('SHA1', @myCrypVar);
 
Resultado: 0x548C29B27BC6750A11E0D97E9ED16D4B32DBE7FF

Esto tambien se puede implementar como el ejemplo anterior.