top of page
Search
  • Writer: Victor Escott
    Victor Escott
  • Dec 27, 2018
  • 2 min read

Updated: Jan 5, 2019

Este es uno de los conceptos más desafiantes que tuve que aprender cuando comencé a trabajar con SQL.


No me avergüenza confesar que me tomó algo de tiempo asimilar la forma en que SQL Server procesa su código y esto se debe a que SQL Server no procesa el código de arriba para abajo (como la mayoría de los lenguajes de programación).

Soy un DBA por Accidente, por lo que esperaba que SQL Server procesara el código como lo hacen otros lenguajes de programación.

El “keyed-in order"

Este es el orden en el que se supone que debes escribir las cláusulas de consulta. Por favor ver más abajo.


Fases lógicas para El procesamiento de consultas

Aquí es donde comienza la diversión y esto es porque el orden de procesamiento de la consulta es diferente. Comienza con la cláusula FROM.


Aquí está la misma consulta basada en el "orden lógico":

  1. Cada fase opera en una o más tablas como entradas y devuelve una tabla virtual como salida.

  2. La tabla de salida de una fase es la entrada a la siguiente fase.

  3. El último paso devuelve el resultado final de la consulta.

Si aprendez de forma visual como yo, dale una mirada a el diagrama de flujo de Itzik Ben-Gan para "Logical Query Processing".

Ejemplos:

Un error común es tratar de usar un ALIAS en la cláusula WHERE, esto generará un error porque la cláusula SELECT se evalúa después de una cláusula WHERE, por lo que la cláusula WHERE no conoce el alias de la columna.

Por otro lado, podemos usar ALIAS en la cláusula ORDER BY ya que se evalúa después de la cláusula SELECT.

Usando un poco de todo basado en las siguientes reglas:

GROUP BY se procesa antes de el SELECT (no podemos usar el alias aquí)

HAVING se procesa antes de elSELECT (no podemos usar el alias aquí, pero podemos usar COUNT)

ORDEN BY se procesa después de elSELECT (podemos usar el alias aquí)

¡Diviértanse aprendiendo!

En este post, veremos:

  • ¿Cómo hacer una insercion masiva en SQL Server usando el tipo de datos XML?

  • ¿Cómo automatizamos el proceso?

  • Crea un SP automáticamente para manejar la inserción de datos.

  • Transformar una DataTable a XML.

Antecedentes

A veces, es necesario insertar registros de forma masiva en la base de datos, este proceso es muy simple cuando tenemos acceso directo a la base de datos, pero ¿qué sucede cuando tenemos que extraer los datos de un Servicio Web, un Servicio ASP o una RESTful API?


Aquí es cuando comienzo a ver todo tipo de cosas creativas, como insertar uno por uno cada registro que se extrajo de la llamada, crear un script sobre la marcha, etc.

El Argumento

  • Tenemos un servicio web que devuelve un DataSet (.NET)

  • El esquema de la tabla de datos podría cambiar en cualquier momento sin previo aviso.

  • Tenemos que extraer los datos de varios servidores web.

¿Cómo hacer una insercion masiva en SQL Server usando el tipo de datos XML?


Insertemos algunos datos basados en el siguiente XML:


XQuery en SQL Server es un lenguaje estático. Por lo tanto, para reducir el tipo estático y garantizar que exista, como máximo, un valor, se debe usar el predicado posicional [1] para indicar explícitamente que la expresión devuelve un solo valor.
TIP: Las mayúscula y minúsculas en XML son muy importantes (distingue entre mayúsculas y minúsculas). Las etiquetas de apertura y cierre deben coincidir exactamente. Por ejemplo, <ROOT>, <Root> y <root> son tres etiquetas diferentes.

Leamos el XML e insertemos algunos datos.

Voila, tenemos datos listos para ser consultados, fue muy simple ¿no? Bueno, esto es verdad si tenemos que crear el script solo una vez y dicho script no tiene más de 10 columnas, pero ¿qué sucede cuando tiene varios archivos XML con diferentes esquemas, muchos datos y cada uno va a una tabla diferente? Sí, que será una molestia crear el script, verificar cada tipo de datos y crear todas las tablas.


No te preocupes, te tengo una solución!

El problema

  • Tenemos que extraer algunos datos de varios servidores, pero no tenemos acceso a la base de datos.

  • El equipo de IT encontró una solución muy inteligente, por lo que en lugar de permitir el acceso a la base de datos, crearon un servicio web que regresa un DataSet con una sola tabla. ¡¡Esos de IT son geniales!! :P

  • El equipo de IT proporcionó una imagen del conjunto de datos, esto es lo que debemos obtener cuando llamemos el servicio web, consulte a continuación.


La solución

Lo sé… le dije que tenía una solución, pero aun asi tienes que trabajar un poco para que esto funcione. Lo único que tienes que hacer es crear la tabla de destino basada en la imagen, sí la que vas a usar para almacenar los datos, luego .NET se encargará del resto.


Vamos a crear la tabla de destino.



¿Ahora que?

Tenemos que crear la consulta para insertar los datos, pero esta vez vamos a dejar que .NET haga el trabajo por nosotros, así que he creado un pequeño programa donde puede pasar el nombre de la tabla y el regresara un procedimiento almacenado que corresponde con el esquema de la tabla. Consulte a continuación.

Stored Procedure:

Tenga en cuenta que el xPath es estático “NewDataSet/XMLData”.

.NET Código Fuente.

Esto ejecuta una consulta en mi base de datos:


Esto hace el trabajo:


¿Qué pasa con los datos?

Bueno, los datos no son XML, por lo que tenemos que convertir el DataTable a XML, tengo una función que se encarga de esto. Por favor ver más abajo.

Aquí hay una muestra del XML después de la conversión:

Tenemos los datos, ¿ahora qué?

Tenemos que insertar los datos en SQL ... Sí, tengo otra función que se encarga de esto, tiene que pasar el DataTable y el nombre del SP. Por favor ver más abajo.

Sí, hemos terminado, ahora podemos obtener datos del servicio web y hacer una inserción masiva enSQL.

Esta solución funciona muy bien para archivos de tamaño pequeño / mediano, por lo que cualquier cosa de menos de 2GB se insertará muy rápido. Todo lo que supere los 2GB no funcionará con seguridad, en estas circunstancias, SQLXML Bulk Loader es la mejor solución. Trataré de cubrir esto en mis próximas publicaciones.

Extra

Vamos a hacer algunas pruebas con el programa final, vamos a insertar 300K filas de forma aleatoria en la base de datos.

La inserción de datos tomó un promedio de 6 segundos, por lo que no es tan malo.


Revisemos los datos.


Conclusión

Bienvenido al mundo XML, esta es una opción valiosa cuando desea insertar datos de forma masiva desde un servicio web, un servicio ASP o una API RESTful.


¡Diviértanse aprendiendo!

  • Writer: Victor Escott
    Victor Escott
  • Dec 6, 2018
  • 2 min read

Updated: Dec 14, 2018

Hace un par de años encontré una pequeña utilidad llamada tablediff, una herramienta bastante útil que le permite comparar los datos en dos tablas para identificar discrepancias.

¿Dónde encontrarlA?

Puedes localizarlo utilizando.



¿Cómo usarla?

La sintaxis es muy simple y se explica por sí misma.

Preparemos el entorno de trabajo, para ello ejecute el siguiente script para crear dos tablas.



Observe que ambas tablas se crearon en la misma instancia, pero podemos comparar tablas que se encuentren en instancias / servidores diferentes.

Ahora vamos a hacer una comparación muy sencilla, debería quedar algo así:


Observe que utilicé mi inicio usuario de Windows, pero también podemos especificar un nombre de usuario y una contraseña.

Si ejecutamos el comando tablediff, nuestros resultados se verían así:

Generar T-SQL Scripts

Una de las características más interesantes de la utilidad tablediff es la capacidad de generar scripts de T-SQL para hacer que la tabla en el destino se sincronice con la tabla fuente.

Ejecutemos el siguiente comando y veamos que pasa.

-f [nombre_archivo] Opcionalmente, se puede especificar un nombre y una ruta para generar un archivo T-SQL. Si no se especifica file_name, el archivo se generara en el directorio donde se ejecuta la utilidad.


Voila ahora tenemos un archivo .sql con las instrucciones INSERTS y UPDATES para actualizar la tabla destino.



Aprovecha esta utilidad al máximo

He estado trabajando mucho con instancias de SQL Express, así que construí un pequeño programa en .NET que se ejecuta todas las noches, ejecuta el comando tablediff en PowerShell y se encarga de la replicación que no está disponible en SQL Express (solo puedes configurar la instancia como suscriptor). Voy a compartir más sobre esto mis próximos post.

Nota: Yo soy consciente de que podemos lograr el mismo resultado utilizando las SQL Server Data Tools (SSDT), pero creo que TableDiff es una herramienta muy útil.

¡Diviértanse aprendiendo!

© 2018 by Victor Escott.

bottom of page