sqlcmd : usare l'utilità

Si applica a:SQL Serverdatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse AnalyticsPiattaforma di strumenti analitici (PDW)

L'utilità sqlcmd è un'utilità della riga di comando per l'esecuzione interattiva ad hoc di istruzioni e script Transact-SQL (T-SQL) e per l'automazione delle attività di scripting T-SQL. Per usare sqlcmd in modo interattivo o per compilare file di script da eseguire con sqlcmd, gli utenti devono comprendere T-SQL. L'utilità sqlcmd viene in genere usata nei modi seguenti:

  • Gli utenti immettono istruzioni T-SQL in modo simile al funzionamento al prompt dei comandi. I risultati vengono visualizzati al prompt dei comandi. Per aprire una finestra del prompt dei comandi, immettere cmd nella casella di ricerca di Windows e selezionare Prompt dei comandi da aprire. Al prompt dei comandi digitare sqlcmd seguito da un elenco delle opzioni desiderate. Per un elenco completo delle opzioni supportate da sqlcmd, vedere utilità sqlcmd.

  • Gli utenti inviano un processo sqlcmd specificando una singola istruzione T-SQL da eseguire oppure puntando l'utilità a un file di testo contenente istruzioni T-SQL da eseguire. L'output viene indirizzato a un file di testo, ma può anche essere visualizzato al prompt dei comandi.

  • Modalità SQLCMD in SQL Server Management Studio (SSMS) Editor di query.

  • SQL Server Management Objects (SMO).

  • Processi CmdExec di SQL Server Agent.

Opzioni di sqlcmd utilizzate di frequente

  • L'opzione server (-S) identifica l'istanza di SQL Server a cui si connette sqlcmd .

  • Le opzioni di autenticazione (-E, -Ue -P) specificano le credenziali usate da sqlcmd per connettersi all'istanza di SQL Server.

    Nota

    L'opzione è l'impostazione -E predefinita e non deve essere specificata.

  • Le opzioni di input (-Q, -qe -i) identificano la posizione dell'input in sqlcmd.

  • L'opzione di output (-o) specifica il file in cui sqlcmd deve inserire il relativo output.

Connettersi all'utilità sqlcmd

  • Connessione a un'istanza predefinita usando l'autenticazione di Windows per eseguire in modo interattivo istruzioni T-SQL:

    sqlcmd -S <ComputerName>
    

    Nota

    Nell'esempio -E precedente, non viene specificato perché è il valore predefinito e sqlcmd si connette all'istanza predefinita usando l'autenticazione di Windows.

  • Connessione a un'istanza denominata usando l'autenticazione di Windows per eseguire in modo interattivo istruzioni T-SQL:

    sqlcmd -S <ComputerName>\<InstanceName>
    

    or

    sqlcmd -S .\<InstanceName>
    
  • Connessione a un'istanza denominata usando l'autenticazione di Windows e specificando i file di input e output:

    sqlcmd -S <ComputerName>\<InstanceName> -i <MyScript.sql> -o <MyOutput.rpt>
    
  • Connessione all'istanza predefinita nel computer locale usando l'autenticazione di Windows, l'esecuzione di una query e la presenza di sqlcmd in esecuzione al termine dell'esecuzione della query:

    sqlcmd -q "SELECT * FROM AdventureWorks2022.Person.Person"
    
  • Connessione all'istanza predefinita nel computer locale usando l'autenticazione di Windows, eseguendo una query, indirizzando l'output a un file e dopo aver chiuso sqlcmd al termine dell'esecuzione della query:

    sqlcmd -Q "SELECT * FROM AdventureWorks2022.Person.Person" -o MyOutput.txt
    
  • Connessione a un'istanza denominata usando l'autenticazione di SQL Server per eseguire in modo interattivo istruzioni T-SQL, con sqlcmd che richiede una password:

    sqlcmd -U MyLogin -S <ComputerName>\<InstanceName>
    

    Suggerimento

    Per un elenco delle opzioni supportate dall'utilità sqlcmd , eseguire: sqlcmd -?.

Eseguire le istruzioni Transact-SQL in modo interattivo usando sqlcmd

È possibile usare l'utilità sqlcmd in modo interattivo per eseguire istruzioni T-SQL in una finestra del prompt dei comandi. Per eseguire in modo interattivo istruzioni T-SQL usando sqlcmd, eseguire l'utilità senza usare le -Qopzioni , -q, -Zo -i per specificare file di input o query. Ad esempio:

sqlcmd -S <ComputerName>\<InstanceName>

Quando il comando viene eseguito senza file di input o query, sqlcmd si connette all'istanza specificata di SQL Server e quindi visualizza una nuova riga con un 1> seguito da un carattere di sottolineatura lampeggiante denominato prompt di sqlcmd . 1 Indica che si tratta della prima riga di un'istruzione T-SQL e il prompt di sqlcmd è il punto in cui l'istruzione T-SQL inizia quando la si digita.

Al prompt di sqlcmd è possibile digitare sia istruzioni T-SQL che comandi sqlcmd, ad esempio GO e EXIT. Ogni istruzione T-SQL viene inserita in un buffer denominato cache delle istruzioni. Queste istruzioni vengono inviate a SQL Server dopo aver digitato il GO comando e premere INVIO. Per uscire da sqlcmd, digitare EXIT o QUIT all'inizio di una nuova riga.

Per cancellare il contenuto della cache delle istruzioni, digitare :RESET. Se si digita CTRL+C, sqlcmd viene chiuso. È anche possibile usare CTRL+C per arrestare l'esecuzione della cache delle istruzioni dopo l'esecuzione di un GO comando.

Le istruzioni T-SQL immesse in una sessione interattiva possono essere modificate immettendo il :ED comando e il prompt di sqlcmd . L'editor si aprirà e, dopo aver modificato l'istruzione T-SQL e chiuso l'editor, l'istruzione T-SQL modificata verrà visualizzata nella finestra di comando. Immettere GO per eseguire l'istruzione T-SQL modificata.

Stringhe tra virgolette

I caratteri racchiusi tra virgolette vengono utilizzati senza alcuna pre-elaborazione aggiuntiva, fatta eccezione per il fatto che è possibile inserire virgolette in una stringa immettendo due virgolette consecutive. SQL Server tratta questa sequenza di caratteri come virgoletta. Tuttavia, la traduzione viene eseguita nel server. Le variabili di scripting non vengono espanse quando vengono visualizzate all'interno di una stringa.

Ad esempio:

sqlcmd
PRINT "Length: 5"" 7'";
GO

Questo è il set di risultati.

Length: 5" 7'

Stringhe che si estendono su più righe

sqlcmd supporta script con stringhe che si estendono su più righe. Ad esempio, l'istruzione seguente SELECT si estende su più righe, ma è una singola stringa eseguita quando si preme INVIO dopo aver digitato GO.

SELECT <First line>
FROM <Second line>
WHERE <Third line>;
GO

Esempio di esecuzione interattiva dell'utilità sqlcmd

Nell'esempio seguente viene illustrato il contenuto della finestra del prompt dei comandi quando si esegue sqlcmd in modo interattivo.

Quando si apre una finestra del prompt dei comandi, è presente una riga simile alla seguente:

C:\Temp\>

Ciò significa che la cartella è la cartella C:\Temp\ corrente e, se si specifica un nome file, Windows cerca il file in tale cartella.

Digitare sqlcmd per connettersi all'istanza predefinita di SQL Server nel computer locale e il contenuto della finestra del prompt dei comandi è il seguente:

C:\Temp>sqlcmd
1>

Ciò significa che è stata stabilita la connessione all'istanza di SQL Server e sqlcmd è ora possibile accettare istruzioni T-SQL e comandi sqlcmd . Il carattere di sottolineatura lampeggiante dopo è 1> il prompt sqlcmd che contrassegna il percorso in cui vengono visualizzate le istruzioni e i comandi digitati. USE AdventureWorks2022 Digitare e premere INVIO, quindi digitare GO e premere INVIO. Il contenuto della finestra del prompt dei comandi è il seguente:

sqlcmd
USE AdventureWorks2022;
GO

Questo è il set di risultati.

Changed database context to 'AdventureWorks2022'.
1>

Quando si preme INVIO, segnala a sqlcmd di avviare una nuova riga. Premendo INVIO dopo aver digitato GO, segnala a sqlcmd di inviare l'istruzione all'istanza USE AdventureWorks2022 di SQL Server. sqlcmd restituisce quindi un messaggio per indicare che l'istruzione USE è stata completata correttamente e visualizza un nuovo 1> prompt come segnale per immettere una nuova istruzione o un comando.

Nell'esempio seguente viene illustrato il contenuto della finestra del prompt dei comandi se si digita un'istruzione SELECT , un GO oggetto per eseguire SELECTe un oggetto EXIT per uscire da sqlcmd:

USE AdventureWorks2022;
GO
SELECT TOP (3) BusinessEntityID, FirstName, LastName
FROM Person.Person;
GO

Questo è il set di risultati.

BusinessEntityID  FirstName  LastName
----------------- ---------- ------------
1                 Syed       Abbas
2                 Catherine  Abel
3                 Kim        Abercrombie

Dopo aver generato l'output, sqlcmd reimposta il prompt di sqlcmd e visualizza 1>. Digitare EXIT al 1> prompt per uscire dalla sessione. È ora possibile chiudere la finestra del prompt dei comandi digitando un altro comando EXIT .

Creare ed eseguire query su un contenitore di SQL Server

È possibile usare sqlcmd (Go) per creare una nuova istanza di SQL Server in un contenitore. sqlcmd (Go) espone un'istruzione create che consente di specificare un'immagine del contenitore e un backup di SQL Server per creare rapidamente un'istanza di SQL Server per scopi di sviluppo, debug e analisi.

Importante

È necessario che sia installato un runtime del contenitore, ad esempio Docker o Podman.

Il comando seguente illustra come visualizzare tutte le opzioni disponibili per creare un nuovo contenitore di SQL Server:

sqlcmd create mssql --help

Il comando seguente crea una nuova istanza di SQL Server usando la versione più recente di SQL Server 2022 (16.x), quindi ripristina il database di esempio Wide World Importers:

sqlcmd create mssql --accept-eula --tag 2022-latest --using https://github.com/Microsoft/sql-server-samples/releases/download/wide-world-importers-v1.0/WideWorldImporters-Full.bak

Dopo aver creato l'istanza di SQL Server, è possibile usare sqlcmd (Go) per gestirla ed eseguirne query.

Il comando seguente conferma la versione dell'istanza creata:

sqlcmd query "SELECT @@version"

Il comando seguente avvia una sessione interattiva con l'istanza creata:

sqlcmd query

Il comando seguente apre Azure Data Studio e si connette automaticamente al database ripristinato durante il processo di creazione:

sqlcmd open ads

Il comando seguente elenca stringa di connessione da usare per connettersi all'istanza creata:

sqlcmd config connection-strings

Il comando seguente viene usato per rimuovere il contenitore quando non è più necessario:

sqlcmd delete

Eseguire file di script Transact-SQL con sqlcmd

È possibile usare sqlcmd per eseguire file script del database. I file di script sono file di testo che contengono una combinazione di istruzioni T-SQL, comandi sqlcmd e variabili di scripting. Per altre informazioni sullo scripting di variabili, vedere Utilizzo di sqlcmd con variabili di scripting. Il funzionamento disqlcmd con le istruzioni, i comandi e le variabili di scripting presenti in un file script è analogo al funzionamento con le istruzioni e i comandi immessi in modo interattivo. La principale differenza sta nel fatto che sqlcmd legge il file di input senza pause anziché attendere l'immissione di istruzioni, comandi e variabili di scripting da parte dell'utente.

I file script di database possono essere creati nei modi seguenti:

  • È possibile compilare ed eseguire il debug interattivo di un set di istruzioni T-SQL in SQL Server Management Studio e quindi salvare il contenuto della finestra query come file di script.

  • È possibile creare un file di testo contenente istruzioni T-SQL usando un editor di testo, ad esempio Blocco note.

Esempi

R. Eseguire uno script usando sqlcmd

Avviare Blocco note e digitare le istruzioni T-SQL seguenti:

USE AdventureWorks2022;
GO
SELECT TOP (3) BusinessEntityID, FirstName, LastName
FROM Person.Person;
GO

Creare una cartella denominata MyFolder e quindi salvare lo script come file MyScript.sql nella cartella C:\MyFolder. Immettere il comando seguente al prompt dei comandi per eseguire lo script e inserire l'output in MyOutput.txtMyFolder:

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

Questo è il set di risultati.

Changed database context to 'AdventureWorks2022'.
BusinessEntityID  FirstName  LastName
----------------- ---------- ------------
1                 Syed       Abbas
2                 Catherine  Abel
3                 Kim        Abercrombie
(3 rows affected)

B. Usare sqlcmd con una connessione amministrativa dedicata

Nell'esempio seguente sqlcmd viene usato per connettersi a un server che presenta un problema di blocco tramite la connessione amministrativa dedicata.

C:\Temp\>sqlcmd -S ServerName -A
1> SELECT session_id, blocking_session_id FROM `sys.dm_exec_requests` WHERE blocking_session_id <> 0;
2> GO

Questo è il set di risultati.

session_id   blocking_session_id
-----------  --------------------`
62           64
(1 rows affected)

Usare sqlcmd per terminare il processo di blocco.

1> KILL 64;
2> GO

C. Usare sqlcmd per eseguire una stored procedure

Nell'esempio seguente viene illustrato come eseguire una stored procedure usando sqlcmd. Creare la stored procedure seguente.

USE AdventureWorks2022;
GO

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;
GO

Al prompt di sqlcmd immettere quanto segue:

C:\Temp\sqlcmd
1> :Setvar FirstName Gustavo
1> :Setvar LastName Achong
1> EXEC dbo.ContactEmailAddress $(FirstName),$(LastName)
2> GO
EmailAddress
-----------------------------
gustavo0@adventure-works.com

D. Usare sqlcmd per la manutenzione del database

Nell'esempio seguente viene illustrato come usare sqlcmd per un'attività di manutenzione del database. Creare C:\Temp\BackupTemplate.sql con il codice seguente.

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

Al prompt di sqlcmd immettere il codice seguente:

C:\Temp\>sqlcmd
1> :connect <server>
Sqlcmd: Successfully connected to server <server>.
1> :setvar db msdb
1> :setvar bakfile C:\Temp\msdb.bak
1> :r C:\Temp\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. Usare sqlcmd per eseguire codice in più istanze

Il codice seguente in un file rappresenta un esempio di script che si connette a due istanze. Si noti il comando GO prima della connessione alla seconda istanza.

:CONNECT <server>\,<instance1>
EXEC dbo.SomeProcedure
GO
:CONNECT <server>\,<instance2>
EXEC dbo.SomeProcedure
GO

E. Restituire l'output XML

Nell'esempio seguente viene illustrato come l'output XML venga restituito non formattato in un flusso continuo.

C:\Temp\>sqlcmd -d AdventureWorks2022
1> :XML ON
1> SELECT TOP 3 FirstName + ' ' + LastName + ', '
2> FROM Person.Person
3> GO
Syed Abbas, Catherine Abel, Kim Abercrombie,

F. Usare sqlcmd in un file di script di Windows

Un comando sqlcmd , sqlcmd -i C:\Temp\InputFile.txt -o C:\Temp\OutputFile.txt, ad esempio, può essere eseguito in un file .bat insieme a VBScript. In questo caso, non usare opzioni interattive. sqlcmd deve essere installato nel computer che esegue il file con estensione bat.

Creare prima di tutto i quattro file seguenti in C:\Temp:

  • C:\Temp\badscript.sql

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

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

    :exit(select 100)
    
  • C:\Temp\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
    

Quindi, al prompt dei comandi eseguire C:\Temp\windowsscript.bat:

C:\Temp\>windowsscript.bat
Running badscript.sql
== An error occurred
Running goodscript.sql
Running returnvalue.sql

SQLCMD returned 100 to the command shell

G. Usare sqlcmd per impostare la crittografia in database SQL di Azure

sqlcmd può essere eseguito su una connessione per database SQL dati su per specificare la crittografia e l'attendibilità del certificato. Sono disponibili due opzioni sqlcmd :

  • L'opzione -N viene utilizzata dal client per richiedere una connessione crittografata. Equivale all'opzione ADO.net ENCRYPT = true.

  • L'opzione -C viene usata dal client per configurarla in modo implicito sul certificato del server di attendibilità e non convalidarla. Equivale all'opzione ADO.net TRUSTSERVERCERTIFICATE = true.

Il servizio database SQL non supporta tutte le SET opzioni disponibili in un'istanza di SQL Server. Nelle opzioni seguenti viene generato un errore quando l'opzione SET corrispondente è impostata su ON o OFF:

  • SET ANSI_DEFAULTS
  • SET ANSI_NULLS
  • SET REMOTE_PROC_TRANSACTIONS
  • SET ANSI_NULL_DEFAULT

Le opzioni edizione Standard T seguenti non generano eccezioni, ma non possono essere usate. Sono deprecati:

  • SET CONCAT_NULL_YIELDS_NULL
  • SET ANSI_PADDING
  • SET QUERY_GOVERNOR_COST_LIMIT

Sintassi

Gli esempi seguenti fanno riferimento ai casi in cui le impostazioni del provider SQL Server Native Client includono:

  • ForceProtocolEncryption = False
  • Trust Server Certificate = No

Effettuare la connessione utilizzando le credenziali di Windows e la comunicazione crittografata:

sqlcmd -E -N

Effettuare la connessione utilizzando le credenziali di Windows e un certificato server attendibile:

sqlcmd -E -C

Effettuare la connessione utilizzando le credenziali di Windows, la comunicazione crittografata e un certificato server attendibile:

sqlcmd -E -N -C

Gli esempi seguenti fanno riferimento ai casi in cui le impostazioni del provider SQL Server Native Client includono:

  • ForceProtocolEncryption = True
  • TrustServerCertificate = Yes

Effettuare la connessione utilizzando le credenziali di Windows, la comunicazione crittografata e un certificato server attendibile:

sqlcmd -E

Effettuare la connessione utilizzando le credenziali di Windows, la comunicazione crittografata e un certificato server attendibile:

sqlcmd -E -N

Effettuare la connessione utilizzando le credenziali di Windows, la comunicazione crittografata e un certificato server attendibile:

sqlcmd -E -C

Effettuare la connessione utilizzando le credenziali di Windows, la comunicazione crittografata e un certificato server attendibile:

sqlcmd -E -N -C

Se il provider specifica ForceProtocolEncryption = True, la crittografia viene abilitata anche se Encrypt=No nella stringa di connessione.

Passaggi successivi