Published on

June 30, 2024

Manejo de acceso de lectura y escritura a archivos de texto en SQL Server

Como desarrollador de bases de datos o DBA, es posible que a menudo te encuentres con la necesidad de manejar el acceso de lectura y escritura a archivos de texto en SQL Server. Ya sea para fines de documentación o para procesar datos, tener un enfoque común para manejar el contenido de archivos de texto puede ser extremadamente útil. En este artículo, exploraremos una solución utilizando la biblioteca de clases del Framework .NET en SQL Server.

El espacio de nombres System.IO

La biblioteca de clases del Framework .NET proporciona el espacio de nombres System.IO, que contiene tipos que admiten la lectura y escritura de archivos y flujos de datos. Para el acceso a archivos de texto, las dos clases más utilizadas son la clase StreamReader y la clase StreamWriter, junto con sus métodos correspondientes, ReadLine y WriteLine respectivamente.

Escritura en un archivo de texto

Comencemos viendo lo fácil que es agregar información a un archivo de texto usando SQL Server. Podemos crear una función CLR llamada WriteTextFile, que recibe el texto que se va a escribir, la ruta del archivo y un parámetro para determinar si los datos deben agregarse al archivo o sobrescribirlo si ya existe.

CREATE FUNCTION [dbo].[WriteTextFile](
    @text [nvarchar](max), 
    @path [nvarchar](max), 
    @append [bit])
RETURNS [bit] WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [TextFileTips].[ReadWriteFileTips].[WriteTextFile]

La función WriteTextFile utiliza la clase StreamWriter para inicializar una nueva instancia para la ruta de archivo especificada. Luego, escribe el texto especificado seguido de un terminador de línea. Si el archivo no existe, se crea un archivo nuevo. Si el archivo existe y el parámetro append es verdadero, los datos se agregan al archivo. Si el parámetro append es falso, el archivo se sobrescribe.

Lectura desde un archivo de texto

Además de escribir en un archivo de texto, también podemos leer el contenido de cualquier archivo de texto existente utilizando un procedimiento almacenado llamado ReadTextFile.

CREATE PROCEDURE [dbo].[ReadTextFile]
    @path [nvarchar](max)
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [TextFileTips].[ReadWriteFileTips].[ReadTextFile]

El procedimiento almacenado ReadTextFile utiliza la clase StreamReader para inicializar una nueva instancia para la ruta de archivo especificada. Luego, lee el contenido del archivo línea por línea y envía cada línea de vuelta al cliente utilizando el método SqlContext.Pipe.SendResultsRow.

Implementación del código

Para utilizar el código de ejemplo en tu base de datos de SQL Server, debes seguir estos pasos:

  1. Configura tu instancia de SQL Server para CLR si aún no está configurada.
  2. Crea tu base de datos de prueba o elige una existente.
  3. Guarda el código del artículo en un archivo .cs y compílalo a un DLL.
  4. Registra el DLL como una assembly en SQL Server.
  5. Crea las funciones y procedimientos necesarios a partir de la assembly.

Ejemplo de uso

Una vez que el código esté implementado, puedes comenzar a usar la función WriteTextFile y el procedimiento almacenado ReadTextFile para manejar las operaciones de lectura y escritura de archivos de texto. Aquí tienes un ejemplo:

SELECT dbo.WriteTextFile(
    'texto1', 'C:\MSSQLTips\Line.txt', 0)
-- devuelve 1

SELECT dbo.WriteTextFile(
    'texto2', 'C:\MSSQLTips\Line.txt', 1)
-- devuelve 1

SELECT dbo.WriteTextFile(
    'texto3', 'C:\MSSQLTips\Line.txt', 1)
-- devuelve 1

EXEC ReadTextFile 'C:\MSSQLTips\Line.txt'
-- imprime
-- Línea
-- ----------------
-- texto1
-- texto2
-- texto3

Con este enfoque, puedes manejar fácilmente el acceso de lectura y escritura a archivos de texto en SQL Server, lo que te permite realizar diversas operaciones como registrar los resultados de la ejecución de procedimientos o procesar datos de fuentes externas.

Recuerda configurar tu instancia de SQL Server para CLR y asegurarte de que los permisos necesarios estén configurados para la base de datos donde implementas el código.

¡Feliz codificación!

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.