none
Mejor Aproximación para llamar un .bat o .exe al llamar a un procedimiento almacenado RRS feed

  • Pregunta

  • Buenas tardes, mi pregunta es la siguiente, necesito imprimir un documento inmediatamente después de que se corre un procedimiento almacenado, ahora bien lo hice llamando un .bat con el comando master..xp_cmdShell PRINT archivo.txt /d:lpt1, se imprime pero me lo imprime en formato crudo (RAW) es decir no tengo control sobre los tabuladores ni tamaño de fuente ni tipo de fuente ni siquiera el caracter de fin de linea, ahora bien al intentar ejecutar el comando master..xp_cmdShell 'Start notepad archivo.txt' ( con el comando para imprimir el documento, solo que ahora no lo recuerdo ), me genera el problema que se cuelga porque obviamente esta llamando a un archivo GUI desde TSQL lo cual hace que el servidor casi se cuelgue, he leído y en ciertos lugares mencionan la de usar un job para llamar a ese .bat o .exe pero mi duda es que al crear un job lo programo para que se ejecute cada cierto tiempo, pero eso no es lo que requiero en mi caso porque incluso aunque lo mande a ejecutar cada 1 minuto, es tiempo suficiente para que se generen mas documentos y la respuesta deja de ser tan inmediata como se quiere y no se que pueda realizar para llevar a cabo tal fin.

    Alguien sabe cual es la mejor aproximacion que debo tomar para realizar esto y que se ejecute el .bat que mandara a imprimir el documento de manera inmediata despues de llamar al procedimiento almacenado ???

    Saludos
    lunes, 17 de diciembre de 2012 21:32

Respuestas

Todas las respuestas

  • Porque simplemente no utilizas una aplicación, podrias hacerlo con .net.. O desde la misma aplicación que invoca la ejecución del SP que mencionas, o acaso se ejecuta dicho SP sin intervension humana?
    lunes, 17 de diciembre de 2012 23:32
  • lo que pasa es que la aplicación que esta haciendo la llamada al SP es una aplicación de un tercero, no puedo acceder a su código fuente ni realizar cambio alguno sobre su funcionamiento interno, sin embargo esta te deja un procedimiento almacenado con el cual se puede realizar cualquier tipo de validaciones antes de añadirlo a la base de datos, por lo que ese es mi único punto de entrada.
    martes, 18 de diciembre de 2012 0:09
  • Ok entiendo, podrias considerar hacer una aplicacion de consola que se encargue de crear los documentos que necesitas..
    martes, 18 de diciembre de 2012 0:23
  • lo intente, de hecho ya tengo la aplicación creada, pero cuando la llamo desde el SP con la siguiente forma

    master..xp_cmdShell 'start c:\ruta_aplicacion\aplicacion_consola.exe "ruta_archivo_txt_a_imprimir.txt" /quiet'

    lo ejecuto y no hace absolutamente nada desde el TSQL pero si lo ejecuto desde la consola de comando del servidor si lo imprime y no se si es que los procedimientos almacenados no ejecutan llamadas a .exe o es algún otro detalle que me falta 

    martes, 18 de diciembre de 2012 0:36
  • Es posible que tengas algun problema con la aplicacion en si, fijate he creado una app de ejemplo que escribe un fichero en un path estatico

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    
    namespace text
    {
        class Program
        {
            static void Main(string[] args)
            {
                
                try
                {
                    Console.Write("preparando");
                    using (StreamWriter sw = new StreamWriter("D:\\VMs\\TestFile.txt"))
                    {
                        sw.WriteLine("Este es un ejemplo para el MSDN ");
                        sw.WriteLine("-------------------");
                        sw.Write("La fecha es: ");
                        sw.WriteLine(DateTime.Now);
                    }
                    Console.Write("listo");
                }
                catch (Exception ex)
                {
                    Console.Write(ex.Message);
                }
            }
        }
    }
    

    Lo ejecuto sin problemas desde TSQL asi

    execute master..xp_cmdshell '"C:\Users\GeekZero\Documents\visual studio 2010\Projects\text\text\bin\Debug\text.exe"'

    Te aparece algun error? o quiza tengas problemas de permisos ya que el usuario de Sql Server normalmente no tiene permiso para casi ninguna carpeta de la maquina.


    martes, 18 de diciembre de 2012 1:02
  • la aplicación que programe solo se encarga de mandar a imprimir el txt ya que el archivo que mando a imprimir lo creo desde el mismo TSQL ya que son pocas columnas, no creo que sea problemas de permisos ya que me permite escribir un archivo, quizás solo tengo permisos de escritura mas no de lectura, tendría que revisar a ver, pero lo curioso es que desde la consola de comando con la misma cadena que indico en el TSQL funciona de maravilla, pero desde el TSQL me arroja NULL la llamada "master..xp_cmdshell" es decir no me arroja nada de errores sin embargo no hace nada y si fuese problema de programación no funcionaria desde la consola tampoco
    martes, 18 de diciembre de 2012 1:08
  • Hola.

    Has de tener en cuenta que si lo ejecutas desde TSQL, lo está ejecutando la cuenta que arranca el servicio de SQL Server. Y no tienes interfaz, con lo que puede ser que estés esperando una interacción del usuario que no se producirá.

    Yendo a la raíz del problema, es poco recomendado que realices este tipo de operaciones desde SQL Server. Se puede lograr cualquier cosa (o casi), otra cosa es que sea buena idea. 


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    martes, 25 de diciembre de 2012 19:41
    Moderador
  • Hola.

    ¿Resolvimos tus dudas?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    martes, 1 de enero de 2013 19:45
    Moderador