Compartir a través de


Uso de sqlcmd con variables de scripting

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

Las variables de scripting se pueden definir explícitamente mediante el comando setvar o implícitamente mediante la opción sqlcmd-v .

En este tema también se incluyen ejemplos de definición de variables de entorno en el símbolo del sistema de Cmd.exe mediante SET.

Configuración de las variables de guionización mediante el comando setvar

El comando setvar se usa para definir variables de scripting. Las variables que se definen mediante el comando setvar se almacenan internamente. Las variables de scripting no deben confundirse con las variables de entorno que se definen en el símbolo del sistema cuando se utiliza SET. Si un script hace referencia a una variable que no es una variable de entorno o no se define mediante setvar, se devuelve un mensaje de error y se detendrá la ejecución del script. Para obtener más información, vea la opción -b en la utilidad sqlcmd.

Precedencia 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) configurado 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 pestaña Avanzadas .

Establecer variables de script 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 scripting que existe en un script. En el script siguiente (el nombre de archivo es testscript.sql), ColumnName es una variable de scripting.

USE AdventureWorks2012;

SELECT x.$(ColumnName)

FROM Person.Person x

WHERE c.BusinessEntityID < 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 el mismo script, cambie el valor de la variable de scripting ColumnName .

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

Instrucciones para la creación de guiones de nombres y valores de variables

Al especificar un nombre para las variables de script, 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 scripting no distinguen entre mayúsculas y minúsculas.

    Nota:

    Si no se asigna ningún valor a una variable de entorno sqlcmd , se quita la variable. El uso de :setvar VarName sin un valor borra la variable.

Al especificar valores para las variables de scripting, 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 valores y nombres de variables SET Cmd.exe

Las variables que se definen mediante SET forman parte del entorno de Cmd.exe y sqlcmd puede hacer referencia a ellas. 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 scripting de SQLCMD

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

Variable Opción relacionada L/E Predeterminado
SQLCMDUSER* -U R ""
SQLCMDPASSWORD* -P -- ""
SQLCMDSERVER* -S R "DefaultLocalInstance"
SQLCMDWORKSTATION -H R "NombreDeEquipo"
SQLCMDDBNAME -d R ""
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 -un R "4096"
SQLCMDERRORLEVEL -M L/E "0"
SQLCMDMAXVARTYPEWIDTH -y L/E "256"
SQLCMDMAXFIXEDTYPEWIDTH -Y L/E "0" = ilimitado
SQLCMDEDITOR L/E edit.com
SQLCMDINI R ""

* SQLCMDUSER, SQLCMDPASSWORD y SQLCMDSERVER se establecen cuando se usa :Connect .

R indica que el valor solo se puede establecer una vez durante la inicialización del programa.

R/W indica que el valor se puede restablecer mediante el comando setvar y los comandos posteriores usarán el nuevo valor.

Ejemplos

A. Uso del comando setvar en un script

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

:setvar SQLCMDLOGINTIMEOUT 60

:setvar server "testserver"

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

USE AdventureWorks2012;

SELECT FirstName, LastName

FROM Person.Person;

The script is then called by using sqlcmd:

sqlcmd -i c:\test.sql

B. Uso del comando setvar de forma interactiva

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

sqlcmd

:setvar MYDATABASE AdventureWorks2012

USE $(MYDATABASE);

GO

El conjunto de resultados es el siguiente:

Changed database context to 'AdventureWorks2012'

1>

C. Uso de variables de entorno de la línea de comandos en sqlcmd

En el ejemplo siguiente, se establecen cuatro variables de entorno are y luego se llaman desde sqlcmd.

C:\>SET tablename=Person.Person

C:\>SET col1=FirstName

C:\>SET col2=LastName

C:\>SET title=Ms.

C:\>sqlcmd -d AdventureWorks2012

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

2> FROM $(tablename)

3> WHERE Title ='$(title)'

4> GO

D. Uso de variables de entorno de nivel de usuario en sqlcmd

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

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

:OUT $(MyTempDirectory)

USE AdventureWorks2012;

SELECT FirstName

FROM AdventureWorks2012.Person.Person

WHERE BusinessEntityID < 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 siguiente resultado se envía al archivo de salida C:\Documents and Settings\<user>\Local Settings\Temp\output.txt.

Changed database context to 'AdventureWorks2012'.

FirstName

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

Gustavo

Catherine

Kim

Humberto

(4 rows affected)

E. Uso de un script de inicio

Un script de inicio sqlcmd se ejecuta al iniciar sqlcmd . En el ejemplo siguiente se establece la variable de entorno SQLCMDINI. Este es el contenido de init.sql.

SET NOCOUNT ON

GO

DECLARE @nt_username nvarchar(128)

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

FROM sys.dm_exec_sessions WHERE spid = @@SPID)

SELECT @nt_username + ' 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

Este es el resultado.

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

Nota:

La opción -X deshabilita la característica de script de inicio.

F. 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 AdventureWorks2012;

CREATE TABLE AdventureWorks2012.dbo.VariableTest

(

Col1 nvarchar(50)

);

GO

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

INSERT INTO AdventureWorks2012.dbo.VariableTest(Col1)

VALUES('$(tablename)');

GO

En el indicador sqlcmd, cuando ninguna variable se establece igual a $(tablename), las siguientes instrucciones 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

El conjunto de resultados es el siguiente:

>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 script '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

Véase también

Usar la utilidad sqlcmd
Utilidad sqlcmd
Referencia de la utilidad del símbolo del sistema (motor de base de datos)