sábado, 25 de marzo de 2017

Utilidades de SQL SERVER y Visual Basic.NET

A continuación se presentan algunas utilidades que no merecen un artículo por si mismas pero que conviene tener en cuenta.

Utilidades de SQL Server


Ver quien está utilizando la base de datos

Con las nuevas versiones no hay manera de ver quien está conectado a la base de datos.
Pero existe un procedimiento almacenado llamado  sp_who  que muestra quien está utilizando la bbdd.

Utilidades de SQL SERVER y Visual Basic.NET



En el campo status se muestra el estado actual de la sesión, en hostname el equipo desde el que se entró, en dbName el nombre del usuario que accedió  a la base de datos

Cambiar una base de datos de modo usuario múltiple a usuario simple y viceversa

Pasar una base de datos  a modo single_user a través de código:
USE master
GO
ALTER DATABASE dbDesarrollo1802 SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

Pasar una base de datos  a modo multi_user a través de código:
USE master
GO
ALTER DATABASE dbDesarrollo1802 SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO

De forma gráfica:

Situados sobre la base de datos correspondiente pulsamos con el botón derecho del ratón y  elegimos la opción Propiedades

poner base de datos en modo multiusuario


Esto abre la pantalla que se muestra debajo donde en la pestaña opciones elegiremos Restringir acceso desde donde se desplegará un combo con las tres opciones mostradas.

Base de datos en modo MULTI_USER, SINGLE_USER


Matar un proceso de SQL Server

La opción de “matar” los procesos, consiste en hacer uso de la instrucción “Kill”, que se encarga de “Matar” o terminar los procesos y/o las conexiones “normales”.
La instrucción “Kill” debe recibir como parámetro los ID’s de las sesiones de cuyos procesos se van a cerrar, podemos hacer una consulta a la tabla “SysProcesses” de la base de datos “Master” para tener la lista de procesos activos de la base de datos. Para filtrar los resultados de la consulta para matar solamente los procesos de nuestra base de datos,utilizaremos el campo “DBId” (el id de la base de datos). Para extraer el nombre como tal de la base de datos, podemos hacer uso de la función DB_NAME() que recibe como parámetro el Id de la base de datos. Como para matar los procesos solo necesitamos el Id del proceso, este se encuentra en el campo spid de la tabla “SysProcesses”. Al final, la lista de procesos a “matar” la obtendremos del siguiente query:
select * from master..SysProcesses WHERE DB_NAME(DBId)='dbDesarrollo'

Esto devuelve algo así:

matar un proceso SQL Server


Ahora, sólo hay que hacer
KILL 57;
GO
 Poner un proyecto de SQL Server en Compatibilidad SQL Server 2005
poner base de datos SQL Server con compatibilidad para SQL Server 2005


poner base de datos SQL Server con compatibilidad para SQL Server 2005

Optimizar una consulta


Esto depende de cada consulta en particular, pero he encontrado un ejemplo concreto de una consulta que tarda más de 8 horas en ejecutarse en una base de datos muy grande.  

select * From dbo.tbTabla where strtipoid='DOC' and  strCodigo + strCodigoInstalacion + strNumeroEnvio +  strTUI
not in (
select strCodigo + strCodigoInstalacion + strNumeroEnvio +  strTUI 
     from dcae.tbTabla2
     )


El problema de ralentización está en los signos + empleados para unir diferentes campos para montar los criterios de búsqueda, la consulta siguiente es equivalente a la anterior pero como contrapartida su tiempo de ejecución es inmediato a pesar de realizarse sobre la misma base de datos para que tardaba más de 8 horas.
      
SELECT dcae.tbTabla where strTUI='DOC' and  strCodigo 
not in (
select strCodigo
     from dcae.tbTabla2
     ) and  strCodigoInstalacion
not in (
select strCodigoInstalacion
     from dcae.tbTabla2
     ) and strNumeroEnvio
not in (
select strNumeroEnvio
     from dcae.tbTabla2
     ) and strTUI
     not in (
select strTUI
     from dcae.tbTabla2)

Funciones útiles en Visual Basic .net

 Obtener un número aleatorio


'Esta funcion obtiene un número aleatorio entre el valor bajo (lower) y el alto (upper)
Public Function BuscaNumeroAleatorio(ByVal Lower As Integer, ByVal Upper As Integer)
        ' Initialize the random-number generator.
        Randomize()
        BuscaNumeroAleatorio = CInt(Math.Floor((Upper - Lower + 1) * Rnd())) + Lower
End Function

Hacer una búsqueda genérica en una base de datos
La siguiente función realiza una select sobre una tabla y un campo dados por parámetro para una condición numérica. Si la condición fuera texto hay que cambiar la definición del parámetro por string.

'Esta función genera una búsqueda genérica en una base de datos con una condición
numérica. EL resultado se almacena en un array lo devuelve como salida de la función
Public Function BusquedaGenerica(ByVal Nombre_Tabla As String, ByVal Nombre_Campo As String, ByVal strConexion As Object, Optional ByVal idCondicion As Integer = 0) As String
        'Variable que contiene la select a ejecutar sobre la base de datos
Dim strSQL As String
Dim i As Integer = 0
Dim Salida() As String = ""
Dim cmd As New OleDb.OleDbCommand(strSQL, strConexion)

'Objeto conexión para conectarse a una base de datos de Access
Try
strSQL = CuentaRegistros(strConexion, "Select * from " & Nombre_Tabla & " where " & Nombre_Campo & " = " & idTipo)


       Dim reader As OleDb.OleDbDataReader = cmd.ExecuteReader
       i = 0
       While reader.Read
          Redim Preserve Salida (i)
          Salida(i)  = reader.Item(0)
              i = i + 1   
       End While
       reader.Close()
       BusquedaGenerica = Salida(i)

Catch ex As Exception
MessageBox.Show(ex.Message)
       BusquedaGenerica = "Error en BuscaGenerica"
End Try
End Function
'Devuelve un entero que representa el número de registros de una SELECT de entrada Query de  tipo select COUNT(*) from
Private Function CuentaRegistros(ByVal strConexion As Object, ByVal Query As String) As Integer
        'Busca la cantidad de registros
        Dim cmd1 As New OleDb.OleDbCommand(Query, strConexion)
        CuentaRegistros = cmd1.ExecuteScalar()
        'Fin de busca cantidad de registros
End Function


No hay comentarios:

Publicar un comentario