miércoles, 27 de mayo de 2015

SQL - Desconectar usuarios de una BD

/*Desconectarlos para realizar una restauración, o sacar un .bak-por ejemplo-*/

USE master
DECLARE curkillproc
CURSOR FOR
SELECT spid,dbs.name AS dbname
FROM master..sysprocesses pro, master..sysdatabases dbs
WHERE pro.dbid = dbs.dbid
AND dbs.name = 'mi_base_datos'     --aquí el nombre de la BD
FOR READ ONLY
DECLARE @varspid AS integer
DECLARE @vardbname AS varchar(256)
DECLARE @numUsers AS integer
SET @numUsers = 0
OPEN curkillproc
FETCH NEXT FROM curkillproc
INTO @varspid, @vardbname
WHILE @@fetch_status = 0
BEGIN
EXEC('kill ' + @varspid)
SET @numUsers = @numUsers + 1
FETCH NEXT FROM curkillproc INTO @varspid, @vardbname
END
CLOSE curkillproc
DEALLOCATE curkillproc
SELECT @numUsers as NumUsersDisconnected

SQL - Reducir el log de una Base de Datos

USE miBaseDeDatos;
GO
-- se cambia el recovery a modo simple
ALTER DATABASE miBaseDeDatos
SET RECOVERY SIMPLE;
GO
-- se reduce el archivo log a 1 MB.
DBCC SHRINKFILE (miBaseDeDatos_Log, 1);  --conservar _Log
GO
-- se devuelve el nivel de recovery a full
ALTER DATABASE miBaseDeDatos
SET RECOVERY FULL;
GO

/*Donde miBaseDeDatos es el nombre de la base de datos.*/

lunes, 25 de mayo de 2015

SQL - Subir nivel de compatibilidad de la BD

EXEC sp_dbcmptlevel 'mi_base_de_datos', 100


90 = SQL Server 2005
100 = SQL Server 2008
110 = SQL Server 2012
120 = SQL Server 2014

Ver nivel de compatibilidad actual:

SELECT compatibility_level
FROM sys.databases WHERE name = 'mi_base_de_datos';

SQL - Obtener columnas con valores repetidos


SELECT col1, col2, count(*)    --columna(s) a consulta(r)
FROM t1                                   --nombre de la tabla a consultar
GROUP BY col1, col2             --agrupación según la(s) columna(s) a consultar
HAVING count(*) > 1              --contador de repeticiones

viernes, 22 de mayo de 2015

C# - Probar Web Services Fuera del Servidor.

Por defecto un Servicio Web no puede ser testeado (con el respectivo paso de parámetros) desde otro sitio que no sea el Servidor en donde está instalado. Para si poder hacerlo, es necesario agregar las siguientes líneas dentro del tag  <system.web> del archivo de configuración (Web.Config).

<system.web>
    <webServices>
      <protocols>
        <add name="HttpGet" />
        <add name="HttpPost" />
        <add name="Documentation" />
      </protocols>
    </webServices>
  </system.web>


Debería quedar de esta forma.




jueves, 21 de mayo de 2015

SQL - Ciclo While Reemplazo de un Cursor


 -------------------------------------------------------
 --Declaracion de variables necesarias para el ciclo
 -------------------------------------------------------
DECLARE @origen TINYINT ,
    @rut_origen INT ,
    @tipo_direccion TINYINT ,
    @direccion CHAR(70) ,
    @comuna SMALLINT ,
    @email CHAR(50) ,
    @telefono CHAR(25) ,
    @telefono2 CHAR(25) ,
    @fax CHAR(25) ,
    @estado TINYINT

 -----------------------------------
 --Declaro  temporal
 -----------------------------------
CREATE TABLE #direccionesTemp
    (
      id INT IDENTITY(1, 1) ,
      cod_origen TINYINT,
      rut_origen INT ,
      cod_tipo_direccion TINYINT ,
      direccion CHAR(255) ,
      comuna SMALLINT ,
      telefono CHAR(12) ,
      estado TINYINT
    )
         
CREATE INDEX I_direcciones_temp  --El Indice es para aportar velocidad
ON #direccionesTemp(id) ;
 -----------------------------------
 --Lleno tabla temporal
 -----------------------------------
INSERT  INTO #direccionesTemp
        SELECT  cod_origen ,
                rut_origen ,
                cod_tipo_direccion ,
                direccion ,
                comuna ,          
                telefono ,          
                estado
        FROM    dbo.direcciones
                   
 ----------------------------------------
 --Variables de Recorrido
 ----------------------------------------
DECLARE @numeroDeRegistros INT
SET @numeroDeRegistros = ( SELECT   COUNT(*)
                           FROM     #direccionesTemp
                         )
DECLARE @recorridoWhile INT
SET @recorridoWhile = 1

 -----------------------------------------
 --recorrido
 -----------------------------------------
WHILE ( @numeroDeRegistros > 0    --mientras,el numero de registros sea mayor a 0
        AND @recorridoWhile <= @numeroDeRegistros  --y mientras la variable de recorrido sea menor o igual a la cantidad de registros
   
      )
    BEGIN        
        --lleno mis variables
        SELECT  @origen = cod_origen ,
                @rut_origen = rut_origen ,
                @tipo_direccion = cod_tipo_direccion ,
                @direccion = direccion ,
                @comuna = comuna ,
                @telefono = telefono ,                        
                @estado = ISNULL(estado,0)
        FROM    #direccionesTemp
        WHERE   id = @recorridoWhile    --las lleno con la data de la fila que voy recorriendo.
   
   
        BEGIN TRANSACTION
         BEGIN TRY
         INSERT INTO leasecom..t_clientes_direccion
                ( cod_origen ,
                  rut ,
                  tipo_direccion ,
                  correlativo ,
                  direccion ,
                  cod_comuna ,
                  email ,
                  telefono ,            
                  estado
                )
        VALUES  ( @origen ,
                  @rut_origen ,
                  @tipo_direccion ,
                  @correlativo ,
                  SUBSTRING(LTRIM(RTRIM(@direccion)), 1, 40) ,
                  @comuna , -- cod_comuna - smallint
                  NULL , -- email - varchar(255)
                  SUBSTRING(LTRIM(RTRIM(@telefono)), 1, 12)   ,            
                  @estado -- estado - tinyint
                )
   
        COMMIT TRANSACTION
         END TRY
        BEGIN CATCH
         SELECT ERROR_NUMBER() as ErrorNumber, ERROR_MESSAGE() as ErrorMessage;
         ROLLBACK TRANSACTION    
        END CATCH    
         
        SET @recorridoWhile = @recorridoWhile + 1
        --Print para indicar en que parte del recorrido va (Opcional).
        PRINT CONVERT(VARCHAR(100), @recorridoWhile )
    END

 DROP TABLE #direccionesTemp



miércoles, 20 de mayo de 2015

SQL - Sintaxis de un Cursor


/*Declaracion de variables */
DECLARE @var1   NUMERIC(18,0),
        @var2   SMALLINT,
 
/*Filas a recorrer*/
 DECLARE c_ejemplo CURSOR FOR
 select campo1,
        campo2    
 from dbo.t_mi_tabla
/*Apertura del Cursor*/
 OPEN c_ejemplo
 FETCH c_ejemplo
 INTO @var1,  
      @var2
     
 WHILE (@@FETCH_STATUS = 0)
 BEGIN
/*Instrucciones para cada fila recorrida*/
  INSERT INTO dbo..t_mi_tabla2
          ( campo1 ,
            campo2
          )
  VALUES  ( @var1 , -- correlativo - numeric
            @var2        
          )
/*Mensaje en caso de error (opcional)*/  
  IF @@error <> 0
  BEGIN
   Print 'Error al Insertar'
   RETURN
  END

 FETCH c_ejemplo
 INTO @var1,  
      @var2  
           
END
/*Cierre y final del Cursor*/
CLOSE c_ejemplo
DEALLOCATE c_ejemplo

martes, 5 de mayo de 2015

C# - Fecha Automática para las Publicaciones

 //Solo Fecha
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                var fechaPublish = "01/01/1900";
                var dll = Server.MapPath("bin\\DLLNombre.dll");
                if (File.Exists(dll))
                    fechaPublish = File.GetLastWriteTime(dll).ToString("dd-MM-yyyy hh:mm") + " HRS.";
                lblFechaLiberacion.Text = fechaPublish;
            }
        }

        //Fecha + string de conexión
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                var dataSource = System.Configuration.ConfigurationManager.ConnectionStrings["NombreConexion"].ConnectionString.Split(';').ToArray();
                string data = dataSource[0].Replace("Data Source=", "");
                var dll = Server.MapPath("bin\\DLLNombre.dll");

                if (File.Exists(dll))
                    data += " - " + File.GetLastWriteTime(dll).ToString();
                lblInfo2.Text = data;
            }
        }