viernes, 3 de abril de 2009

SQLCMD la línea de comandos para SQL Server

network monitoring Powershell SQL Server Visualcert Seguridad Herramientas google

Esto esta dedicado a la gente que necesita automatizar tareas de SQL Server y necesita ejecutar sentencias mediante línea de comandos. Para automatizar ahora se usa el SQLCMD, que es muy parecido a su antecesor OSQL.
En este artículo vamos a ver los siguientes ejemplos:


Hasta hace muy poco tiempo la línea de comandos SQL Server llamada sqlcmd era la forma más común de ejecutar consultas usando línea de comandos.
Actualmente, lo más aconsejable es comenzar a usar powershell.
Para una introducción al powershell, pueden acceder a este link:

http://elpaladintecnologico.blogspot.com/2009/02/que-es-powershell-ejemplos-basicos-para.html

Para una introducción de powershell para SQL Server, pueden ver este link:

http://elpaladintecnologico.blogspot.com/2009/02/tutorial-de-powershell-para-sql-server.html

Ahora, los que insisten en usar sqlcmd, acá vamos. Este tutorial permite manejar SQL Server mediante línea de comandos. Personalmente estoy usando SQL Server 2008, pero todo lo que voy a hacer se aplica a SQL Server 2005. Si alguien quiere usar osql, me pide el email de mi abuelito para que les indique.

--> Origen del sqlcmd
En sql server 2000 se usaba el osql. SQL Server 2005 sigue soportando osql, pero a su vez soporta sqlcmd. Mis bisabuelos llegaron a usar isql que es mucho mas antiguo aún. Antes de eso...creo que era el assembler.

Primeros pasos en sqlcmd
Si tiene una instancia por defecto solo tiene que presionar Inicio>ejecutar escribir sqlcmd.
Si todo sale bien le va aparecer un numerito bonito como este:
1>








Si usted quiere entrar a otra instancia o loguearse con otros usuarios tiene que escribir:
Sqlcmd –S Nombre_instancia. Donde el nombre de su instancia es la que usted instaló. Para saber más sobre comandos, instancias y logueo consulte este link:

http://msdn.microsoft.com/es-es/library/ms162773.aspx

Para crear una base de datos en sqlcmd:
1>create database Daniel
2>go


El famoso go hay que ponerlo siempre al final de cualquier sentencia. Personalmente no me agrada.

Para moverse a una base de datos



1> use Daniel
2> go

Se cambió el contexto de la base de datos a 'daniel'.
Se pone use y el nombre de la base de datos.

Para crear una tabla usando sqlcmd (línea de comandos)
/*crea una tabla llamada table1 con la columna column1*/
1> create table table1
2> (
3> column1 int
4> )
5> go


Para insertar valores en una tabla con sqlcmd (línea de comandos)

1> insert into table1 values (20)
2> go

(1 filas afectadas)

Para mostrar los valores de una tabla mediante línea de comandos (select)
1> select * from table1
2> go

column1
-----------
20

(1 filas afectadas)
Ahora vamos a algo un poco más elaborado.

Para llamar a un script de SQL Server desde la línea de comandos (sqlcmd de SQL Server)

1. Crear un script en el SQL Server Management Studio que se llame insert.sql
2. En el archivo insert.sql escriba esto:
----------------------------------------------------------------------

/*Para crear una base de datos en SQL Server*/
CREATE DATABASE DANIEL2
USE daniel2
go

/*Para crear una tabla en SQL Server*/
create table estudiante
(
nombre varchar(12),
nota int
)

/*Para insertar datos en SQL Server*/
Insert into estudiante values ('Jonas',58)
Insert into estudiante values ('Juan',36)
Insert into estudiante values ('Johny',49)
------------------------------------------------------------------
3. Esto es MUY IMPORTANTE: Salga del SQLCMD (con exit)
4. Ejecute esto:
C:\Documents and Settings\Administrador>sqlcmd -i c:\insert.sql
Asegúrese que su script está en el c:, si no vea la ruta correcta. Es muy común tratar de poner en un path con espacios en el nombre. –i es el imput que en este caso es el script.
Si todo salió bien, se creó una base de datos Daniel2, una tabla estudiante y se insertaron 3 datos en la tabla.

Para pasar parámetros usando sqlcmd (línea de comandos SQL Server)

Vamos a trabajar con la tabla estudiante creada en la sección anterior.
Vamos a hacer un select donde la nota sea la variable. Es decir voy a mostrar los alumnos cuya nota sea una variable:

1. Crear un script llamado consultavar.sql
----------------------------------------------------------------------
/****** Script para el comando Select*/
SELECT [nombre]

FROM [daniel2].[dbo].[estudiante]
/*la variable es la palabra nota con el $ y el paréntisis*/
WHERE nota=$(nota)
GO

2. Poner inicio, ejecutar>cmd
3. En el cmd ejecutar esto:
C:\Documents and Settings\Administrador>sqlcmd -i c:\consultavar.sql -v nota=58
nombre
------------
Jonas

(1 filas afectadas)


Analicemos la línea:
sqlcmd -i c:\consultavar.sql -v nota=58
Es ejecutar la línea de comandos sql server usando como entrada el script consultarvar.sql.
Véa el código del script.
WHERE nota=$(nota)

Nuestra variable se llama nota y tiene una $(nota)
Entonces si vario la nota, me aparecerá otro estudiante.
nombre nota
------------ -----------
Jonas 58
Juan 36
Johny 49
Si yo coloco
sqlcmd -i c:\consultavar.sql -v nota=36
Me aparecerá Juan.
Si tienen más dudas o necesitan ayuda en sqlcmd, no duden en hablarme.
Gracias.

Artículos relacionados


People who read this post also read :



9 comentarios:

  1. esta bueno tu blog Daniel
    Saludos
    SAM

    ResponderEliminar
  2. Gracias. Si deseas un tema en especial, mandas sugerencias.

    ResponderEliminar
  3. Hay alguna forma de usar variables en SQL 2000 ??? estoy usando OSQL en lugar de SQLCMD...

    ResponderEliminar
  4. En el osql directamente no.
    Tal vez si ejecutas un script sql y ahi dentro usas las variables.
    Exactamente que deseas hacer ?

    ResponderEliminar
  5. ola, una consulta, utilizo el comando sqlcmd y ejecuto un procedimiento almacenado, como hago para q el resultado me quede en una variable para despues utilizar su valor en un script

    muchas gracias

    ResponderEliminar
  6. Dream team, la clave del exito es el parámetro output que se define en el procedimiento almacenado. Espero que esto resuelva tus dudas
    (fuente MSDN):

    E. Utilizar parámetros OUTPUT
    En el siguiente ejemplo se crea el procedimiento almacenado uspGetList. Este procedimiento devuelve una lista de productos cuyos precios no superan una cantidad especificada. El ejemplo se muestra con varias instrucciones SELECT y varios parámetros OUTPUT. Los parámetros OUTPUT permiten a un procedimiento externo, un lote o más de una instrucción Transact-SQL tener acceso a un conjunto de valores durante la ejecución del procedimiento.

    USE AdventureWorks;
    GO
    IF OBJECT_ID ( 'Production.uspGetList', 'P' ) IS NOT NULL
    DROP PROCEDURE Production.uspGetList;
    GO
    CREATE PROCEDURE Production.uspGetList @Product varchar(40)
    , @MaxPrice money
    , @ComparePrice money OUTPUT
    , @ListPrice money OUT
    AS
    SET NOCOUNT ON;
    SELECT p.[Name] AS Product, p.ListPrice AS 'List Price'
    FROM Production.Product AS p
    JOIN Production.ProductSubcategory AS s
    ON p.ProductSubcategoryID = s.ProductSubcategoryID
    WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice;
    -- Populate the output variable @ListPprice.
    SET @ListPrice = (SELECT MAX(p.ListPrice)
    FROM Production.Product AS p
    JOIN Production.ProductSubcategory AS s
    ON p.ProductSubcategoryID = s.ProductSubcategoryID
    WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice);
    -- Populate the output variable @compareprice.
    SET @ComparePrice = @MaxPrice;
    GO
    Ejecute uspGetList para obtener una lista de los productos de Adventure Works (bicicletas) que cuestan menos de $700. Los parámetros OUTPUT, @Cost y @ComparePrices se utilizan con el lenguaje de control de flujo para devolver un mensaje en la ventana Mensajes.

    Nota:
    La variable OUTPUT debe definirse al crear el procedimiento y también al utilizar la variable. El nombre del parámetro y de la variable no tienen por qué coincidir; sin embargo, el tipo de datos y la posición de los parámetros deben coincidir, a menos que se utilice @ListPrice = variable.
    DECLARE @ComparePrice money, @Cost money
    EXECUTE Production.uspGetList '%Bikes%', 700,
    @ComparePrice OUT,
    @Cost OUTPUT
    IF @Cost <= @ComparePrice
    BEGIN
    PRINT 'These products can be purchased for less than
    $'+RTRIM(CAST(@ComparePrice AS varchar(20)))+'.'
    END
    ELSE
    PRINT 'The prices for all products in this category exceed
    $'+ RTRIM(CAST(@ComparePrice AS varchar(20)))+'.'

    http://msdn.microsoft.com/es-es/library/ms187926.aspx

    ResponderEliminar
  7. Hola, Hay alguna manera de hacer que esta importación y/o Exportación por medio del bcp, pueda ser a otro servidor, es decir, diferente ubicación a la de la base de datos?

    ResponderEliminar
  8. Para importar y exportar datos recomiendo usar integration services. BCP es muy arcaico y rústico e inflexible.

    ResponderEliminar