Usar sqlcmd con variables de secuencia de comandos

Actualizado: 17 de julio de 2006

Las variables que se usan en secuencias de comandos se denominan variables de secuencia de comandos. Las variables de secuencia de comandos posibilitan el uso de una secuencia de comandos en varias situaciones. Por ejemplo, si desea ejecutar una secuencia de comandos en varios servidores, en lugar de modificar la secuencia de comandos para cada servidor, puede usar una variable de secuencia de comandos para el nombre del servidor. Al cambiar el nombre del servidor proporcionado a la variable de secuencia de comandos, la misma secuencia de comandos puede ejecutarse en diferentes servidores.

Las variables de secuencia de comandos pueden definirse explícitamente mediante el comando setvar o implícitamente mediante la opción sqlcmd-v.

Además, en este tema se proporcionan ejemplos en los que se definen variables de entorno en el símbolo del sistema Cmd.exe mediante SET.

Definir variables de secuencia de comandos mediante el comando setvar

El comando setvar se utiliza para definir variables de secuencia de comandos. Las variables que se definen mediante el comando setvar se almacenan internamente. Las variables de secuencia de comandos no deben confundirse con las variables de entorno que se definen en el símbolo del sistema mediante SET. Si una secuencia de comandos hace referencia a una variable que no es de entorno o que no está definida mediante setvar, aparece un mensaje de error y se detiene la ejecución de la secuencia de comandos. Para obtener más información, vea la opción -b en sqlcmd (utilidad).

Prioridad de variables (baja a alta)

Si hay más de un tipo de variable con el mismo nombre, se usa la variable que tenga la prioridad más alta.

  1. Variables de entorno del nivel del sistema
  2. Variables de entorno del nivel del usuario
  3. Shell de comandos (SET X=Y) definido en el símbolo del sistema antes de iniciar sqlcmd
  4. sqlcmd-v X=Y
  5. :Setvar X Y

[!NOTA] Para ver las variables de entorno, en el Panel de control, abra Sistema y, a continuación, haga clic en la ficha Avanzadas.

Definir las variables de secuencia de comandos implícitamente

Al iniciar sqlcmd con una opción que tiene una variable sqlcmd relacionada, la variable sqlcmd se establece implícitamente en el valor especificado mediante la opción. En el siguiente ejemplo, sqlcmd se inicia con la opción -l. Esto establece implícitamente la variable SQLLOGINTIMEOUT.

c:\> sqlcmd -l 60

También puede usar la opción -v para establecer una variable de secuencia de comandos que existe en una secuencia de comandos. En la secuencia de comandos siguiente (el nombre de archivo es testscript.sql), ColumnName es una variable de secuencia de comandos.

USE AdventureWorks;

SELECT c.$(ColumnName)

FROM Person.Contact x

WHERE c.ContactID < 5;

Después, puede especificar el nombre de la columna que desea que se devuelva mediante la opción -v:

sqlcmd -v ColumnName ="FirstName" -i c:\testscript.sql

Para devolver otra columna usando la misma secuencia de comandos, cambie el valor de la variable de secuencia de comandos ColumnName.

sqlcmd -v ColumnName ="LastName" -i c:\testscript.sql

Directrices para los nombres y valores de variable de secuencia de comandos

Al especificar un nombre para las variables de secuencia de comandos, tenga en cuenta lo siguiente:

  • Los nombres de variable no deben contener caracteres de espacio en blanco ni comillas.

  • Los nombres de variable no deben tener la misma forma que una expresión variable, como $(var).

  • Las variables de secuencia de comandos no distinguen entre mayúsculas y minúsculas.

    [!NOTA] Si no se asigna ningún valor a una variable de entorno sqlcmd, se elimina la variable. Si se usa :setvar VarName sin ningún valor se borra la variable.

Al especificar valores para las variables de secuencia de comandos, tenga en cuenta lo siguiente:

  • Los valores de variable definidos mediante setvar o la opción -v deben ir entre comillas si el valor de cadena contiene espacios.
  • Si las comillas forman parte del valor de variable, es necesario usar un carácter de escape. Por ejemplo: :setvar MyVar "spac""e".

Directrices para los nombres y valores de la variable SET de Cmd.exe

Las variables que se definen mediante SET forman parte del entorno de Cmd.exe y se puede hacer referencia a ellas mediante sqlcmd. Tenga en cuenta las directrices siguientes:

  • Los nombres de variable no deben contener caracteres de espacio en blanco ni comillas.
  • Los valores de variable pueden contener caracteres de espacio en blanco o comillas.

Variables de secuencia de comandos sqlcmd

Las variables definidas mediante sqlcmd se denominan variables de secuencia de comandos. En la siguiente tabla se enumeran las variables de secuencia de comandos de sqlcmd.

Variable Opción relacionada L/E Opción predeterminada

SQLCMDUSER*

-U

L

""

SQLCMDPASSWORD*

-P

--

""

SQLCMDSERVER*

-S

L

"DefaultLocalInstance"

SQLCMDWORKSTATION

-H

L

"ComputerName"

SQLCMDDBNAME

-d

L

""

SQLCMDLOGINTIMEOUT

-l

L/E

"8" (segundos)

SQLCMDSTATTIMEOUT

-t

L/E

"0" = esperar indefinidamente

SQLCMDHEADERS

-h

L/E

"0"

SQLCMDCOLSEP

-s

L/E

" "

SQLCMDCOLWIDTH

-w

L/E

"0"

SQLCMDPACKETSIZE

-a

L

"4096"

SQLCMDERRORLEVEL

-m

L/E

"0"

SQLCMDMAXVARTYPEWIDTH

-y

L/E

"256"

SQLCMDMAXFIXEDTYPEWIDTH

-Y

L/E

"0" = ilimitado

SQLCMDEDITOR

L/E

"edit.com"

SQLCMDINI

L

""

* SQLCMDUSER, SQLCMDPASSWORD y SQLCMDSERVER se definen al usar :Connect.

L indica que el valor sólo puede establecerse una vez durante la inicialización del programa.

L/E indica que el valor puede volver a definirse mediante el comando setvar y los comandos siguientes utilizarán el nuevo valor.

Ejemplos

A. Usar el comando setvar en una secuencia de comandos

Muchas opciones de sqlcmd pueden controlarse en una secuencia de comandos mediante el comando setvar. En el siguiente ejemplo, se crea la secuencia de comandos test.sql; en ella, la variable SQLCMDLOGINTIMEOUT está establecida en 60 segundos y otra variable de secuencia de comandos, server, está establecida en testserver. El siguiente código está en test.sql.

:setvar SQLCMDLOGINTIMEOUT 60

:setvar server "testserver"

:connect $(server) -l $(SQLCMDLOGINTIMEOUT)

USE AdventureWorks;

SELECT FirstName, LastName

FROM Person.Contact;

The script is then called by using sqlcmd:

sqlcmd -i c:\test.sql

B. Usar el comando setvar interactivamente

En el ejemplo siguiente se muestra cómo establecer una variable de secuencia de comandos de manera interactiva mediante el comando setvar.

sqlcmd

:setvar MYDATABASE AdventureWorks

USE $(MYDATABASE);

GO

Éste es el conjunto de resultados.

Changed database context to 'AdventureWorks'

1>

C. Usar variables de entorno del símbolo del sistema en sqlcmd

En el ejemplo siguiente, se establecen cuatro variables de entorno y, a continuación, se las llama desde sqlcmd.

C:\>SET tablename=Person.Contact

C:\>SET col1=FirstName

C:\>SET col2=LastName

C:\>SET title=Ms.

C:\>sqlcmd -d AdventureWorks

1> SELECT TOP 5 $(col1) + ' ' + $(col2) AS Name

2> FROM $(tablename)

3> WHERE Title ='$(title)'

4> GO

D. Usar variables de entorno de usuario en sqlcmd

En el ejemplo siguiente, se establece la variable de entorno de usuario %Temp% en el símbolo del sistema y se pasa al archivo de entrada de sqlcmd. Para obtener la variable de entorno de usuario, en el Panel de control, haga doble clic en Sistema. Haga clic en la ficha Avanzadas y, a continuación, en Variables de entorno.

El código siguiente se encuentra en el archivo de entrada c:\testscript.txt:

:OUT $(MyTempDirectory)

USE AdventureWorks;

SELECT FirstName

FROM AdventureWorks.Person.Contact

WHERE ContactID < 5;

El código siguiente se escribe en el símbolo del sistema:

C:\ >SET MyTempDirectory=%Temp%\output.txt

C:\ >sqlcmd -i C:\testscript.txt

El resultado siguiente se envía al archivo de salida C:\Documents and Settings\<usuario>\Local Settings\Temp\output.txt.

Changed database context to 'AdventureWorks'.

FirstName

--------------------------------------------------

Gustavo

Catherine

Kim

Humberto

(4 rows affected)

E. Usar una secuencia de comandos de inicio

Una secuencia de comandos de inicio sqlcmd se ejecuta al iniciar sqlcmd. En el ejemplo siguiente se establece la variable de entorno SQLCMDINI. El contenido de init.sql. es

SET NOCOUNT ON

GO

DECLARE @nt_user_name nvarchar(128)

SET @nt_user_name = (SELECT rtrim(convert(nvarchar(128), nt_user_name))

FROM sys.dm_exec_sessions WHERE session_id = @@SPID);

SELECT @nt_user_name + ' is connected to ' +

rtrim(CONVERT(nvarchar(20), SERVERPROPERTY('servername'))) + ' (' +

rtrim(CONVERT(nvarchar(20), SERVERPROPERTY('productversion'))) + ')';

:setvar SQLCMDMAXFIXEDTYPEWIDTH 100

SET NOCOUNT OFF

GO

:setvar SQLCMDMAXFIXEDTYPEWIDTH

De esta manera, se llama al archivo init.sql cuando se inicia sqlcmd.

C:\> SET sqlcmdini=c:\init.sql

>1 Sqlcmd

Éste es el resultado.

>1 < user > is connected to < server > (9.00.2047.00)

Nota   La opción -X deshabilita la característica de secuencia de comandos de inicio.

F. Usar expansión de variables

En el ejemplo siguiente se muestra cómo trabajar con datos que tienen el formato de una variable de sqlcmd.

USE AdventureWorks;

CREATE TABLE AdventureWorks.dbo.VariableTest

(

Col1 nvarchar(50)

);

GO

Inserte una fila en la Col1 de dbo.VariableTest que contiene el valor $(tablename).

INSERT INTO AdventureWorks.dbo.VariableTest(Col1)

VALUES('$(tablename)');

GO

En el símbolo del sistema sqlcmd, si no hay ninguna variable con el valor $(tablename), las instrucciones siguientes devuelven la fila.

C:\> sqlcmd

>1 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = '$(tablename)';

>2 GO

>3 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(tablename)';

>4 GO

Éste es el conjunto de resultados.

>1 Col1

>2 ------------------

>3 $(tablename)

>4

>5 (1 rows affected)

Si la variable MyVar está establecida en $(tablename).

>6 :setvar MyVar $(tablename)

Estas instrucciones devuelven la fila y, además, un mensaje que indica que "No se definió la variable de secuencia de comandos 'nombreDeTabla'".

>6 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = '$(tablename)';

>7 GO

>1 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(tablename)';

>2 GO

Estas instrucciones devuelven la fila.

>1 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = '$(MyVar)';

>2 GO

>1 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(MyVar)';

>2 GO

Historial de cambios

Versión Historial

17 de julio de 2006

Contenido nuevo:
  • Se agregaron los ejemplos.

Vea también

Conceptos

Usar la utilidad sqlcmd

Otros recursos

sqlcmd (utilidad)
Utilidades del símbolo del sistema

Ayuda e información

Obtener ayuda sobre SQL Server 2005