sqlcmd — używanie ze zmiennymi skryptowymi
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics 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.
- Zmienne środowiskowe na poziomie systemu
- Zmienne środowiskowe na poziomie użytkownika
- Powłoka poleceń (
SET X=Y
) ustawiona w wierszu polecenia przed rozpoczęciem sqlcmd sqlcmd -v X=Y
: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 server
jest 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
- Używanie narzędzia sqlcmd
- narzędzie sqlcmd
- dokumentacja narzędzia wiersza polecenia (aparat bazy danych)