none
EJECUTAR ARCHIVOS O SCRIPT DE EXTENSIÓN .SQL DESDE SQL SERVER 2005 Ó 2008

    Question

  • Hola a todos

     

    Quiero saber como pruebo crear por medio de un procedimiento almacenado, ejecutar un Script en una ruta de mi equipo, es decir, quiero como parametro que entre la ruta, y que ejecute lo que haya en esta ruta, que es este caso lo hare para un a archivo .sql.

     

    Esto se puede?....

    Muchas gracias. Creo que es muy sencillo y que ustedes me ayudaran.

    Tuesday, February 22, 2011 6:10 PM

Answers

  • Si se puede. Bueno, primero tienes que habilitar el xp_cmdshell que es un procedimiento para ejecutar la línea de comandos. Es posible que lo necesites habilitar con esto:

    Paso 1
    --Activa las funciones avanzadas de configuracion de SQL SERVER
    sp_configure 'show advanced options','1'
    RECONFIGURE WITH OVERRIDE;

    Paso 2
    --Activa el procedimiento almacenado xp_cmdshell
    sp_configure 'xp_cmdshell','1'
    RECONFIGURE WITH OVERRIDE;

    Luego, con el xp_cmdshell llamas a un archivo .sql con algo así como esto:

    xp_cmdshell 'sqlcmd -i c:\archivo.sql'

    Avisame si te falla algo.

     


    MVP MCT MCTS Daniel Calbimonte

    http://elpaladintecnologico.blogspot.com
    Tuesday, February 22, 2011 7:10 PM
  • use Factu01
    select * from abreviatura, campanas, catalogo
    En vez de ese contenido, haz este:
    use Factu01
    GO
    select * from abreviatura, campanas, catalogo
    Te falta un GO

    MVP MCT MCTS Daniel Calbimonte

    http://elpaladintecnologico.blogspot.com
    Tuesday, February 22, 2011 8:02 PM
  •  Hola.

     No nos has comentado con que version de SQL, estas trabajando.

     Pero, sobretodo si es SQL 2005/8, antes de tirar por la via mas facil, valora hacerlo con CLR y SQL Server (ADO.NET), me parece mas interesante que a usar xp_cmdshell para ejecutar sqlcmd...


    Common Language Runtime (CLR) es el núcleo de Microsoft .NET Framework y proporciona el entorno de ejecución de todo el código de .NET Framework. El código que se ejecuta en CLR se conoce como código administrado. El CLR proporciona diversas funciones y servicios necesarios para la ejecución de los programas, como compilación just-in-time (JIT), asignación y administración de memoria, aplicación de la seguridad de tipos, control de excepciones, administración de subprocesos y seguridad.

    Con el CLR hospedado en Microsoft SQL Server (lo que se denomina integración con CLR), puede crear procedimientos almacenados, desencadenadores, funciones definidas por el usuario, tipos definidos por el usuario y agregados definidos por el usuario en código administrado. Como el código administrado se compila a código nativo antes de su ejecución, en algunas situaciones puede conseguir aumentos significativos del rendimiento.

    El código administrado utiliza seguridad de acceso del código (CAS), vínculos a código y dominios de aplicación para impedir que los ensamblados realicen determinadas operaciones. SQL Server 2005 utiliza CAS para ayudar a proteger el código administrado e impedir que el sistema operativo o el servidor de bases de datos se pongan en peligro.

    http://msdn.microsoft.com/es-es/library/6s0s2at1(v=vs.80).aspx

    http://msdn.microsoft.com/es-es/library/6s0s2at1(v=vs.80).aspx

     


     Norman M. Pardell 

    ||Microsoft Certified IT Professional|| Database Administrator. Database Developer. SQL Server 2008

    Wednesday, February 23, 2011 7:50 AM

All replies

  • Si se puede. Bueno, primero tienes que habilitar el xp_cmdshell que es un procedimiento para ejecutar la línea de comandos. Es posible que lo necesites habilitar con esto:

    Paso 1
    --Activa las funciones avanzadas de configuracion de SQL SERVER
    sp_configure 'show advanced options','1'
    RECONFIGURE WITH OVERRIDE;

    Paso 2
    --Activa el procedimiento almacenado xp_cmdshell
    sp_configure 'xp_cmdshell','1'
    RECONFIGURE WITH OVERRIDE;

    Luego, con el xp_cmdshell llamas a un archivo .sql con algo así como esto:

    xp_cmdshell 'sqlcmd -i c:\archivo.sql'

    Avisame si te falla algo.

     


    MVP MCT MCTS Daniel Calbimonte

    http://elpaladintecnologico.blogspot.com
    Tuesday, February 22, 2011 7:10 PM
  • Ejecute linea por linea.

     

    Trate de hacer una prueba normalita.

    Cree un archivo .sql que tiene estos comandos

     

    use Factu01
    select * from abreviatura, campanas, catalogo
    
    Luego de eso en una consulta ejecuto la linea 
    xp_cmdshell 'sqlcmd -i D:\prueba.sql'
    
     y me aparece las siguientes filas:

    1. Mensaje 911, Nivel 16, Estado 1, Servidor DESARROLLO, Línea 1

    2. No se encuentra en sysdatabases la entrada de la base de datos 'Factu01'. Asegúrese de que ha escrito el nombre correctamente.

    3. NULL

     

    En la fila 2, parece ser que si quiere leer el archivo, pero dice que la base de datos no esta bien, pero aparte yo ejecuto el archivo .sql y si ejecuta, que puede ser, acaso no es la estrucura correcta para hacerlo?

     

    Te agredezco mucho tu informacion y tu ayuda. Gracias.

    Tuesday, February 22, 2011 7:45 PM
  • use Factu01
    select * from abreviatura, campanas, catalogo
    En vez de ese contenido, haz este:
    use Factu01
    GO
    select * from abreviatura, campanas, catalogo
    Te falta un GO

    MVP MCT MCTS Daniel Calbimonte

    http://elpaladintecnologico.blogspot.com
    Tuesday, February 22, 2011 8:02 PM
  •  Hola.
     ¿Por qué quiere ejecutar un .sql desde un procedimiento almacenado, (o desde SQL…)?.

     Yo solo habilitaría xp_cmdshell, si fuera estrictamente necesario y como última opción. Ya que xp_cmdshell está deshabilitado de forma predeterminada, por razones de seguridad. Por darte un ejemplo; usuarios malintencionados pueden intentar darse o elevar sus privilegios, dentro del sitema, utilizando xp_cmdshell…

     Si decides habilitarlo, no dejes que lo ejecute una aplicación con un usuario que pertenezca a la función fija de servidor sysadmin, ya que de esta forma utiliza la cuenta de servicio del SQL Server, para ejecutar los comandos del sistema.

     Usa un usuario que no pertenece a la función fija de servidor sysadmin, para ejecutar xp_cmdshell, de esta forma se conecta a Windows con el nombre de cuenta y contraseña, almacenadas en la credencial con el nombre ##xp_cmdshell_proxy_account##. para crear la credencial de cuenta de proxy, debes ejecutar sp_xp_cmdshell_proxy_account. Como argumentos, este procedimiento almacenado utiliza un nombre de usuario y una contraseña de Windows.
     
     Ejemplo:
     
                Exec sp_xp_cmdshell_proxy_account 'Dominio_o_maquina\Usuario', 'PasswDeUsuario'

     Si no pertenecemos a la función fija de servidor sysadmin solo debemos tener permiso de ejecución en el procedimiento almacenado xp_cmdshell (en la base de datos master ), y no hace falta asignar el permiso CONTROL SERVER como dice la ayuda, donde podremos ver ejemplos de su uso:
     
     http://msdn.microsoft.com/en-us/library/ms175046.aspx


     Norman M. Pardell 

    ||Microsoft Certified IT Professional|| Database Administrator. Database Developer. SQL Server 2008

    Tuesday, February 22, 2011 10:06 PM
  • Si, entonces como hago si que tenga que habilitar  xp_cmdshell ??...

     

     

    Gracias de antemano


    Tuesday, February 22, 2011 10:33 PM
  • Hola.

    Como Norman te está preguntando, no nos estás contando el motivo por el cual debes ejecutar un script desde un procedimiento almacenado. Lo cierto es que mucho sentido no parece tener. ¿Quién o qué invocará luego a ese procedimiento que a su vez ejecutará otro script? Si es una aplicación, por ejemplo, sería mucho más fácil y seguro que se ejecutara directamente el script.

     


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    Tuesday, February 22, 2011 10:40 PM
  • Hola que pena no decirles el porque.

     

    El problema lo posee una empresa a la cual le estamos ayudando, ellos realizan una transformacion (Cobol - Sql Server) , y ya generamos la base de datos, las vistas, un procedimiento almacenado (este genera los saldos ) y las funciones por usuario.

     

    funciones, procedimiento y vistas lo tenemos generados en Scripts , por lo que este proceso lo tenemos que hacer por año en la empresa,  pero hemos tenidos problemas con la transformacion, porque lo datos no concuerdan y al realizar este procedimiento manual :

    1. Ejecutar dos lineas de codigo que verifica si existen las vistas.

    2. borrar vistas, funciones , procedimientos 

    3. Luego ejecutar los script de las funciones , vistas y procedimientos desde cero

    Y luego ejecutamos la carga de datos, que llenará las tablas de la base de datos y asi nos cuadra la informacion del cliente, esto hay que hacerlo casi todos los dias, mientras encontramos una solucion del porque esto, tenemos que hacer esto,  y es porque eso que quiero hacer un procedimineto que me haga estos pasos (que sea solo ejecutar .bat).

    Esto nos funciona, pero no se que ocurre en la noche que al otro día tenemos que hacer lo mismo.

    Los Script son algo largos, por eso quería ejecutarlo desde esa ruta y ubicarlos en una parte del servidor donde la ruta casi nunca se moverá.

     

    ES ESTE EL MOTIVO DEL PORQUE QUIERO SABER COMO EJECUTAR UN ARCHIVO DE EXTENSION .SQL DESDE SQL SERVER.

    O copiar y pegar el codigo, pero quiero la ruta, por un lado porque quiero aprender y por otro es que puedo modificar los Scripts y solo es ejecutar el procedimiento y por orden.

     

    Gracias a todos.

    Tuesday, February 22, 2011 11:02 PM
  •  Hola.

     No nos has comentado con que version de SQL, estas trabajando.

     Pero, sobretodo si es SQL 2005/8, antes de tirar por la via mas facil, valora hacerlo con CLR y SQL Server (ADO.NET), me parece mas interesante que a usar xp_cmdshell para ejecutar sqlcmd...


    Common Language Runtime (CLR) es el núcleo de Microsoft .NET Framework y proporciona el entorno de ejecución de todo el código de .NET Framework. El código que se ejecuta en CLR se conoce como código administrado. El CLR proporciona diversas funciones y servicios necesarios para la ejecución de los programas, como compilación just-in-time (JIT), asignación y administración de memoria, aplicación de la seguridad de tipos, control de excepciones, administración de subprocesos y seguridad.

    Con el CLR hospedado en Microsoft SQL Server (lo que se denomina integración con CLR), puede crear procedimientos almacenados, desencadenadores, funciones definidas por el usuario, tipos definidos por el usuario y agregados definidos por el usuario en código administrado. Como el código administrado se compila a código nativo antes de su ejecución, en algunas situaciones puede conseguir aumentos significativos del rendimiento.

    El código administrado utiliza seguridad de acceso del código (CAS), vínculos a código y dominios de aplicación para impedir que los ensamblados realicen determinadas operaciones. SQL Server 2005 utiliza CAS para ayudar a proteger el código administrado e impedir que el sistema operativo o el servidor de bases de datos se pongan en peligro.

    http://msdn.microsoft.com/es-es/library/6s0s2at1(v=vs.80).aspx

    http://msdn.microsoft.com/es-es/library/6s0s2at1(v=vs.80).aspx

     


     Norman M. Pardell 

    ||Microsoft Certified IT Professional|| Database Administrator. Database Developer. SQL Server 2008

    Wednesday, February 23, 2011 7:50 AM
  • qwalgrande tiene razón. No deberías necesitar un procedimiento que llame a un .sql

    Lo más práctico es que vayas al Agente de SQL Server y ahí llamas a las sentencias.

    En el agente de SQL Server creas un trabajo (job en inglés ) y ahi creas pasos (steps) para borrar, crear tablas y luego cargarlas.

    La ventaja del job es que lo puedes programar para que corra automáticamente a la hora que tu quieras.

    Deberías ejecutar la sentencia directamente.

    Para verificar si un objeto existe se usa esto:

    USE Facto01;
    GO
    IF OBJECT_ID ( 'dbo.tabla1', 'U' ) IS NOT NULL
        DROP TABLE dbo.tabla1;
    GO
    CREATE dbo.Tabla1.....

    Lo que hace este código es verificar si la tabla de Usuario (U de user table) no es nulo. Es decir, si la tabla existe borrarla (drop). Y luego crea la tabla.

     

     

     

     


    MVP MCT MCTS Daniel Calbimonte

    http://elpaladintecnologico.blogspot.com
    Wednesday, February 23, 2011 3:58 PM