Utilizzo di sqlcmd con variabili di scripting
Per variabile di scripting si intende una variabile utilizzata negli script. Le variabili di scripting consentono di utilizzare uno script in più scenari. Se, ad esempio, si desidera eseguire uno script su più server, è possibile utilizzare una variabile di scripting per il nome del server anziché modificare lo script per ogni server. È infatti sufficiente modificare il nome del server fornito alla variabile di scripting per eseguire lo stesso script su server diversi.
Le variabili di scripting possono essere definite in modo esplicito tramite il comando setvar oppure in modo implicito tramite l'opzione sqlcmd-v.
In questo argomento sono inoltre disponibili alcuni esempi in cui vengono definite variabili di ambiente al prompt dei comandi di Cmd.exe tramite SET.
Impostazione delle variabili di scripting tramite il comando setvar
Il comando setvar consente di definire variabili di scripting. Le variabili definite tramite il comando setvar vengono archiviate internamente. Le variabili di scripting non devono essere confuse con le variabili di ambiente che vengono definite al prompt dei comandi tramite SET. Se uno script fa riferimento a una variabile che non corrisponde a una variabile di ambiente oppure che non è stata definita tramite il comando setvar, verrà restituito un messaggio di errore e l'esecuzione dello script verrà interrotta. Per ulteriori informazioni, vedere l'opzione -b in Utilità sqlcmd.
Precedenza delle variabili (ordine crescente)
Se è stato assegnato lo stesso nome a più tipi di variabile, verrà utilizzata la variabile con la precedenza più alta.
Variabili di ambiente a livello di sistema
Variabili di ambiente a livello di utente
Shell dei comandi (SET X=Y) impostata al prompt dei comandi prima dell'avvio di sqlcmd
sqlcmd-v X=Y
:Setvar X Y
[!NOTA]
Per visualizzare le variabili di ambiente, nel Pannello di controllo fare doppio clic su Sistema e quindi fare clic sulla scheda Avanzate.
Impostazione implicita delle variabili di scripting
Quando si avvia sqlcmd con un'opzione cui è correlata una variabile sqlcmd, quest'ultima viene impostata in modo implicito sul valore specificato tramite l'opzione. Nell'esempio seguente sqlcmd viene avviato con l'opzione -l. La variabile SQLLOGINTIMEOUT viene quindi impostata in modo implicito.
c:\> sqlcmd -l 60
È inoltre possibile utilizzare l'opzione --v per impostare una variabile di scripting presente in uno script. Nello script seguente (il nome di file è testscript.sql) ColumnName è una variabile di scripting.
USE AdventureWorks;
SELECT x.$(ColumnName)
FROM Person.Contact x
WHERE c.ContactID < 5;
È quindi possibile specificare il nome della colonna che si desidera restituire utilizzando l'opzione -v:
sqlcmd -v ColumnName ="FirstName" -i c:\testscript.sql
Per restituire una colonna diversa utilizzando lo stesso script, modificare il valore della variabile di scripting ColumnName.
sqlcmd -v ColumnName ="LastName" -i c:\testscript.sql
Linee guida relative ai nomi e ai valori delle variabili di scripting
Quando si assegna un nome alle variabili di scripting, è necessario tenere presenti le linee guida seguenti:
I nomi delle variabili non devono contenere spazi vuoti o virgolette.
Il formato dei nomi delle variabili non deve essere identico a quello di un'espressione con variabili, ad esempio $(var).
Per le variabili di scripting non viene fatta distinzione tra maiuscole e minuscole.
[!NOTA]
Se non viene assegnato alcun valore a una variabile di ambiente sqlcmd, la variabile viene rimossa. Se si utilizza :setvar VarName senza un valore, la variabile viene cancellata.
Quando si specifica un valore per le variabili di scripting, è necessario tenere presenti le linee guida seguenti:
I valori delle variabili che vengono definiti tramite setvar o l'opzione -v devono essere racchiusi tra virgolette se nel valore stringa sono inclusi spazi.
Se le virgolette fanno parte del valore della variabile, è necessario utilizzare i caratteri di escape. Ad esempio, :setvar MyVar "spac""e".
Linee guida relative ai valori e ai nomi delle variabili definite tramite SET in Cmd.exe
Le variabili definite tramite SET fanno parte dell'ambiente Cmd.exe e sqlcmd può farvi riferimento. Tenere presenti le linee guida seguenti:
I nomi delle variabili non devono contenere spazi vuoti o virgolette.
I valori delle variabili possono contenere spazi o virgolette.
Variabili di scripting di sqlcmd
Le variabili definite tramite sqlcmd sono note come variabili di scripting. Nella tabella seguente vengono elencate le variabili di scripting di sqlcmd.
Variabile |
Opzione correlata |
L/S |
Valore predefinito |
---|---|---|---|
SQLCMDUSER* |
-U |
L |
"" |
SQLCMDPASSWORD* |
-P |
-- |
"" |
SQLCMDSERVER* |
-S |
L |
"DefaultLocalInstance" |
SQLCMDWORKSTATION |
-H |
L |
"ComputerName" |
SQLCMDDBNAME |
-d |
L |
"" |
SQLCMDLOGINTIMEOUT |
-l |
L/S |
"8" (secondi) |
SQLCMDSTATTIMEOUT |
-t |
L/S |
"0" = attesa illimitata |
SQLCMDHEADERS |
-h |
L/S |
"0" |
SQLCMDCOLSEP |
-s |
L/S |
" " |
SQLCMDCOLWIDTH |
-w |
L/S |
"0" |
SQLCMDPACKETSIZE |
-a |
L |
"4096" |
SQLCMDERRORLEVEL |
-m |
L/S |
"0" |
SQLCMDMAXVARTYPEWIDTH |
-y |
L/S |
"256" |
SQLCMDMAXFIXEDTYPEWIDTH |
-Y |
L/S |
"0" = illimitato |
SQLCMDEDITOR |
L/S |
"edit.com" |
|
SQLCMDINI |
L |
"" |
* Le variabili SQLCMDUSER, SQLCMDPASSWORD e SQLCMDSERVER vengono impostate quando viene utilizzato il comando :Connect.
L indica che il valore può essere impostato solo una volta durante l'inizializzazione del programma.
L/S indica che il valore può essere reimpostato tramite il comando setvar e i successivi comandi utilizzeranno il nuovo valore.
Esempi
A. Utilizzo del comando setvar in uno script
Molte opzioni dell'utilità sqlcmd possono essere controllate in uno script tramite il comando setvar. Nell'esempio seguente viene creato lo script test.sql, in cui la variabile SQLCMDLOGINTIMEOUT viene impostata su 60 secondi e un'altra variabile di scripting, server, viene impostata su testserver. Il codice seguente è incluso in test.sql.
:setvar SQLCMDLOGINTIMEOUT 60
:setvar server "testserver"
:connect $(server) -l $(SQLCMDLOGINTIMEOUT)
USE AdventureWorks;
SELECT FirstName, LastName
FROM Person.Contact;
The script is then called by using sqlcmd:
sqlcmd -i c:\test.sql
B. Utilizzo interattivo del comando setvar
Nell'esempio seguente viene illustrato come impostare una variabile di scripting in modo interattivo tramite il comando setvar.
sqlcmd
:setvar MYDATABASE AdventureWorks
USE $(MYDATABASE);
GO
Set di risultati:
Changed database context to 'AdventureWorks'
1>
C. Utilizzo delle variabili di ambiente al prompt del comandi all'interno di sqlcmd
Nell'esempio seguente vengono impostate quattro variabili di ambiente, che vengono quindi chiamate da sqlcmd.
C:\>SET tablename=Person.Contact
C:\>SET col1=FirstName
C:\>SET col2=LastName
C:\>SET title=Ms.
C:\>sqlcmd -d AdventureWorks
1> SELECT TOP 5 $(col1) + ' ' + $(col2) AS Name
2> FROM $(tablename)
3> WHERE Title ='$(title)'
4> GO
D. Utilizzo di variabili di ambiente a livello di utente all'interno di sqlcmd
Nell'esempio seguente viene impostata al prompt dei comandi la variabile di ambiente a livello di utente %Temp%, che viene quindi passata al file di input sqlcmd. Per ottenere la variabile di ambiente a livello di utente, nel Pannello di controllo fare doppio clic su Sistema. Fare clic sulla scheda Avanzate e quindi fare clic sul pulsante Variabili d'ambiente.
Il codice seguente è presente nel file di input c:\testscript.txt:
:OUT $(MyTempDirectory)
USE AdventureWorks;
SELECT FirstName
FROM AdventureWorks.Person.Contact
WHERE ContactID < 5;
Il codice seguente viene immesso al prompt dei comandi:
C:\ >SET MyTempDirectory=%Temp%\output.txt
C:\ >sqlcmd -i C:\testscript.txt
Il risultato seguente viene inviato al file di output C:\Documents and Settings\<utente>\Impostazioni locali\Temp\output.txt.
Changed database context to 'AdventureWorks'.
FirstName
--------------------------------------------------
Gustavo
Catherine
Kim
Humberto
(4 rows affected)
E. Utilizzo di uno script di avvio
Uno script di avvio di sqlcmd viene eseguito all'avvio di sqlcmd. Nell'esempio seguente viene impostata la variabile di ambiente SQLCMDINI. Di seguito è riportato il contenuto di 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
Di conseguenza, viene chiamato il file init.sql all'avvio di sqlcmd.
C:\> SET sqlcmdini=c:\init.sql
>1 Sqlcmd
Di seguito è riportato l'output.
>1 < user > is connected to < server > (9.00.2047.00)
Nota L'opzione -X disabilita la funzionalità degli script di avvio.
F. Espansione delle variabili
Nell'esempio seguente viene illustrato l'utilizzo dei dati sotto forma di una variabile di sqlcmd.
USE AdventureWorks;
CREATE TABLE AdventureWorks.dbo.VariableTest
(
Col1 nvarchar(50)
);
GO
Inserire una riga nella colonna Col1 di dbo.VariableTest contenente il valore $(tablename).
INSERT INTO AdventureWorks.dbo.VariableTest(Col1)
VALUES('$(tablename)');
GO
Al prompt di sqlcmd, se non viene impostata alcuna variabile su $(tablename), la riga viene restituita dalle istruzioni seguenti.
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
Set di risultati:
>1 Col1
>2 ------------------
>3 $(tablename)
>4
>5 (1 rows affected)
A condizione che la variabile MyVar sia impostata su $(tablename).
>6 :setvar MyVar $(tablename)
Queste istruzioni restituiscono la riga e il messaggio "Variabile di scripting 'tablename' non definita".
>6 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = '$(tablename)';
>7 GO
>1 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(tablename)';
>2 GO
La riga viene restituita dalle istruzioni seguenti.
>1 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = '$(MyVar)';
>2 GO
>1 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(MyVar)';
>2 GO
Vedere anche