Condividi tramite


Usare 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 usando il comando setvar o in modo implicito usando l'opzione sqlcmd-v .

Questo argomento include anche esempi che definiscono le variabili di ambiente al prompt dei comandi 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 con il comando setvar vengono archiviate internamente. Le variabili di scripting non devono essere confuse con le variabili di ambiente definite al prompt dei comandi tramite SET. Se uno script fa riferimento a una variabile che non è una variabile di ambiente o non è definita tramite setvar, viene restituito un messaggio di errore e l'esecuzione dello script verrà arrestata. Per altre informazioni, vedere l'opzione -b in Utilità sqlcmd.

Precedenza delle variabili (in ordine crescente)

Se è stato assegnato lo stesso nome a più tipi di variabile, verrà utilizzata la variabile con la precedenza più alta.

  1. Variabili di ambiente a livello di sistema

  2. Variabili di ambiente a livello di utente

  3. Interfaccia a riga di comando (SET X=Y) configurato al prompt dei comandi prima di avviare sqlcmd

  4. sqlcmd-v X=Y

  5. :Setvar X Y

Annotazioni

Per visualizzare le variabili di ambiente, nel Pannello di controlloaprire Sistemaquindi fare clic sulla scheda Avanzate .

Impostazione implicita delle variabili di scripting

Quando si avvia sqlcmd con un'opzione cui è correlata una variabile sqlcmd , la variabile sqlcmd viene impostata in modo implicito sul valore specificato con l'opzione. Nell'esempio seguente sqlcmd viene avviato con l'opzione -l . In questo modo viene impostata in modo implicito la variabile SQLLOGINTIMEOUT.

c:\> sqlcmd -l 60

È anche possibile usare l'opzione -v per impostare una variabile di scripting esistente in uno script. Nello script seguente (il nome di file è testscript.sql) ColumnName è una variabile di scripting.

USE AdventureWorks2012;

SELECT x.$(ColumnName)

FROM Person.Person x

WHERE c.BusinessEntityID < 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 per la definizione di nomi di variabili e valori

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.

    Annotazioni

    Se non viene assegnato alcun valore a una variabile di ambiente sqlcmd , la variabile viene rimossa. Se si usa :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 definiti tramite setvar o l'opzione -v devono essere racchiusi tra virgolette se il valore stringa contiene spazi.

  • Se le virgolette fanno parte del valore della variabile, è necessario utilizzare i caratteri di escape. Ad esempio, :setvar MyVar "spac""e".

Linee guida per i nomi e i valori delle variabili SET Cmd.exe

Le variabili definite tramite SET fanno parte dell'ambiente Cmd.exe e possono essere referenziate da sqlcmd. Considerare 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 con sqlcmd sono note come variabili di scripting. Nella tabella seguente sono elencate le variabili di scripting di sqlcmd .

Variabile Opzione correlata L/S Predefinito
SQLCMDUSER* -U R ""
SQLCMDPASSWORD* -P -- ""
SQLCMDSERVER* S- R IstanzaLocalePredefinita
SQLCMDWORKSTATION -H R "ComputerName"
SQLCMDDBNAME -d R ""
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 R "4096"
SQLCMDERRORLEVEL -m L/S 0
SQLCMDMAXVARTYPEWIDTH -y L/S "256"
SQLCMDMAXFIXEDTYPEWIDTH -Y L/S "0" = numero illimitato
SQLCMDEDITOR L/S edit.com
SQLCMDINI R ""

* SQLCMDUSER, SQLCMDPASSWORD e SQLCMDSERVER vengono impostati quando viene usato :Connect .

La lettera L indica che il valore può essere impostato una sola volta durante l'inizializzazione del programma.

R/W indica che il valore può essere reimpostato usando il comando setvar e i comandi successivi useranno il nuovo valore.

Esempi

Un. Utilizzo del comando setvar in uno script

Molte opzioni di sqlcmd possono essere controllate in uno script usando 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 AdventureWorks2012;

SELECT FirstName, LastName

FROM Person.Person;

The script is then called by using sqlcmd:

sqlcmd -i c:\test.sql

B. Uso 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 AdventureWorks2012

USE $(MYDATABASE);

GO

Questo è il set di risultati.

Changed database context to 'AdventureWorks2012'

1>

C. Utilizzo delle variabili di ambiente del prompt dei comandi nel contesto di sqlcmd

Nell'esempio seguente vengono impostate quattro variabili are di ambiente e quindi chiamate da sqlcmd.

C:\>SET tablename=Person.Person

C:\>SET col1=FirstName

C:\>SET col2=LastName

C:\>SET title=Ms.

C:\>sqlcmd -d AdventureWorks2012

1> SELECT TOP 5 $(col1) + ' ' + $(col2) AS Name

2> FROM $(tablename)

3> WHERE Title ='$(title)'

4> GO

D. Uso delle variabili di ambiente a livello di utente all'interno di sqlcmd

Nell'esempio seguente la variabile di ambiente a livello di utente viene impostata %Temp% al prompt dei comandi e passata al sqlcmd file di input. Per ottenere la variabile di ambiente a livello di utente, nel Pannello di controllofare doppio clic su Sistema. Fare clic sulla scheda Advance (Avanzamento ) e quindi su Environment Variables (Variabili di ambiente).

Il codice seguente è presente nel file di input c:\testscript.txt:

:OUT $(MyTempDirectory)

USE AdventureWorks2012;

SELECT FirstName

FROM AdventureWorks2012.Person.Person

WHERE BusinessEntityID < 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\<user>\Local Settings\Temp\output.txt.

Changed database context to 'AdventureWorks2012'.

FirstName

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

Gustavo

Catherine

Kim

Humberto

(4 rows affected)

E. Uso di uno script di avvio

Uno script di avvio di sqlcmd viene eseguito quando sqlcmd viene avviato. 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

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)

Annotazioni

L'opzione -X disabilita la funzionalità script di avvio.

F. Espansione delle variabili

L'esempio seguente illustra l'uso dei dati sotto forma di variabile di sqlcmd .

USE AdventureWorks2012;

CREATE TABLE AdventureWorks2012.dbo.VariableTest

(

Col1 nvarchar(50)

);

GO

Inserire una riga nella colonna Col1 di dbo.VariableTest contenente il valore $(tablename).

INSERT INTO AdventureWorks2012.dbo.VariableTest(Col1)

VALUES('$(tablename)');

GO

Al prompt sqlcmd, quando nessuna variabile è impostata su $(tablename), le istruzioni riportate di seguito restituiscono la riga.

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

Questo è il 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

Queste istruzioni restituiscono la riga.

>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

Utilizzo dell'utilità sqlcmd
Utilità sqlcmd
Guida di riferimento per le utilità del prompt dei comandi (motore di database)