Mostrando entradas con la etiqueta Herbert Mendoza. Mostrar todas las entradas
Mostrando entradas con la etiqueta Herbert Mendoza. Mostrar todas las entradas

SQL Server: Como parametrizar una consulta SQL, How to parameterized SQL query

| domingo, 6 de septiembre de 2015


SQL Server: Como parametrizar una consulta SQL, How to parameterized SQL query

Resulta importante en ocasiones hacer uso de un query dinámico, si tenemos parámetros y deseamos usarlos en el query nos enfrentamos a un inconveniente, como podemos concatenarlos si nuestros parámetros son de tipo Entero, Fecha, cualquier otro diferente de String, porque de ser así tendremos que hacer tantas conversiones explícitas como parámetros diferentes de String tengamos, me lo mostró por cierto un amigo llamado HunchBak, así que parte de los créditos son del él, veamos el siguiente ejemplo:

Primero creemos la siguiente tabla:










Código T-SQL para crearla:

USE TEMPDB
GO

IF OBJECT_ID('Cuenta') is not null
BEGIN
 DROP TABLE Cuenta;
END

CREATE TABLE [dbo].[Cuenta]
(
 [Codigo] int NOT NULL,
 [Descripcion] varchar(20) NOT NULL, 
 [Seccion] int NOT NULL
);

INSERT INTO [dbo].[Cuenta]
VALUES
 (2025912, 'PERFORACION A', 1525),
 (2025913, 'PERFORACION B', 1525),
 (2025922, 'CARGA FRONTAL', 23652),
 (2025923, 'CARGA LATERAL', 23652),
 (2025963, 'CHANCADO', 36523),
 (2025964, 'CHANCADO', 36287),
 (2025965, 'CHANCADO', 36523),
 (2025991, 'RECUPERACION', 365247);

GO

Ahora, hacemos una prueba con el siguiente query con el cuál deseamos conocer todas las Cuentas con la DESCRIPCION "CHANCADO" y que sean de la SECCION "36523" :

DECLARE @Descripcion AS varchar(20);
DECLARE @Seccion smallint;

SET @Descripcion = 'CHANCADO';
SET @Seccion = 36523;

DECLARE @sql nvarchar(MAX);

SET @sql = 
N'SELECT 
 Codigo, Descripcion, Seccion
FROM
 Cuenta
WHERE
 Descripcion = ' + @Descripcion + ' AND
 Seccion = ' + @Seccion;

EXEC sp_executesql @sql;

GO

Al ejecutarla, tenemos la siguiente descripción de error:


--Error de conversión al convertir el valor varchar '*' al tipo de datos int, smallint.
--Conversion failed when converting the varchar value '*' to data type int, smallint.

Esto sucede porque no podemos concatenar un tipo de dato Entero a Cadena, podemos hacer una conversión explícita pero estaríamos haciéndolo para cada juego de parámetros y no es lo correcto, lo mejor en estos casos es parametrizar la consulta de esta manera:

DECLARE @Descripcion AS varchar(20);
DECLARE @Seccion int;

SET @Descripcion = 'CHANCADO';
SET @Seccion = 36523;

DECLARE @sql nvarchar(MAX);

SET @sql = 
'SELECT 
 Codigo, Descripcion, Seccion
FROM
 Cuenta
WHERE
 Descripcion = @Descripcion AND
 Seccion = @Seccion';

EXEC sp_executesql @sql, 
 N'@Descripcion varchar(20), @Seccion int', 
 @Descripcion, 
 @Seccion;

GO


Obtenemos la siguiente salida:

Codigo Descripcion Seccion 2025963 CHANCADO 36523 2025965 CHANCADO 36523

Saludos,

SQL Server: Cómo Sumar el tipo de dato TIME, How to SUM Data Type TIME using TSQL

| sábado, 8 de agosto de 2015


SQL Server: Cómo Sumar el tipo de dato TIME, How to SUM Data Type TIME using TSQL

Que tal,
El tipo de dato TIME, nuevo desde la versión SQL Server 2008, nos permite almacenar tiempo en nuestra base de datos, por ejemplo horas, anteriormente para hacerlo se debía crear un tipo de dato CHAR(8), pero con este tipo de dato cambia mucho las cosas, pero que sucede si estamos usando este tipo de dato (TIME) y de repente deseamos obtener el tiempo total acumulado, por ejemplo:

DECLARE @TablaTiempo TABLE
(
 IDLocacion int,
 IDMedidor int,
 TiempoProceso time(7)
);

--Ingresamos registros
INSERT INTO @TablaTiempo(IDLocacion, IDMedidor, TiempoProceso)
VALUES
 (1, 50, '08:05:30'),
 (1, 85, '00:05:05'), 
 (2, 36, '01:01:55'),
 (2, 26, '00:00:06'),
 (3, 89, '00:05:15');

--Deseamos saber el tiempo de operación por IDLocacion
SELECT 
 t.IDLocacion,
 SUM(t.TiempoProceso)
  AS TotalTiempoProceso
FROM
 @TablaTiempo t
GROUP BY
 IDLocacion;
 

--Descripción del Error --El tipo de datos time del operando no es válido para el operador sum. --Operand data type time is invalid for sum operator.
Entonces, para poder corregirlo y darle solución debemos de realizar lo siguiente:


SELECT 
 t.IDLocacion,
 CAST(DATEADD(
 ms, 
 SUM(DATEDIFF(ms, '00:00:00.000', t.TiempoProceso)), 
 '00:00:00.000') AS time(7)) 
  AS TotalTiempoProceso
FROM
 @TablaTiempo t
GROUP BY
 IDLocacion;


--Obtenemos los siguientes resultados --IDLocacion TotalTiempoProceso --1 08:10:35.0000000 --2 01:02:01.0000000 --3 00:05:15.0000000
Disfruten!


Saludos!

SQL Server: Leer Archivos XML usando TSQL, How to read XML Files using TSQL

| jueves, 30 de mayo de 2013



SQL Server: Leer Archivos XML usando TSQL, How to read XML Files using TSQL 

Que tal  amigos, veremos cómo podemos leer archivos XML usando SQL Server, los archivos XML son muy útiles en muchos casos en particular, podemos usarlos para transferir datos entre aplicaciones, almacenar información adicional en columnas de tipo XML, entre otros casos más, desde la versión 2005 SQL Server ofrece un nuevo tipo de dato llamado XML, por lo cual si usan SQL Server 2005 o superior les recomiendo usar este tipo de dato y con él sus métodos.
 En el presente ejemplo veremos como leer un archivo XML sin tipo, este es un archivo no tiene un namespace que lo asocie a un esquema que valide los datos,

Como leer archivos XML sin namespace, Leer archivos XML sin tipo

 Tenemos el siguiente Archivo XML:

<ConfirmMessageKidaph NumeroEnvio="259870" >
  <NodoDetalle secuencia="0" 
 Codigo="KD-SEND-80103" Destino="Flour">
    <NodoAccion TipoAccion="F"/>
  </NodoDetalle>
  <NodoDetalle secuencia="1" 
 Codigo="KD-SEND-00048" Destino="Cable INC">
    <NodoAccion TipoAccion="F">
      <NodoFecha Estado="confirmado"
  year="2013" day="15" month="1" hour="8"
  min="30"/>
    </NodoAccion>
  </NodoDetalle>
</ConfirmMessageKidaph>


Para realizar la lectura en SQL Server realizar lo siguiente:

USE TEMPDB
GO

DECLARE @strXML xml;
SET @strXML ='
<ConfirmMessageKidaph NumeroEnvio="259870" >
  <NodoDetalle secuencia="0" 
 Codigo="KD-SEND-80103" Destino="Flour">
    <NodoAccion TipoAccion="F"/>
  </NodoDetalle>
  <NodoDetalle secuencia="1" 
 Codigo="KD-SEND-00048" Destino="Cable INC">
    <NodoAccion TipoAccion="F">
      <NodoFecha Estado="confirmado"
  year="2013" day="15" month="1" hour="8"
  min="30"/>
    </NodoAccion>
  </NodoDetalle>
</ConfirmMessageKidaph>'


SELECT
    A.n.value('@NumeroEnvio[1]', 'varchar(20)') AS NumeroEnvio,
    B.n.value('@secuencia[1]', 'varchar(10)') AS secuencia, 
    B.n.value('@Codigo[1]', 'varchar(20)') AS Codigo,
    B.n.value('@Destino[1]', 'varchar(30)') AS Destino,
    C.n.value('@TipoAccion[1]', 'varchar(20)') AS TipoAccion,
    D.n.value('@Estado[1]', 'varchar(20)') AS [Estado],
    D.n.value('@year[1]', 'varchar(20)') AS [year],
    D.n.value('@day[1]', 'varchar(20)') AS [day],
    D.n.value('@month[1]', 'varchar(20)') AS [month],
    D.n.value('@hour[1]', 'varchar(20)') AS [hour],
    D.n.value('@min[1]', 'varchar(20)') AS [min]
FROM
    @strXML.nodes('/ConfirmMessageKidaph') AS A(n)
    OUTER APPLY
    A.n.nodes('NodoDetalle') AS B(n)
    OUTER APPLY
    B.n.nodes('NodoAccion') AS C(n)
    OUTER APPLY
    C.n.nodes('NodoFecha') AS D(n);

GO


Si usas una versión inferior a SQL Server 2005, tenemos que usar OPENXML, hagan lo siguiente:
USE TEMPDB
GO

DECLARE @strXML varchar(max);
SET @strXML ='
<ConfirmMessageKidaph NumeroEnvio="259870" >
  <NodoDetalle secuencia="0" Codigo="KD-SEND-80103" Destino="Flour">
    <NodoAccion TipoAccion="F"/>
  </NodoDetalle>
  <NodoDetalle secuencia="1" Codigo="KD-SEND-00048" Destino="Cable INC">
    <NodoAccion TipoAccion="F">
      <NodoFecha Estado="confirmado" year="2013" day="15" month="1" hour="8" min="30"/>
    </NodoAccion>
  </NodoDetalle>
</ConfirmMessageKidaph>
'

DECLARE @IdDoc int;
EXEC sp_xml_preparedocument @IdDoc OUTPUT, @strXML
        SELECT * 
        FROM  OPENXML (@IdDoc, '/ConfirmMessageKidaph/NodoDetalle/NodoAccion', 1)
                WITH (
                      [NumeroEnvio]  varchar(20) '../../@NumeroEnvio',
                      [secuencia]  varchar(10) '../@secuencia',
                      [Codigo] varchar(20) '../@Codigo',
                      [Destino] varchar(30) '../@Destino',
                      [TipoAccion] varchar(20) '@TipoAccion',
                      [Estado] varchar(20) 'NodoFecha/@Estado',
                      [year] varchar(20) 'NodoFecha/@year',
                      [day] varchar(20) 'NodoFecha/@day',
                      [month] varchar(20) 'NodoFecha/@month',
                      [hour] varchar(20) 'NodoFecha/@hour',
                      [min]  varchar(20) 'NodoFecha/@min'
                      );

EXEC sp_xml_removedocument @IdDoc;
GO


Esta forma quita performance, además al final no deben de olvidar usar la sentencia sp_xml_removedocument ya que el documento analizado utiliza la octava parte de la memoria total asignada a SQL Server, así que liberen memoria.


EXEC sp_xml_removedocument @IdDoc;


Así que si tiene SQL Server 2005 o superior usen el tipo de datos XML.

Espero les haya servido, cualquier pregunta, no duden en hacerla.

Referencia: Herbert Mendoza (http://litigiouslobo.blogspot.com/)
 


Microsoft Active Professional 2013 (MAP)

| sábado, 23 de marzo de 2013


Después de una larga temporada, inicio este mes con un reconocimiento como Microsoft Active Professional (MAP), esta distinción se le otorga sólo al top 5% de la comunidad de Profesionales de IT que por su constante esfuerzo, participación y capacitación en tecnologías Microsoft se destaca por sobre el resto de los profesionales realzando día a día el valor de esta comunidad.

Parte del mensaje de Microsoft:



ERES UN MICROSOFT ACTIVE PROFESSIONAL

El equipo de Microsoft Perú felicita y agradece tu constante esfuerzo por participar activamente en nuestros programas de entrenamiento y presentación de productos en los últimos meses.

Por esta razón y porque valoramos tu compromiso por mantenerte actualizado te otorgamos el diploma MAP (Microsoft Active Professional) que demuestra que eres un profesional preocupado por mantenerte al dia y participas activamente de la comunidad técnica existente alrededor de la tecnología Microsoft.

Desde aquí, muchas gracias:


Algo más:

La primera Iniciativa de MAP será la creación de un grupo en Linkedin:
El objetivo es reunir en este ámbito a los Microsoft Active Professionals para ofrecer un espacio de interacción entre los profesionales más interesados y de activa participación, con el objetivo de compartir experiencias, ideas, información, novedades y opiniones.
Este grupo es cerrado y exclusivo para los Microsoft Active Professionals, más otros profesionales destacados como MVPs o evangelistas de Microsoft que creemos pueden aportarles valor.


Saludos
Herbert Mendoza