Usando o utilitário sqlcmd

O utilitário sqlcmd é um utilitário de prompt de comando Microsoft Win32, para execução interativa ad hoc de instruções e scripts Transact-SQLe para automatização das tarefas de script Transact-SQL. Para usar o sqlcmd de forma interativa, ou para construir arquivos de script a serem executados com o uso do sqlcmd, os usuários devem compreender a linguagem Transact-SQL. O utilitário sqlcmd é normalmente usado das seguintes maneiras:

  • Os usuários inserem de forma interativa instruções Transact-SQL de forma semelhante ao trabalho no prompt de comando. Os resultados são exibidos no prompt de comando. Para abrir uma janela de prompt de comando, clique em Iniciar, clique em Todos os Programas, aponte para Acessórios e, em seguida, clique em Prompt de Comando. No prompt de comando, digite sqlcmd seguido por uma lista de opções que você deseja. Para obter uma lista completa das opções que têm suporte pelo sqlcmd, consulte Utilitário sqlcmd.

  • Os usuários enviam um trabalho sqlcmd especificando uma única instrução Transact-SQL para executar, ou apontando o utilitário para um arquivo de texto que contenha instruções Transact-SQL a executar. O resultado geralmente é dirigido a um arquivo de texto, mas também pode ser exibido no prompt de comando.

  • modo SQLCMD no Editor de Consultas SQL Server Management Studio.

  • SQL Server Management Objects (SMO)

  • Trabalhos do CmdExec do SQL Server Agent.

Opções sqlcmd normalmente usadas

As opções a seguir são usadas com maior frequência:

  • A opção de servidor (- S) que identifica a instância do Microsoft SQL Server com a qual o sqlcmd se conecta.

  • As opções de autenticação (-E, -U, e -P) que especificam as credenciais que o sqlcmd usa para se conectar à instância do SQL Server.

    ObservaçãoObservação

    A opção - E é o padrão e não precisa ser especificada.

  • As opções de entrada (- Q, - q, e - i) que identificam o local da entrada para o sqlcmd.

  • A opção de saída (- o) que especifica o arquivo no qual o sqlcmd deve colocar sua saída.

Conectando ao utilitário sqlcmd

As utilizações a seguir são comuns do utilitário sqlcmd:

  • Conexão com uma instância padrão usando a Autenticação do Windows para executar instruções Transact-SQL de forma interativa:

    sqlcmd -S <ComputerName>
    
    ObservaçãoObservação

    No exemplo anterior, -E não é especificado porque ele é o padrão e sqlcmd se conecta com a instância padrão, usando o a Autenticação do Windows.

  • Conexão com uma instância nomeada usando a Autenticação do Windows para executar instruções Transact-SQL interativamente:

    sqlcmd -S <ComputerName>\<InstanceName>
    

    ou

    sqlcmd -S .\<InstanceName>
    
  • Conectando-se com uma instância nomeada, usando a Autenticação do Windows e especificando arquivos de entrada e saída:

    sqlcmd -S <ComputerName>\<InstanceName> -i <MyScript.sql> -o <MyOutput.rpt>
    
  • Conectando-se com uma instância padrão no computador local, usando a Autenticação do Windows, executando uma consulta, e obrigando o sqlcmd a continuar executando, após a consulta ter finalizado a execução:

    sqlcmd -q "SELECT * FROM AdventureWorks2008R2.Person.Person"
    
  • Conectando-se a uma instância padrão no computador local usando a Autenticação do Windows, executando uma consulta, direcionando a saída para um arquivo, e fazendo o sqlcmd fechar após a consulta terminar de executar:

    sqlcmd -Q "SELECT * FROM AdventureWorks2008R2.Person.Person" -o MyOutput.txt
    
  • Conectando-se com uma instância nomeada que usa a Autenticação SQL Server para executar de forma interativa as instruções Transact-SQL, com o sqlcmd solicitando uma senha:

    sqlcmd -U MyLogin -S <ComputerName>\<InstanceName>
    
    ObservaçãoObservação

    Para consultar uma lista das opções que têm suporte pela execução do utilitário sqlcmd: sqlcmd -?.

Executando instruções Transact-SQL interativamente usando sqlcmd

Você pode usar o utilitário sqlcmd interativamente para executar instruções Transact-SQL em uma janela de prompt de comando. Para executar interativamente instruções Transact-SQL usando o sqlcmd, execute o utilitário sem usar as opções -Q, -q, -Z ou -i, para especificar qualquer arquivo ou consulta de entrada. Por exemplo:

sqlcmd -S <ComputerName>\<InstanceName>

Quando o comando é executado sem arquivos ou consultas de entrada, o sqlcmd se conecta com uma instância especificada do SQL Server e, em seguida, exibe uma nova linha com um 1> seguido de um sublinhado intermitente que é nomeado o prompt sqlcmd. O 1 significa que esta é a primeira linha de uma instrução Transact-SQL, e o prompt sqlcmd é o ponto no qual a instrução Transact-SQL iniciará quando ela for digitada nele.

No prompt sqlcmd, você pode digitar instruções Transact-SQL e comandos sqlcmd, como GO e EXIT. Cada instrução Transact-SQL é posta em um buffer chamado de o cache de instrução. Estas instruções são enviadas para o SQL Server, depois que você digitar o comando GO e pressionar ENTER. Para encerrar o sqlcmd, digite EXIT ou QUIT, no início de uma linha nova.

Para desmarcar o cache de instrução, digite : RESET. Digitando ^ C o sqlcmd se encerrará. O ^C também pode ser usado para interromper a execução do cache de instrução, após uma comando GO ter sido emitido.

As instruções Transact-SQL que são inseridas em uma sessão interativa podem ser editadas digitando-se o comando :ED e o prompt sqlcmd. O editor abrirá e, após editar a instrução Transact-SQL e fechar o editor, a instrução revisada Transact-SQL aparecerá na janela de comando. Digite GOpara executar a instrução revisada Transact-SQL.

Cadeia de caracteres entre aspas

Os caracteres entre aspas são usados sem qualquer pré-processamento adicional, exceto que as aspas podem ser inseridas em uma cadeia de caracteres digitando-se duas aspas consecutivas. O SQL Server trata esta cadeia de caracteres como uma aspa. (Porém, a tradução acontece no servidor.) Não serão expandidas variáveis de script ,quando estas aparecerem dentro de uma cadeia de caracteres.

Por exemplo:

sqlcmd

PRINT "Length: 5"" 7'";

GO

Aqui está o conjunto de resultados.

Length: 5" 7'

Cadeias de caracteres que abrangem múltiplas linhas

O sqlcmd oferece suporte a scripts que têm cadeias de caracteres que abrangem várias linhas. Por exemplo, a seguinte instrução SELECT estende diversas linhas, mas é uma única cadeia de caracteres executada ao pressionar a tecla ENTER, depois de digitar GO.

SELECT First line

FROM Second line

WHERE Third line;

GO

Exemplo interativo de sqlcmd

Este é um exemplo do que se vê ao se executar o sqlcmd interativamente.

Ao abrir uma janela de prompt de comando, há uma linha semelhante para:

C:\> _

Isso significa que a pasta C:\ é a pasta atual, e se você especificar um nome de arquivo, o Windows procurará o arquivo nessa pasta.

Digite sqlcmd para se conectar à instância padrão do SQL Server no computador local e os conteúdos da janela de prompt de comando serão:

C:\>sqlcmd

1> _

Isso significa que você se conectou com a instância do SQL Server e o sqlcmd agora está pronto para aceitar as instruções Transact-SQL e os comandos sqlcmd. O sublinhado intermitente que precede o 1> é o prompt sqlcmd que marca o local no qual as instruções e os comandos que você digita serão exibidos. Agora, digite USE AdventureWorks2008R2, pressione ENTER e, em seguida, digite GO e pressione ENTER. O conteúdo da janela de prompt de comando será:

sqlcmd

USE AdventureWorks2008R2;

GO

Aqui está o conjunto de resultados.

Changed database context to 'AdventureWorks2008R2'.

1> _

Pressionar ENTER depois de inserir USE AdventureWorks2008R2 sinaliza ao sqlcmd para iniciar uma linha nova. Pressionar ENTER, após ter digitado GO, sinalizou ao sqlcmd para enviar a instrução USE AdventureWorks2008R2 para a instância do SQL Server. O sqlcmd em seguida retornou uma mensagem para indicar que a instrução USE foi concluída com êxito, e exibiu um novo prompt 1> como sinal para inserir uma nova instrução ou comando.

O exemplo a seguir mostra o conteúdo da janela de prompt de comando ao você digitar uma instrução SELECT, uma GO para executar o comando SELECT, e uma EXIT para fechar o sqlcmd:

sqlcmd

USE AdventureWorks2008R2;

GO

SELECT TOP (3) BusinessEntityID, FirstName, LastName

FROM Person.Person;

GO

Aqui está o conjunto de resultados.

BusinessEntityID FirstName LastName

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

1 Syed Abbas

2 Catherine Abel

3 Kim Abercrombie

(3 linhas afetadas)

1> EXIT

C:\>

As linhas depois da linha 3> GO são a saída de uma instrução SELECT. Depois que você gerar a saída, o sqlcmd redefine o prompt sqlcmd e exibe 1>. Após digitar EXIT na linha 1>, a janela de prompt de comando exibe a mesma linha, como fez quando você a abriu primeiramente. Isto indica que o sqlcmd encerrou sua sessão. Agora você pode fechar a janela de prompt de comando digitando outro comando EXIT.

Executando arquivos de script Transact-SQL usando sqlcmd

Você pode usar o sqlcmd para executar arquivos de script de banco de dados. Os arquivos de script são arquivos de texto que contêm uma mistura de instruções Transact-SQL, comandos sqlcmd e variáveis de script. Para obter mais informações sobre o uso de variáveis de script, consulte Usando sqlcmd com variáveis de script. O sqlcmd funciona com instruções, comandos e variáveis de script em um arquivo de script de modo semelhante ao que funciona com instruções e comandos inseridos interativamente. A principal diferença é que o sqlcmd faz a leitura por meio do arquivo de entrada sem pausa, em lugar de esperar que um usuário insira as instruções, comandos e variáveis de script.

Existem maneiras diferentes de criar arquivos de script de banco de dados:

  • Você pode criar e depurar interativamente uma série de instruções Transact-SQL no SQL Server Management Studio, e em seguida salvar o conteúdo da janela de consulta como arquivo script.

  • Você pode criar um arquivo de texto que contém instruções Transact-SQL usando um editor de textos, como o Bloco de Notas.

Exemplos

A. Execução de um script usando sqlcmd

Iniciar o Bloco de Notas e digitar as seguintes instruções Transact-SQL:

USE AdventureWorks2008R2;

GO

SELECT TOP (3) BusinessEntityID, FirstName, LastName

FROM Person.Person;

GO

Criar uma pasta nomeada MyFolder e, em seguida, salvar o script como o arquivo MyScript.sql na pasta C:\MyFolder. Digite a sequência abaixo no prompt de comando para executar o script e colocar a saída em MyOutput.txt, em MyFolder:

sqlcmd -i C:\MyFolder\MyScript.sql -o C:\MyFolder\MyOutput.txt

Ao exibir os conteúdos de MyOutput.txt no Bloco de Notas, você verá o seguinte:

Changed database context to 'AdventureWorks2008R2'.

BusinessEntityID FirstName LastName

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

1 Syed Abbas

2 Catherine Abel

3 Kim Abercrombie

(3 linhas afetadas)

B. Uso do sqlcmd com uma conexão administrativa dedicada

No exemplo a seguir, sqlcmd é usado para se conectar a um servidor que tem um problema de bloqueio utilizando a conexão de administrador dedicada (DAC).

C:\>sqlcmd -S ServerName -A

1> SELECT blocked FROM sys.dm_exec_requests WHERE blocked <> 0;

2> GO

Aqui está o conjunto de resultados.

spid blocked

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

62 64

(1 linhas afetadas)

Use o sqlcmd para finalizar o processo de bloqueio.

1> KILL 64;

2> GO

C. Uso do sqlcmd para executar um procedimento armazenado

O exemplo a seguir mostra como executar um procedimento armazenado usando o sqlcmd. Criar o seguinte procedimento armazenado.

USE AdventureWorks2008R2;

IF OBJECT_ID ( ' dbo.ContactEmailAddress, 'P' ) IS NOT NULL

DROP PROCEDURE dbo.ContactEmailAddress;

GO

CREATE PROCEDURE dbo.ContactEmailAddress

(

@FirstName nvarchar(50)

,@LastName nvarchar(50)

)

AS

SET NOCOUNT ON

SELECT EmailAddress

FROM Person.Person

WHERE FirstName = @FirstName

AND LastName = @LastName;

SET NOCOUNT OFF

No prompt sqlcmd, insira o seguinte:

C:\sqlcmd

1> :Setvar FirstName Gustavo

1> :Setvar LastName Achong

1> EXEC dbo.ContactEmailAddress $(Gustavo),$(Achong)

2> GO

EmailAddress

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

gustavo0@adventure-works.com

D. Uso do sqlcmd para manutenção de banco de dados

O exemplo a seguir mostra como usar o sqlcmd para uma tarefa de manutenção de banco de dados. Crie C:\BackupTemplate.sql com o seguinte código.

USE master;

BACKUP DATABASE [$(db)] TO DISK='$(bakfile)';

No prompt sqlcmd, insira o seguinte:

C:\ >sqlcmd

1> :connect <server>

Sqlcmd: Successfully connected to server <server>.

1> :setvar db msdb

1> :setvar bakfile c:\msdb.bak

1> :r c:\BackupTemplate.sql

2> GO

Changed database context to 'master'.

Processed 688 pages for database 'msdb', file 'MSDBData' on file 2.

Processed 5 pages for database 'msdb', file 'MSDBLog' on file 2.

BACKUP DATABASE successfully processed 693 pages in 0.725 seconds (7.830 MB/sec)

E. Uso do sqlcmd para executar o código em diversas instâncias

O código a seguir em um arquivo exibe um script que conecta a duas instâncias. Note o GO antes da conexão com a segunda instância.

:CONNECT <server>\,<instance1>

EXEC dbo.SomeProcedure

GO

:CONNECT <server>\,<instance2>

EXEC dbo.SomeProcedure

GO

E. Retorno da saída de XML

O exemplo a seguir mostra como saída de XML é retornada não formatada, em um fluxo contínuo.

C:\>sqlcmd -d AdventureWorks2008R2

1> :XML ON

1> SELECT TOP 3 FirstName + ' ' + LastName + ', '

2> FROM Person.Person

3> GO

Syed Abbas, Catherine Abel, Kim Abercrombie,

F. Uso do sqlcmd em um arquivo de script do Windows

Um comando sqlcmdcomo o sqlcmd -i C:\InputFile.txt -o C:\OutputFile.txt, pode ser executado em um arquivo .bat junto com o VBScript. Neste caso, não use as opções interativas. O sqlcmd deve ser instalado no computador que estiver executando o arquivo .bat.

Primeiro, crie os quatro arquivos a seguir:

  • C:\badscript.sql

    SELECT batch_1_this_is_an_error
    GO
    SELECT 'batch #2'
    GO
    
  • C:\goodscript.sql

    SELECT 'batch #1'
    GO
    SELECT 'batch #2'
    GO
    
  • C:\returnvalue.sql

    :exit(select 100)
    @echo off
    C:\windowsscript.bat
    @echo off
    
    echo Running badscript.sql
    sqlcmd -i badscript.sql -b -o out.log
    if not errorlevel 1 goto next1
    echo == An error occurred 
    
    :next1
    
    echo Running goodscript.sql
    sqlcmd -i goodscript.sql -b -o out.log
    if not errorlevel 1 goto next2
    echo == An error occurred 
    
    :next2
    echo Running returnvalue.sql
    sqlcmd -i returnvalue.sql -o out.log
    echo SQLCMD returned %errorlevel% to the command shell
    
    :exit
    

Em seguida, no prompt de comando, execute C:\windowsscript.bat:

C:\>windowsscript.bat

Running badscript.sql

== An error occurred

Running goodscript.sql

Running returnvalue.sql

SQLCMD returned 100 to the command shell

G. Usando o sqlcmd para definir a criptografia em bancos de dados SQL Azure

Um sqlcmdpode ser executado em uma conexão com dados do SQL Azure para especificar a criptografia e a confiança do certificado. Duas opções de sqlcmdestão disponíveis:

  • A opção -N é usada pelo cliente para solicitar uma conexão criptografada. Essa opção é equivalente à opção ENCRYPT = true do ADO.net.

  • A opção -C é usada pelo cliente para configurá-lo para confiar implicitamente no certificado do servidor e não validá-lo. Essa opção é equivalente à opção TRUSTSERVERCERTIFICATE = true do ADO.net.

O serviço SQL Azure não dá suporte a todas as opções de SET disponíveis em uma instância do SQL Server. As opções a seguir emitem um erro quando a opção de SET correspondente é definida como ON ou OFF:

  • SET ANSI_DEFAULTS

  • SET ANSI_NULLS

  • SET REMOTE_PROC_TRANSACTIONS

  • SET ANSI_NULL_DEFAULT

As opções de SET a seguir não emitem exceções, mas não podem ser usadas. Elas são substituídas:

  • SET CONCAT_NULL_YIELDS_NULL

  • SET ANSI_PADDING

  • SET QUERY_GOVERNOR_COST_LIMIT

Sintaxe

Os exemplos a seguir fazem referência a casos em que as configurações do provedor SQL Server Native Client incluem: ForceProtocolEncryption = False, Trust Server Certificate = No

Conectar usando credenciais do Windows e comunicação criptografada:

SQLCMD –E –N

Conectar usando credenciais do Windows e certificado do servidor confiável:

SQLCMD –E –C

Conectar usando credenciais do Windows, comunicação criptografada e certificado do servidor confiável:

SQLCMD –E –N –C

Os exemplos a seguir fazem referência a casos em que as configurações do provedor SQL Server Native Client incluem: ForceProtocolEncryption = True, TrustServerCertificate = Yes.

Conectar usando credenciais do Windows, comunicação criptografada e certificado do servidor confiável:

SQLCMD –E

Conectar usando credenciais do Windows, comunicação criptografada e certificado do servidor confiável:

SQLCMD –E –N

Conectar usando credenciais do Windows, comunicação criptografada e certificado do servidor confiável:

SQLCMD –E –T

Conectar usando credenciais do Windows, comunicação criptografada e certificado do servidor confiável:

SQLCMD –E –N –C

Se o provedor especificar ForceProtocolEncryption = True a criptografia será habilitada mesmo que Encrypt=No esteja na cadeia de conexão.