Partilhar via


sqlcmd - Uso com variáveis de script

Aplica-se a:SQL ServerAzure SQL DatabaseInstância Gerenciada do SQL do AzureAzure Synapse AnalyticsAnalytics Platform System (PDW)Banco de Dados SQL no Microsoft Fabric

As variáveis usadas em scripts são chamadas de variáveis de script. As variáveis de script permitem que um script seja usado em vários cenários. Por exemplo, se você quiser executar um script em vários servidores, em vez de modificar o script para cada servidor, você pode usar uma variável de script para o nome do servidor. Ao alterar o nome do servidor fornecido para a variável de script, o mesmo script pode ser executado em servidores diferentes.

As variáveis de script podem ser definidas explicitamente usando o comando setvar ou implicitamente usando a opção sqlcmd -v.

Este artigo também inclui exemplos que definem variáveis ambientais no prompt de comando Cmd.exe usando SET.

Definir variáveis de script com o comando setvar

O comando setvar é usado para definir variáveis de script. As variáveis que são definidas usando o comando setvar são armazenadas internamente. As variáveis de script não devem ser confundidas com as variáveis de ambiente que são definidas no prompt de comando usando SET. Se um script fizer referência a uma variável que não seja uma variável de ambiente ou não seja definida usando setvar, uma mensagem de erro será retornada e a execução do script será interrompida. Para obter mais informações, consulte a opção -b em sqlcmd.

Precedência variável (baixa a alta)

Se mais de um tipo de variável tiver o mesmo nome, a variável com a maior precedência será usada.

  1. Variáveis ambientais ao nível do sistema
  2. Variáveis ambientais ao nível do utilizador
  3. Linha de comandos (SET X=Y) definida no prompt de comando antes de iniciar o sqlcmd
  4. sqlcmd -v X=Y
  5. :Setvar X Y

Observação

Para exibir as variáveis ambientais, no Painel de Controle , abra Sistema e selecione a guia Avançado.

Definição implícita de variáveis de script

Quando inicias sqlcmd com uma opção que tem uma variável sqlcmd relacionada, a variável sqlcmd é definida implicitamente com o valor especificado ao usar a opção. No exemplo a seguir, sqlcmd é iniciado com a opção -l. Isso implicitamente define a variável SQLLOGINTIMEOUT.

sqlcmd -l 60

Você também pode usar a opção -v para definir uma variável de script que existe em um script. No script a seguir (o nome do arquivo é testscript.sql), ColumnName é uma variável de script.

USE AdventureWorks2022;

SELECT x.$(ColumnName)
FROM Person.Person x
WHERE x.BusinessEntityID < 5;

Em seguida, você pode especificar o nome da coluna que deseja retornar usando a opção -v:

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

Para retornar uma coluna diferente usando o mesmo script, altere o valor da variável de script ColumnName.

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

Diretrizes para a escrita de nomes e valores de variáveis

Considere as seguintes diretrizes ao nomear variáveis de script:

  • Os nomes das variáveis não devem conter caracteres de espaço em branco ou aspas.

  • Os nomes de variáveis não devem ter a mesma forma que uma expressão variável, como $(var).

  • As variáveis de script não diferenciam maiúsculas de minúsculas

    Observação

    Se nenhum valor for atribuído a uma variável de ambiente sqlcmd, a variável será removida. Usar :setvar VarName sem um valor limpa a variável.

Considere as seguintes diretrizes ao especificar valores para variáveis de script:

  • Os valores de variáveis que são definidos usando setvar ou a opção -v devem ser colocados entre aspas se o valor da cadeia de caracteres contiver espaços.
  • Se as aspas fizerem parte do valor da variável, elas devem ser escapadas. Por exemplo: :setvar MyVar "spac""e".

Diretrizes para valores e nomes de variáveis do tipo SET cmd.exe

As variáveis que são definidas usando SET fazem parte do ambiente de cmd.exe e podem ser referenciadas por sqlcmd. Considere as seguintes diretrizes:

  • Os nomes das variáveis não devem conter caracteres de espaço em branco ou aspas.
  • Os valores das variáveis podem conter espaços ou aspas.

Variáveis de script sqlcmd

As variáveis definidas por sqlcmd são conhecidas como variáveis de script. A tabela a seguir lista as variáveis de script de sqlcmd.

Variável Opção relacionada R/W Padrão
SQLCMDUSER 1 -U R 2 ""
SQLCMDPASSWORD 1 -P -- ""
SQLCMDSERVER 1 -S R 2 "DefaultLocalInstance"
SQLCMDWORKSTATION -H R 2 "Nome do computador"
SQLCMDDBNAME -d R 2 ""
SQLCMDLOGINTIMEOUT -l R/W 3 "8" (segundos)
SQLCMDSTATTIMEOUT -t R/W 3 "0" = esperar indefinidamente
SQLCMDHEADERS -h R/W 3 "0"
SQLCMDCOLSEP -s R/W 3 " "
SQLCMDCOLWIDTH -w R/W 3 0
SQLCMDPACKETSIZE -a R 2 "4096"
SQLCMDERRORLEVEL -m R/W 3 0
SQLCMDMAXVARTYPEWIDTH -y R/W 3 "256"
SQLCMDMAXFIXEDTYPEWIDTH -Y R/W 3 "0" = ilimitado
SQLCMDEDITOR R/W 3 "edit.com"
SQLCMDINI R 2 ""

1 SQLCMDUSER, SQLCMDPASSWORD e SQLCMDSERVER são definidos quando :Connect é usado.

2 R indica que o valor só pode ser definido uma vez durante a inicialização do programa.

3 R/W indica que o valor pode ser redefinido usando o comando setvar e os comandos subsequentes usam o novo valor.

Exemplos

Um. Usar o comando setvar em um script

Muitas opções de sqlcmd podem ser controladas em um script usando o comando setvar. No exemplo a seguir, o script test.sql é criado no qual a variável SQLCMDLOGINTIMEOUT é definida para 60 segundos e outra variável de script, server, é definida como testserver. O código a seguir está em test.sql.

:setvar SQLCMDLOGINTIMEOUT 60
:setvar server "testserver"
:connect $(server) -l $(SQLCMDLOGINTIMEOUT)

USE AdventureWorks2022;

SELECT FirstName, LastName
FROM Person.Person;

O script é então chamado usando sqlcmd:

sqlcmd -i c:\test.sql

B. Utilize o comando setvar de forma interativa

O exemplo a seguir mostra como definir uma variável de script interativamente usando o comando setvar.

sqlcmd
:setvar MYDATABASE AdventureWorks2022
USE $(MYDATABASE);
GO

Aqui está o conjunto de resultados.

Changed database context to 'AdventureWorks2022'
1>

C. Usar variáveis de ambiente de prompt de comando dentro do sqlcmd

No exemplo a seguir, quatro variáveis de ambiente are são definidas e chamadas em seguida a partir de sqlcmd.

SET tablename=Person.Person
SET col1=FirstName
SET col2=LastName
SET title=Ms.
sqlcmd -d AdventureWorks2022
1> SELECT TOP 5 $(col1) + ' ' + $(col2) AS Name
2> FROM $(tablename)
3> WHERE Title ='$(title)'
4> GO

D. Usar variáveis de ambiente de nível de usuário no sqlcmd

No exemplo a seguir, a variável ambiental de nível de usuário %Temp% é definida no prompt de comando e passada para o arquivo de entrada sqlcmd. Para obter a variável de ambiente de nível de utilizador, no Painel de Controlo, clique duas vezes no Sistema. Selecione a guia Advance e, em seguida, selecione Variáveis de Ambiente.

O código a seguir está no arquivo de entrada C:\testscript.txt:

:OUT $(MyTempDirectory)
USE AdventureWorks2022;

SELECT FirstName
FROM AdventureWorks2022.Person.Person
WHERE BusinessEntityID < 5;

Este código a seguir é inserido no prompt de comando:

SET MyTempDirectory=%Temp%\output.txt
sqlcmd -i C:\testscript.txt

O resultado a seguir é enviado para o arquivo de saída C:\Documents and Settings\<user>\Local Settings\Temp\output.txt.

Changed database context to 'AdventureWorks2022'.
FirstName
--------------------------------------------------
Gustavo
Catherine
Kim
Humberto

(4 rows affected)

E. Usar um script de inicialização

Um script de inicialização do sqlcmd é executado quando o sqlcmd é iniciado. O exemplo a seguir define a variável de ambiente SQLCMDINI. Este é o conteúdo 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

Isso chama o arquivo init.sql quando sqlcmd é iniciado.

SET sqlcmdini=c:\init.sql
sqlcmd

Esta é a saída.

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

Observação

A opção -X desativa o recurso de script de inicialização.

F. Expansão variável

O exemplo a seguir mostra o trabalho com dados na forma de uma variável sqlcmd.

USE AdventureWorks2022;
GO
CREATE TABLE AdventureWorks2022.dbo.VariableTest (Col1 NVARCHAR(50));
GO

Insira uma linha em Col1 de dbo.VariableTest que contém o valor $(tablename).

INSERT INTO AdventureWorks2022.dbo.VariableTest (Col1)
VALUES ('$(tablename)');
GO

No prompt sqlcmd, quando nenhuma variável é definida como igual a $(tablename), as instruções a seguir retornam a linha e também retornam a mensagem "'tablename' scripting variable not defined". Por padrão, o sinalizador sqlcmd -b não está definido. Se -b estiver definido, o sqlcmd será encerrado após ocorrer o erro "variável não definida".

sqlcmd
1> SELECT Col1 FROM dbo.VariableTest WHERE Col1 = '$(tablename)';
2> GO
3> SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(tablename)';
4> GO

Aqui está a lista de resultados.

1> Col1
2> ------------------
3> $(tablename)
4>
5> (1 rows affected)

Dada a variável MyVar, esta é definida como $(tablename).

6> :setvar MyVar $(tablename)

Essas instruções devolvem a linha e também devolvem a mensagem "variável de scripting 'tablename' não definida".

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

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

Essas instruções retornam a linha.

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

Próximos passos