Udostępnij za pośrednictwem


sqlcmd — używanie ze zmiennymi skryptowymi

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Database w Microsoft Fabric

Zmienne używane w skryptach są nazywane zmiennymi skryptowymi. Zmienne skryptowe umożliwiają korzystanie z jednego skryptu w wielu scenariuszach. Jeśli na przykład chcesz uruchomić jeden skrypt na wielu serwerach, zamiast modyfikować skrypt dla każdego serwera, możesz użyć zmiennej skryptowej dla nazwy serwera. Zmieniając nazwę serwera dostarczoną do zmiennej skryptowej, ten sam skrypt można wykonać na różnych serwerach.

Zmienne skryptowe można jawnie zdefiniować przy użyciu polecenia setvar lub niejawnie przy użyciu opcji sqlcmd -v.

Ten artykuł zawiera również przykłady definiowania zmiennych środowiskowych w wierszu polecenia Cmd.exe przy użyciu SET.

Ustawianie zmiennych skryptowych za pomocą polecenia setvar

Polecenie setvar służy do definiowania zmiennych skryptowych. Zmienne zdefiniowane za pomocą polecenia setvar są przechowywane wewnętrznie. Zmienne skryptowe nie powinny być mylone ze zmiennymi środowiskowymi zdefiniowanymi w wierszu polecenia przy użyciu SET. Jeśli skrypt odwołuje się do zmiennej, która nie jest zmienną środowiskową lub nie jest zdefiniowana przy użyciu setvar, zostanie zwrócony komunikat o błędzie i wykonanie skryptu zostanie zatrzymane. Aby uzyskać więcej informacji, zobacz opcję -b w sqlcmd.

Precedencja zmiennych (od najniższego do najwyższego)

Jeśli więcej niż jeden typ zmiennej ma taką samą nazwę, zostanie użyta zmienna o najwyższym pierwszeństwie.

  1. Zmienne środowiskowe na poziomie systemu
  2. Zmienne środowiskowe na poziomie użytkownika
  3. Powłoka poleceń (SET X=Y) ustawiona w wierszu polecenia przed rozpoczęciem sqlcmd
  4. sqlcmd -v X=Y
  5. :Setvar X Y

Notatka

Aby wyświetlić zmienne środowiskowe, w Panelu sterowaniaotwórz System, a następnie wybierz kartę Zaawansowane.

Niejawne ustawianie zmiennych skryptowych

Po uruchomieniu sqlcmd z opcją, która ma powiązaną zmienną sqlcmd, zmienna sqlcmd jest ustawiana niejawnie na wartość określoną przy użyciu opcji. W poniższym przykładzie sqlcmd jest uruchamiane z opcją -l. To niejawnie ustawia zmienną SQLLOGINTIMEOUT.

sqlcmd -l 60

Możesz również użyć opcji -v, aby ustawić zmienną skryptową, która istnieje w skrycie. W poniższym skryfcie (nazwa pliku to testscript.sql), ColumnName jest zmienną skryptową.

USE AdventureWorks2022;

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

Następnie możesz określić nazwę kolumny, która ma zostać zwrócona przy użyciu opcji -v:

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

Aby zwrócić inną kolumnę przy użyciu tego samego skryptu, zmień wartość zmiennej skryptowej ColumnName.

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

Wskazówki dotyczące tworzenia skryptów dla nazw i wartości zmiennych

Podczas nadawania nazw zmiennych skryptowych należy wziąć pod uwagę następujące wskazówki:

  • Nazwy zmiennych nie mogą zawierać znaków odstępu ani cudzysłowu.

  • Nazwy zmiennych nie mogą mieć takiej samej formy jak wyrażenie zmiennej, takie jak $(var).

  • Zmienne skryptowe są niewrażliwe na wielkość liter

    Notatka

    Jeśli żadna wartość nie zostanie przypisana do zmiennej środowiskowej sqlcmd, zmienna zostanie usunięta. Użycie :setvar VarName bez wartości czyści zmienną.

Podczas określania wartości zmiennych skryptowych należy wziąć pod uwagę następujące wskazówki:

  • Wartości zmiennych zdefiniowane przy użyciu setvar lub opcji -v muszą być ujęte w cudzysłów, jeśli wartość ciągu zawiera spacje.
  • Jeśli znaki cudzysłowu są częścią wartości zmiennej, muszą zostać uniknięte. Na przykład: :setvar MyVar "spac""e".

Wskazówki dotyczące ustalania wartości zmiennych i nazw w cmd.exe

Zmienne zdefiniowane przy użyciu SET są częścią środowiska cmd.exe i mogą być przywołyne przez sqlcmd. Weź pod uwagę następujące wskazówki:

  • Nazwy zmiennych nie mogą zawierać znaków odstępu ani cudzysłowu.
  • Wartości zmiennych mogą zawierać spacje lub znaki cudzysłowu.

zmienne skryptów sqlcmd

Zmienne zdefiniowane przez sqlcmd są nazywane zmiennymi skryptowymi. W poniższej tabeli wymieniono zmienne skryptów sqlcmd.

Zmienna Opcja powiązana R/W Domyślny
SQLCMDUSER 1 -U R 2 ""
SQLCMDPASSWORD 1 -P -- ""
SQLCMDSERVER 1 -S R 2 "DefaultLocalInstance"
SQLCMDWORKSTATION -H R 2 NazwaKomputera
SQLCMDDBNAME -d R 2 ""
SQLCMDLOGINTIMEOUT -l R/W 3 "8" (sekundy)
SQLCMDSTATTIMEOUT -t R/W 3 "0" = oczekiwanie na czas nieokreślony
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" = nieograniczona
SQLCMDEDITOR R/W 3 edit.com
SQLCMDINI R 2 ""

1 SQLCMDUSER, SQLCMDPASSWORD i SQLCMDSERVER są ustawiane podczas :Connect.

2 R wskazuje, że wartość można ustawić tylko raz podczas inicjowania programu.

3 R/W wskazuje, że wartość można zresetować przy użyciu setvar polecenia, a kolejne polecenia używają nowej wartości.

Przykłady

A. Używanie polecenia setvar w skrycie

Wiele opcji sqlcmd można kontrolować w skry skryptie przy użyciu polecenia setvar. W poniższym przykładzie skrypt test.sql jest tworzony, w którym zmienna SQLCMDLOGINTIMEOUT jest ustawiona na 60 sekund, a inna zmienna skryptowa serverjest ustawiona na testserver. Poniższy kod znajduje się w test.sql.

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

USE AdventureWorks2022;

SELECT FirstName, LastName
FROM Person.Person;

Skrypt jest następnie wywoływany przy użyciu polecenia sqlcmd:

sqlcmd -i c:\test.sql

B. Interakcyjne używanie polecenia setvar

W poniższym przykładzie pokazano, jak interaktywnie ustawić zmienną skryptową przy użyciu polecenia setvar.

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

Oto zestaw wyników.

Changed database context to 'AdventureWorks2022'
1>

C. Używanie zmiennych środowiskowych wiersza polecenia w narzędziu sqlcmd

W poniższym przykładzie cztery zmienne środowiskowe are są ustawione, a następnie wywoływane są 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. Używanie zmiennych środowiskowych na poziomie użytkownika w narzędziu sqlcmd

W poniższym przykładzie zmienna środowiskowa na poziomie użytkownika %Temp% jest ustawiana w wierszu polecenia i przekazywana do pliku wejściowego sqlcmd. Aby uzyskać zmienną środowiskową na poziomie użytkownika, w Panelu sterowaniakliknij dwukrotnie System. Wybierz kartę Zaawansowane, a następnie wybierz Zmienne Środowiskowe.

Poniższy kod znajduje się w pliku wejściowym C:\testscript.txt:

:OUT $(MyTempDirectory)
USE AdventureWorks2022;

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

Ten następujący kod jest wprowadzany w wierszu polecenia:

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

Następujący wynik jest wysyłany do pliku wyjściowego C:\Documents and Settings\<user>\Local Settings\Temp\output.txt.

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

(4 rows affected)

E. Korzystanie ze skryptu uruchamiania

Skrypt uruchamiania sqlcmd jest wykonywany po uruchomieniu sqlcmd. Poniższy przykład ustawia zmienną środowiskową SQLCMDINI. Jest to zawartość 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

Spowoduje to wywołanie pliku init.sql po uruchomieniu sqlcmd.

SET sqlcmdini=c:\init.sql
sqlcmd

Są to dane wyjściowe.

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

Notatka

Opcja -X wyłącza funkcję skryptu uruchamiania.

F. Rozszerzanie zmiennych

Poniższy przykład przedstawia pracę z danymi w postaci zmiennej sqlcmd.

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

Wstaw jeden wiersz do Col1 z dbo.VariableTest, który zawiera wartość $(tablename).

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

Po wyświetleniu monitu sqlcmd, gdy żadna zmienna nie jest ustawiona na wartość $(tablename), następujące instrukcje zwracają wiersz, a także zwracają komunikat "'tablename' scripting variable not defined". Domyślnie flaga sqlcmd-b nie jest ustawiona. Jeśli -b jest ustawiona, sqlcmd zakończy się po błędzie "zmienna niezdefiniowana".

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

Oto zestaw wyników.

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

Biorąc pod uwagę, że zmienna MyVar jest ustawiona na $(tablename).

6> :setvar MyVar $(tablename)

Te polecenia zwracają wiersz, a także zwracają komunikat "'tablename' zmienna skryptowa nie jest zdefiniowana".

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

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

Te oświadczenia zwracają wiersz.

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

Następne kroki