Usare sqlcmd
Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure database SQL di Azure Synapse Analytics Platform System (PDW) in Microsoft Fabric
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 di attività di scripting T-SQL. Per usare sqlcmd in modo interattivo o per compilare file script per sqlcmd, è necessario conoscere T-SQL. È possibile usare sqlcmd in vari modi. Ad esempio:
Immettere istruzioni T-SQL dal prompt dei comandi. La console restituisce i risultati. Per aprire una finestra del prompt dei comandi, immettere
cmd
nella casella di ricerca di Windows e selezionare Prompt dei comandi per aprirlo. Al prompt dei comandi digitaresqlcmd
seguito da un elenco delle opzioni desiderate. Per un elenco completo delle opzioni supportate da sqlcmd, vedere Utilità sqlcmd.Inviare un processo sqlcmd specificando una singola istruzione T-SQL da eseguire o facendo in modo che l'utilità punti a un file di testo contenente istruzioni T-SQL da eseguire. L'output viene in genere indirizzato a un file di testo, ma può essere anche visualizzato al prompt dei comandi.
Modalità SQLCMD nell'editor di query di SQL Server Management Studio.
SQL Server Management Objects (SMO).
Processi CmdExec di SQL Server Agent.
Opzioni comuni di sqlcmd
L'opzione server (
-S
) identifica l'istanza di SQL Server alla quale si connette sqlcmd.Le opzioni di autenticazione (
-E
,-U
e-P
) specificano le credenziali usate da sqlcmd per connettersi all'istanza di SQL Server.Nota
L'opzione
-E
è quella predefinita e non deve essere specificata.Le opzioni di input (
-Q
,-q
, and-i
) identificano la posizione dell'input per sqlcmd.L'opzione di output (
-o
) specifica il file nel quale sqlcmd inserirà il proprio output.
Connettersi all'utilità sqlcmd
Connettersi a un'istanza predefinita utilizzando l'autenticazione di Windows per eseguire in modo interattivo le istruzioni T-SQL:
sqlcmd -S <ComputerName>
Nota
Nell'esempio precedente l'opzione
-E
non è specificata perché è l'opzione predefinita. sqlcmd si connette all'istanza predefinita usando l'autenticazione di Windows.Connettersi a un'istanza denominata utilizzando l'autenticazione di Windows per eseguire in modo interattivo le istruzioni T-SQL:
sqlcmd -S <ComputerName>\<InstanceName>
or
sqlcmd -S .\<InstanceName>
Connessione a un'istanza denominata utilizzando l'autenticazione di Windows e specificando i file di input e di output:
sqlcmd -S <ComputerName>\<InstanceName> -i <MyScript.sql> -o <MyOutput.rpt>
Connettersi all'istanza predefinita nel computer locale usando l'autenticazione di Windows, eseguire una query e mantenere sqlcmd in esecuzione al termine dell'esecuzione della query:
sqlcmd -q "SELECT * FROM AdventureWorks2022.Person.Person"
Connettersi all'istanza predefinita nel computer locale con l'autenticazione di Windows, esecuzione di una query, indirizzamento dell'output a un file e impostazione di sqlcmd in modo che venga chiuso 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 richiesta di password da parte di sqlcmd:
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 con sqlcmd, eseguire l'utilità senza usare le opzioni -Q
, -q
, -Z
o -i
per specificare eventuali 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 il valore 1>
seguito da un carattere di sottolineatura intermittente denominato prompt di sqlcmd. Il valore 1
indica che si tratta della prima riga di un'istruzione T-SQL, mentre il prompt di sqlcmd è il punto in cui inizia l'istruzione T-SQL quando la si digita.
Al prompt di sqlcmd è possibile digitare sia istruzioni T-SQL che comandi di sqlcmd, ad esempio GO
e EXIT
. Ogni istruzione T-SQL viene inserita in un buffer denominato cache dell'istruzione. Dopo aver digitato il comando GO
e premuto Invio, queste istruzioni vengono inviate a SQL Server. Per terminare sqlcmd, digitare EXIT
o QUIT
all'inizio di una nuova riga.
Per cancellare il contenuto della cache delle istruzioni, digitare :RESET
. Digitando Ctrl+C sqlcmd verrà chiuso. È inoltre possibile utilizzare Ctrl+C per arrestare l'esecuzione della cache delle istruzioni dopo l'esecuzione di un comando GO
.
Le istruzioni T-SQL immesse in una sessione interattiva possono essere modificate immettendo il comando :ED
e il prompt di sqlcmd. Verrà aperto l'editor. 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 rivista.
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. La traduzione avviene tuttavia nel server. Le variabili di scripting non vengono espanse se sono incluse all'interno di una stringa.
Ad esempio:
sqlcmd
PRINT "Length: 5"" 7'";
GO
Il set di risultati è il seguente.
Length: 5" 7'
Stringhe che si estendono su più righe
sqlcmd supporta stringhe che si estendono su più righe. Ad esempio, l'istruzione SELECT
seguente si estende su più righe ma rappresenta una stringa singola dopo aver digitato GO
e si preme quindi Invio.
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 la finestra del prompt dei comandi, è presente una riga simile alla seguente:
C:\Temp\>
Questo significa che la cartella C:\Temp\
è la cartella corrente. Se si specifica un nome di file, Windows cercherà il file in tale cartella.
Digitare sqlcmd per connettersi all'istanza predefinita di SQL Server nel computer locale. Il contenuto della finestra del prompt dei comandi sarà il seguente:
C:\Temp>sqlcmd
1>
Questo significa che è stata eseguita la connessione all'istanza di SQL Server e sqlcmd è ora pronto ad accettare istruzioni T-SQL e comandi sqlcmd. Il carattere di sottolineatura intermittente dopo il valore 1>
è il prompt di sqlcmd che contrassegna la posizione in cui verranno visualizzati le istruzioni e i comandi digitati. Digitare USE AdventureWorks2022
e premere Invio, quindi digitare GO
e premere Invio. Il contenuto della finestra del prompt dei comandi sarà il seguente:
sqlcmd
USE AdventureWorks2022;
GO
Il set di risultati è il seguente.
Changed database context to 'AdventureWorks2022'.
1>
Quando si preme Invio, segnala a sqlcmd di avviare una nuova riga. Premendo Invio, dopo avere digitato GO
viene segnalato a sqlcmd di inviare l'istruzione USE AdventureWorks2022
all'istanza di SQL Server. sqlcmd restituisce quindi un messaggio per indicare che l'istruzione USE
è stata completata correttamente e visualizza un nuovo prompt di 1>
per indicare che è possibile immettere un nuovo comando o istruzione.
Nell'esempio seguente viene illustrato il contenuto della finestra del prompt dei comandi quando si digita un'istruzione SELECT
, un comando GO
per eseguire l'istruzione SELECT
e un comando EXIT
per uscire da sqlcmd:
USE AdventureWorks2022;
GO
SELECT TOP (3) BusinessEntityID, FirstName, LastName
FROM Person.Person;
GO
Il set di risultati è il seguente.
BusinessEntityID FirstName LastName
----------------- ---------- ------------
1 Syed Abbas
2 Catherine Abel
3 Kim Abercrombie
Dopo la generazione dell'output, sqlcmd reimposta il prompt di sqlcmd e visualizza 1>
. Per terminare la sessione, digitare EXIT
al prompt di 1>
. È ora possibile chiudere la finestra del prompt dei comandi digitando un altro comando EXIT
.
Creare ed eseguire query su un contenitore 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.
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 e interrogarla.
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 eliminare il contenitore Docker quando non è più necessario.
sqlcmd delete
Eseguire file script Transact-SQL mediante using sqlcmd
È possibile usare sqlcmd per eseguire file script del database. I file 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 di un set di istruzioni T-SQL in modo interattivo in SQL Server Management Studio e quindi salvare il contenuto della finestra della query come file script.
È possibile creare un file di testo contenente istruzioni T-SQL utilizzando un editor di testo, ad esempio Blocco note.
Esempi
R. Eseguire uno script utilizzando 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
. Al prompt dei comandi immettere quanto segue per eseguire lo script e inserire l'output nel file MyOutput.txt
della cartella MyFolder
.
sqlcmd -i C:\MyFolder\MyScript.sql -o C:\MyFolder\MyOutput.txt
Il set di risultati è il seguente.
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 utilizzato per connettersi a un server in cui si è verificato un problema di blocco utilizzando la connessione amministrativa dedicata (DAC).
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
Il set di risultati è il seguente.
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 illustrata la modalità di esecuzione di una stored procedure mediante 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 il codice seguente:
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 l'utilizzo di 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 su 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 un 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 script di Windows
Un comando di sqlcmd come sqlcmd -i C:\Temp\InputFile.txt -o C:\Temp\OutputFile.txt,
può essere eseguito in un file con estensione bat insieme a VBScript. In questo caso, non utilizzare opzioni interattive. sqlcmd deve essere installato nel computer che esegue il file con estensione bat.
Creare innanzitutto 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
È possibile eseguire sqlcmd su una connessione ai dati database SQL per specificare la crittografia e l'attendibilità del certificato. Sono disponibili due opzioni di sqlcmd:
L'opzione
-N
viene utilizzata dal client per richiedere una connessione crittografata. Equivale all'opzione ADO.netENCRYPT = true
.L'opzione
-C
viene usata dal client per configurare l'attendibilità implicita del certificato del server senza necessità di convalida. Equivale all'opzione ADO.netTRUSTSERVERCERTIFICATE = true
.
Il servizio database SQL non supporta tutte le opzioni SET
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 SET seguenti non generano eccezioni ma non possono essere utilizzate, in quanto deprecate:
SET CONCAT_NULL_YIELDS_NULL
SET ANSI_PADDING
SET QUERY_GOVERNOR_COST_LIMIT
Sintassi
Gli esempi seguenti si riferiscono 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 si riferiscono 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 è abilitata anche se nella stringa di connessione è impostato Encrypt=No
.