Sdílet prostřednictvím


sqlcmd – použití se skriptovacími proměnnými

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytická platforma (PDW)databáze SQL v Microsoft Fabric

Proměnné používané ve skriptech se nazývají skriptovací proměnné. Skriptovací proměnné umožňují použití jednoho skriptu ve více scénářích. Pokud například chcete spustit jeden skript na více serverech a nemusíte upravovat skript pro každý server, můžete pro název serveru použít proměnnou skriptování. Změnou názvu serveru zadaného do proměnné skriptování lze stejný skript spustit na různých serverech.

Skriptovací proměnné lze explicitně definovat pomocí příkazu setvar nebo implicitně pomocí možnosti sqlcmd -v.

Tento článek obsahuje také příklady definování proměnných prostředí na příkazovém řádku Cmd.exe pomocí SET.

Nastavení skriptování proměnných pomocí příkazu setvar

Příkaz setvar slouží k definování skriptovacích proměnných. Proměnné definované pomocí příkazu setvar se ukládají interně. Skriptovací proměnné by neměly být zaměňovány s proměnnými prostředí, které jsou definovány na příkazovém řádku pomocí SET. Pokud skript odkazuje na proměnnou, která není proměnnou prostředí nebo není definována pomocí setvar, vrátí se chybová zpráva a spuštění skriptu se zastaví. Pro více informací naleznete možnost -b v sqlcmd.

Priorita proměnných (nízká až vysoká)

Pokud má více než jeden typ proměnné stejný název, použije se proměnná s nejvyšší prioritou.

  1. Proměnné prostředí na úrovni systému
  2. Proměnné prostředí na úrovni uživatele
  3. Příkazové prostředí (SET X=Y) nastaveno na příkazovém řádku před spuštěním sqlcmd
  4. sqlcmd -v X=Y
  5. :Setvar X Y

Poznámka

Pokud chcete zobrazit proměnné prostředí, otevřete v Ovládacích panelechpoložku Systéma poté vyberte kartu Upřesnit.

Implicitní nastavení proměnných ve skriptování

Když spustíte sqlcmd s možností, která má související sqlcmd proměnnou, je sqlcmd proměnná implicitně nastavena na hodnotu určenou pomocí této možnosti. V následujícím příkladu se sqlcmd spustí s možností -l. Tím se implicitně nastaví proměnná SQLLOGINTIMEOUT.

sqlcmd -l 60

Pomocí možnosti -v můžete také nastavit skriptovací proměnnou, která existuje ve skriptu. V následujícím skriptu (název souboru je testscript.sql), ColumnName je skriptovací proměnná.

USE AdventureWorks2022;

SELECT x.$(ColumnName)
FROM Person.Person x
WHERE x.BusinessEntityID < 5;

Potom můžete zadat název sloupce, který chcete vrátit, pomocí možnosti -v:

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

Pokud chcete vrátit jiný sloupec pomocí stejného skriptu, změňte hodnotu proměnné ColumnName skriptování.

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

Pokyny pro skriptování názvů a hodnot proměnných

Při pojmenování proměnných skriptování zvažte následující pokyny:

  • Názvy proměnných nesmí obsahovat prázdné znaky ani uvozovky.

  • Názvy proměnných nesmí mít stejný tvar jako výraz proměnné, například $(var).

  • Skriptovací proměnné nerozlišují malá a velká písmena

    Poznámka

    Pokud není k proměnné prostředí sqlcmd přiřazena žádná hodnota, proměnná se odstraní. Použití :setvar VarName bez hodnoty vymaže proměnnou.

Při zadávání hodnot pro skriptovací proměnné zvažte následující pokyny:

  • Hodnoty proměnných definované pomocí setvar nebo možnost -v musí být uzavřeny uvozovkami, pokud hodnota řetězce obsahuje mezery.
  • Pokud jsou uvozovky součástí hodnoty proměnné, musí být uvozeny zpětným lomítkem. Příklad: :setvar MyVar "spac""e".

Pokyny pro: cmd.exe názvy a hodnoty proměnných SET

Proměnné, které jsou definovány pomocí SET, jsou součástí cmd.exe prostředí a lze na ně odkazovat sqlcmd. Zvažte následující pokyny:

  • Názvy proměnných nesmí obsahovat prázdné znaky ani uvozovky.
  • Hodnoty proměnných můžou obsahovat mezery nebo uvozovky.

Skriptovací proměnné Sqlcmd

Proměnné definované sqlcmd se označují jako skriptovací proměnné. Následující tabulka uvádí sqlcmd skriptovací proměnné.

Proměnná Související možnost R/W Výchozí
SQLCMDUSER 1 -U R 2 ""
SQLCMDPASSWORD 1 -P -- ""
SQLCMDSERVER 1 -S R 2 "DefaultLocalInstance"
SQLCMDWORKSTATION -H R 2 "Název_počítače"
SQLCMDDBNAME -d R 2 ""
SQLCMDLOGINTIMEOUT -l R/W 3 "8" (sekundy)
SQLCMDSTATTIMEOUT -t R/W 3 "0" = čekání na neomezenou dobu
SQLCMDHEADERS -h R/W 3 0
SQLCMDCOLSEP -s R/W 3 " "
SQLCMDCOLWIDTH -w R/W 3 0
SQLCMDPACKETSIZE -a R 2 "4096"
SQLCMDERRORLEVEL -m R/W 3 0
SQLCMDMAXVARTYPEWIDTH -y R/W 3 "256"
SQLCMDMAXFIXEDTYPEWIDTH -Y R/W 3 "0" = neomezený
SQLCMDEDITOR R/W 3 edit.com
SQLCMDINI R 2 ""

1 SQLCMDUSER, SQLCMDPASSWORD a SQLCMDSERVER jsou nastaveny při použití :Connect.

2 R označuje, že hodnotu lze nastavit pouze jednou během inicializace programu.

3 R/W označuje, že hodnotu je možné resetovat pomocí příkazu setvar a že následné příkazy používají novou hodnotu.

Příklady

A. Použití příkazu setvar ve skriptu

Mnoho možností sqlcmd lze řídit ve skriptu pomocí příkazu setvar. V následujícím příkladu se vytvoří skript test.sql, ve kterém je proměnná SQLCMDLOGINTIMEOUT nastavena na 60 sekund a další skriptovací proměnná, server, je nastavena na testserver. Následující kód je v test.sql.

:setvar SQLCMDLOGINTIMEOUT 60
:setvar server "testserver"
:connect $(server) -l $(SQLCMDLOGINTIMEOUT)

USE AdventureWorks2022;

SELECT FirstName, LastName
FROM Person.Person;

Skript se pak zavolá pomocí sqlcmd:

sqlcmd -i c:\test.sql

B. Interaktivní použití příkazu setvar

Následující příklad ukazuje, jak interaktivně nastavit skriptovací proměnnou pomocí příkazu setvar.

sqlcmd
:setvar MYDATABASE AdventureWorks2022
USE $(MYDATABASE);
GO

Tady je sada výsledků.

Changed database context to 'AdventureWorks2022'
1>

C. Použití proměnných prostředí příkazového řádku v sqlcmd

V následujícím příkladu are čtyři proměnné prostředí a potom volaly z sqlcmd.

SET tablename=Person.Person
SET col1=FirstName
SET col2=LastName
SET title=Ms.
sqlcmd -d AdventureWorks2022
1> SELECT TOP 5 $(col1) + ' ' + $(col2) AS Name
2> FROM $(tablename)
3> WHERE Title ='$(title)'
4> GO

D. Použití proměnných prostředí na úrovni uživatele v rámci sqlcmd

V následujícím příkladu je proměnná prostředí na úrovni uživatele %Temp% nastavena na příkazovém řádku a předána vstupnímu souboru sqlcmd. Chcete-li získat proměnnou prostředí na úrovni uživatele, v ovládacích panelech poklikejte na Systém. Vyberte kartu Advance a pak vyberte Proměnné prostředí.

Následující kód je ve vstupním souboru C:\testscript.txt:

:OUT $(MyTempDirectory)
USE AdventureWorks2022;

SELECT FirstName
FROM AdventureWorks2022.Person.Person
WHERE BusinessEntityID < 5;

Tento následující kód je zadán na příkazovém řádku:

SET MyTempDirectory=%Temp%\output.txt
sqlcmd -i C:\testscript.txt

Následující výsledek se odešle do výstupního souboru C:\Documents and Settings\<user>\Local Settings\Temp\output.txt.

Changed database context to 'AdventureWorks2022'.
FirstName
--------------------------------------------------
Gustavo
Catherine
Kim
Humberto

(4 rows affected)

E. Použití spouštěcího skriptu

Při spuštění sqlcmd se spustí spouštěcí skript sqlcmd. Následující příklad nastaví proměnnou prostředí SQLCMDINI. Toto je obsah 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

Tím se soubor init.sql zavolá při spuštění sqlcmd.

SET sqlcmdini=c:\init.sql
sqlcmd

Toto je výstup.

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

Poznámka

Možnost -X zakáže funkci spouštěcího skriptu.

F. Rozšíření proměnných

Následující příklad ukazuje práci s daty ve formě sqlcmd proměnné.

USE AdventureWorks2022;
GO
CREATE TABLE AdventureWorks2022.dbo.VariableTest (Col1 NVARCHAR(50));
GO

Vložte jeden řádek do Col1dbo.VariableTest, který obsahuje hodnotu $(tablename).

INSERT INTO AdventureWorks2022.dbo.VariableTest (Col1)
VALUES ('$(tablename)');
GO

Pokud na příkazovém řádku sqlcmd není nastavena žádná proměnná rovna $(tablename), následující příkazy vrátí řádek a také zobrazí zprávu "'tablename' skriptovací proměnná není definována." Ve výchozím nastavení není příznak sqlcmd-b nastaven. Pokud je nastavená -b, sqlcmd se ukončí po chybě "proměnná není definována".

sqlcmd
1> SELECT Col1 FROM dbo.VariableTest WHERE Col1 = '$(tablename)';
2> GO
3> SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(tablename)';
4> GO

Tady je výsledková sada.

1> Col1
2> ------------------
3> $(tablename)
4>
5> (1 rows affected)

Vzhledem k tomu, že proměnná MyVar je nastavená na $(tablename).

6> :setvar MyVar $(tablename)

Tyto příkazy vrátí řádek a také vrátí zprávu "tablename" skriptovací proměnná není definována.

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

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

Tyto příkazy vrátí řádek.

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

Další kroky