Verwenden von sqlcmd mit Skriptvariablen

Variablen, die in Skripts verwendet werden, werden als Skriptvariablen bezeichnet. Durch Skriptvariablen wird ein Skript aktiviert, das in verschiedenen Szenarien verwendet wird. Wenn Sie beispielsweise ein einzelnes Skript auf mehreren Servern ausführen möchten, anstatt das Skript für jeden Server zu ändern, können Sie eine Skriptvariable für den Servernamen verwenden. Durch das Ändern des Servernamens für die Skriptvariable kann das gleiche Skript auf verschiedenen Servern ausgeführt werden.

Skriptvariablen können explizit mithilfe des setvar-Befehls oder implizit mithilfe der Option sqlcmd-v definiert werden.

Dieses Thema enthält auch Beispiele zum Definieren von Umgebungsvariablen an der Eingabeaufforderung von Cmd.exe mithilfe von SET.

Festlegen von Skriptvariablen mithilfe des setvar-Befehls

Der setvar-Befehl wird zum Definieren von Skriptvariablen verwendet. Mithilfe des setvar-Befehls definierte Variablen werden intern gespeichert. Skriptvariablen dürfen nicht mit Umgebungsvariablen verwechselt werden, die mithilfe von SET an der Eingabeaufforderung definiert werden. Wenn ein Skript eine Variable referenziert, die keine Umgebungsvariable darstellt oder nicht mithilfe von setvar definiert wurde, wird eine Fehlermeldung zurückgegeben und die Ausführung des Skripts unterbrochen. Weitere Informationen finden Sie unter der Option -b unter sqlcmd (Dienstprogramm).

Variablenrangfolge (von niedrig bis hoch)

Wenn mehrere Variablentypen denselben Namen aufweisen, wird die Variable mit der höchsten Rangfolge verwendet.

  1. Umgebungsvariablen auf Systemebene

  2. Umgebungsvariablen auf Benutzerebene

  3. Die Befehlsshell (SET X=Y) wird an der Eingabeaufforderung festgelegt, bevor sqlcmd gestartet wird

  4. sqlcmd-v X=Y

  5. :Setvar X Y

HinweisHinweis

Zum Anzeigen der Umgebungsvariablen öffnen Sie unter Systemsteuerung die Option System, und klicken Sie auf die Registerkarte Erweitert.

Implizites Festlegen von Skriptvariablen

Wenn Sie sqlcmd mit einer Option starten, die eine verknüpfte sqlcmd-Variable aufweist, wird die sqlcmd-Variable implizit auf den Wert festgelegt, der mithilfe der Option angegeben wurde. Im folgenden Beispiel beginnt sqlcmd mit der Option -l . Dadurch wird implizit die SQLLOGINTIMEOUT-Variable festgelegt.

c:\> sqlcmd -l 60

Sie können auch die Option -v verwenden, um eine Skriptvariable festzulegen, die in einem Skript vorhanden ist. Im folgenden Skript (der Dateiname lautet testscript.sql) wird ColumnName als Skriptvariable verwendet.

USE AdventureWorks;

SELECT x.$(ColumnName)

FROM Person.Contact x

WHERE c.ContactID < 5;

Sie können daraufhin den Namen der Spalte angeben, die mithilfe der Option -v zurückgegeben werden soll:

sqlcmd -v ColumnName ="FirstName" -i c:\testscript.sql

Ändern Sie den Wert der ColumnName-Skriptvariablen, um eine andere Spalte mithilfe desselben Skripts zurückzugeben.

sqlcmd -v ColumnName ="LastName" -i c:\testscript.sql

Richtlinien für Namen und Werte von Skriptvariablen

Die folgenden Richtlinien sollten bei der Benennung von Skriptvariablen berücksichtigt werden:

  • Variablennamen dürfen keine Leerzeichen oder Anführungszeichen enthalten.

  • Variablennamen dürfen nicht die gleiche Form wie Variablenausdrücke (beispielsweise $(var)) aufweisen.

  • Bei Skriptvariablen wird nicht zwischen Groß- und Kleinschreibung unterschieden.

    HinweisHinweis

    Wenn einer sqlcmd-Umgebungsvariablen kein Wert zugewiesen wird, wird die Variable entfernt. Wird :setvar VarName ohne Wert verwendet, wird die Variable gelöscht.

Die folgenden Richtlinien sollten beim Angeben von Werten für Skriptvariablen berücksichtigt werden:

  • Variablenwerte, die mit setvar oder mit der Option -v definiert werden, müssen in Anführungszeichen eingeschlossen werden, sofern im Zeichenfolgenwert Leerzeichen enthalten sind.

  • Wenn Anführungszeichen Bestandteil des Variablenwerts sind, müssen sie mit Escapezeichen versehen werden. Beispiel: :setvar MyVar "spac""e".

Richtlinien für Cmd.exe SET-Variablennamen und -werte

Mithilfe von SET definierte Variablen sind Teil der Cmd.exe-Umgebung, und es kann mit sqlcmd auf sie verwiesen werden. Beachten Sie die folgenden Richtlinien:

  • Variablennamen dürfen keine Leerzeichen oder Anführungszeichen enthalten.

  • Variablenwerte dürfen Leerzeichen oder Anführungszeichen enthalten.

sqlcmd-Skriptvariablen

Mithilfe von sqlcmd definierte Variablen werden als Skriptvariablen bezeichnet. In der folgenden Tabelle sind die sqlcmd-Skriptvariablen aufgelistet.

Variable

Zugehörige Option

R/W

Standard

SQLCMDUSER*

-U

R

""

SQLCMDPASSWORD*

-P

--

""

SQLCMDSERVER*

-S

R

"DefaultLocalInstance"

SQLCMDWORKSTATION

-H

R

"ComputerName"

SQLCMDDBNAME

-d

R

""

SQLCMDLOGINTIMEOUT

-l

R/W

"8" (Sekunden)

SQLCMDSTATTIMEOUT

-t

R/W

"0" = unbegrenzt warten

SQLCMDHEADERS

-h

R/W

"0"

SQLCMDCOLSEP

-s

R/W

" "

SQLCMDCOLWIDTH

-w

R/W

"0"

SQLCMDPACKETSIZE

-a

R

"4096"

SQLCMDERRORLEVEL

-m

R/W

"0"

SQLCMDMAXVARTYPEWIDTH

-y

R/W

"256"

SQLCMDMAXFIXEDTYPEWIDTH

-Y

R/W

"0" = unbegrenzt

SQLCMDEDITOR

R/W

"edit.com"

SQLCMDINI

R

""

* SQLCMDUSER, SQLCMDPASSWORD und SQLCMDSERVER werden festgelegt, wenn :Connect verwendet wird.

Durch R wird angezeigt, dass der Wert nur ein Mal während der Programminitialisierung festgelegt werden kann.

Durch R/W wird angezeigt, dass der Wert mithilfe des setvar-Befehls zurückgesetzt werden kann. Für nachfolgende Befehle wird der neue Wert verwendet.

Beispiele

A. Verwenden des setvar-Befehls in einem Skript

Viele sqlcmd-Optionen können in einem Skript mithilfe des setvar-Befehls gesteuert werden. Im folgenden Beispiel wird das Skript test.sql erstellt, in dem die Variable SQLCMDLOGINTIMEOUT auf 60 Sekunden festgelegt ist. Eine weitere Skriptvariable (server) wird auf testserver festgelegt. Der folgende Code befindet sich 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. Interaktives Verwenden des setvar-Befehls

Im folgenden Beispiel wird veranschaulicht, wie eine Skriptvariable mithilfe des setvar-Befehls interaktiv festgelegt wird.

sqlcmd

:setvar MYDATABASE AdventureWorks

USE $(MYDATABASE);

GO

Dies ist das Resultset.

Changed database context to 'AdventureWorks'

1>

C. Verwenden von Eingabeaufforderung-Umgebungsvariablen innerhalb von sqlcmd

Im folgenden Beispiel werden vier Umgebungsvariablen festgelegt und dann von sqlcmd aufgerufen.

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. Verwenden von Umgebungsvariablen auf Benutzerebene in sqlcmd

Im folgenden Beispiel wird die %Temp%-Umgebungsvariable auf Benutzerebene an der Eingabeaufforderung festgelegt und an die sqlcmd-Eingabedatei übergeben. Zum Abrufen der Umgebungsvariable auf Benutzerebene doppelklicken Sie unter Systemsteuerung auf System. Klicken Sie auf die Registerkarte Erweitert, und klicken Sie dann auf Umgebungsvariablen.

In der Eingabedatei c:\testscript.txt ist der folgende Code enthalten:

:OUT $(MyTempDirectory)

USE AdventureWorks;

SELECT FirstName

FROM AdventureWorks.Person.Contact

WHERE ContactID < 5;

Der folgende Code wird an der Eingabeaufforderung eingegeben:

C:\ >SET MyTempDirectory=%Temp%\output.txt

C:\ >sqlcmd -i C:\testscript.txt

Das folgende Ergebnis wird an die Ausgabedatei C:\Dokumente und Einstellungen\<user>\Lokale Einstellungen\Temp\output.txt gesendet.

Changed database context to 'AdventureWorks'.

FirstName

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

Gustavo

Catherine

Kim

Humberto

(4 rows affected)

E. Verwenden eines Startskripts

Beim Starten von sqlcmd wird ein sqlcmd-Startskript ausgeführt. Im folgenden Beispiel wird die Umgebungsvariable SQLCMDINI festgelegt. Dies ist der Inhalt von 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

Damit wird die Datei init.sql beim Starten von sqlcmd aufgerufen.

C:\> SET sqlcmdini=c:\init.sql

>1 Sqlcmd

Dies ist die Ausgabe.

>1 < user > is connected to < server > (9.00.2047.00)

Hinweis Mit der Option -X wird das Startskriptfeature deaktiviert.

F. Variablenerweiterung

Im folgenden Beispiel wird die Verwendung von Daten in der Form einer sqlcmd-Variablen veranschaulicht.

USE AdventureWorks;

CREATE TABLE AdventureWorks.dbo.VariableTest

(

Col1 nvarchar(50)

);

GO

Fügen Sie eine Zeile in Col1 von dbo.VariableTest ein, in der der Wert $(tablename) enthalten ist.

INSERT INTO AdventureWorks.dbo.VariableTest(Col1)

VALUES('$(tablename)');

GO

Wenn keine Variable auf einen Wert gleich $(tablename) festgelegt ist, wird die Zeile an der sqlcmd-Eingabeaufforderung mit folgenden Anweisungen zurückgegeben.

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

Dies ist das Resultset.

>1 Col1

>2 ------------------

>3 $(tablename)

>4

>5 (1 rows affected)

Es wird angenommen, dass die Variable MyVar auf $(tablename) festgelegt ist.

>6 :setvar MyVar $(tablename)

Die Zeile wird mit diesen Anweisungen zurückgegeben. Außerdem wird die Meldung "Die 'tablename'-Skriptvariable ist nicht definiert." zurückgegeben.

>6 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = '$(tablename)';

>7 GO

>1 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(tablename)';

>2 GO

Die Zeile wird mit diesen Anweisungen zurückgegeben.

>1 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = '$(MyVar)';

>2 GO

>1 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(MyVar)';

>2 GO