Megosztás a következőn keresztül:


Sqlcmd használata szkriptelési változókkal

Vonatkozik a következőkre:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalitikai Platform System (PDW)SQL adatbázis a Microsoft Fabric-ben

Az sqlcmd segédprogram lehetővé teszi Transact-SQL utasítások, rendszereljárások és szkriptfájlok megadását.

Note

Ha meg szeretné tudni, hogy az sqlcmd melyik változata és verziója van telepítve a rendszeren, tekintse meg az sqlcmd segédprogram telepített verziójának ellenőrzését. Az sqlcmd beszerzéséről további információt az sqlcmd segédprogram letöltése és telepítése című témakörben talál.

Szkriptelési változók az sqlcmdben

A szkriptekben használt változókat szkriptelési változóknak nevezzük. A szkriptelési változók lehetővé teszik, hogy egy szkript több forgatókönyvben is használható legyen. Ha például egy szkriptet több kiszolgálón szeretne futtatni, az egyes kiszolgálók szkriptjének módosítása helyett használhat egy szkriptelési változót a kiszolgálónévhez. A szkriptelési változóhoz megadott kiszolgálónév módosításával ugyanaz a szkript végrehajtható különböző kiszolgálókon.

A szkriptelési változók explicit módon, a setvar parancs használatával vagy implicit módon is meghatározhatók a sqlcmd -v beállítással.

Ez a cikk példákat is tartalmaz a parancssor környezeti változóinak a használatával történő meghatározására SET.

Szkriptelési változók beállítása a setvar paranccsal

A setvar parancs definiálja a szkriptelési változókat. A parancs használatával definiált változókat a setvar rendszer belsőleg tárolja. A szkriptelési változókat nem szabad összekeverni a parancssorban SEThasználatával definiált környezeti változókkal. Ha egy szkript olyan változóra hivatkozik, amely nem környezeti változó, vagy nem a használatával setvarvan definiálva, hibaüzenet jelenik meg, és a szkript végrehajtása leáll. További információért tekintse meg a -b opciót.

Változó elsőbbsége (alacsonytól magasig)

Ha egynél több változótípus neve azonos, a rendszer a legmagasabb prioritású változót használja.

  1. Rendszerszintű környezeti változók
  2. Felhasználói szintű környezeti változók
  3. A parancssori felület (SET X=Y) a parancssorba van állítva, mielőtt az sqlcmd indítása megtörténik.
  4. sqlcmd -v X=Y
  5. :Setvar X Y

Note

A Windows 11 környezeti változóinak megtekintéséhez nyissa meg a Beállítások menüpontot, majd lépjen a Rendszer>Névjegy menüre, és válassza a Speciális rendszerbeállítások hivatkozást. A Rendszer tulajdonságai ablakban válassza a Környezeti változók lehetőséget. Linuxon írja be printenv a parancssorba, macOS-ben pedig írja be a következőt env: .

Szkriptelési változók implicit beállítása

Ha sqlcmd egy kapcsolódó sqlcmd változóval rendelkező beállítással indítja el, a sqlcmd változó implicit módon a beállítással megadott értékre lesz beállítva. Az alábbi példában a sqlcmd a -l beállítással kezdődik. Ez implicit módon beállítja a SQLLOGINTIMEOUT változót.

sqlcmd -l 60

A -v beállítással is beállíthat egy parancsfájlban létező szkriptelési változót. A következő szkriptben (a fájlnév testscript.sql) ColumnName egy szkriptelési változó.

USE AdventureWorks2022;

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

Ezután a -v beállítással megadhatja a visszaadni kívánt oszlop nevét:

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

Ha egy másik oszlopot szeretne visszaadni ugyanazzal a szkripttel, módosítsa a ColumnName szkriptelési változó értékét.

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

A változónevek és -értékek szkriptelési irányelvei

A szkriptelési változók elnevezésekor vegye figyelembe az alábbi irányelveket:

  • A változónevek nem tartalmazhatnak szóköz karaktereket vagy idézőjeleket.

  • A változónevek nem lehetnek azonosak a változókifejezésekkel, például $(var).

  • A szkriptelési változók nem érzékenyek a nagy- és kisbetűkre.

    Note

    Ha nincs hozzárendelve érték egy sqlcmd környezeti változóhoz, a változó el lesz távolítva. A :setvar VarName érték nélküli használata törli a változót.

A szkriptelési változók értékeinek megadásakor vegye figyelembe az alábbi irányelveket:

  • A használatával setvar definiált változóértékeket vagy a -v beállítást idézőjelek közé kell foglalni, ha a sztring értéke szóközöket tartalmaz.
  • Ha az idézőjelek a változó értékének részei, azokat meg kell kódolni. Például: :setvar MyVar "spac""e".

Irányelvek a cmd.exe SET változóértékekhez és -nevekhez

A SET használatával definiált változók a cmd.exe környezet részét képezik, és sqlcmdhivatkozhatnak rá. Vegye figyelembe a következő irányelveket:

  • A változónevek nem tartalmazhatnak szóköz karaktereket vagy idézőjeleket.
  • A változó értékek szóközöket vagy idézőjeleket tartalmazhatnak.

sqlcmd szkriptelési változók

Variable Kapcsolódó opció R/W Default
SQLCMDUSER 1 -U R 2 ""
SQLCMDPASSWORD 1 -P -- ""
SQLCMDSERVER 1 -S R 2 "DefaultLocalInstance"
SQLCMDWORKSTATION -H R 2 "ComputerName"
SQLCMDDBNAME -d R 2 ""
SQLCMDLOGINTIMEOUT -l R/W 3 8 (másodperc)
SQLCMDSTATTIMEOUT -t R/W 3 "0" = várakozás határozatlan ideig
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" = korlátlan
SQLCMDEDITOR R/W 3 "edit.com"
SQLCMDINI R 2 ""

1 SQLCMDUSER, SQLCMDPASSWORD és SQLCMDSERVER be vannak állítva, amikor :Connect használatban van.

2 R azt jelzi, hogy az érték csak egyszer állítható be a program inicializálása során.

A 3 R/W azt jelzi, hogy az érték alaphelyzetbe állítható a parancs használatával, és az setvar azt követő parancsok az új értéket használják.

Examples

A cikkben szereplő kódminták a AdventureWorks2025 vagy AdventureWorksDW2025 mintaadatbázist használják, amelyet a Microsoft SQL Server-minták és közösségi projektek kezdőlapjáról tölthet le.

A. A setvar parancs használata szkriptben

Számos sqlcmd lehetőség vezérelhető egy szkriptben a setvar paranccsal. Az alábbi példában a szkript test.sql jön létre, amelyben a SQLCMDLOGINTIMEOUT változó 60 másodpercre van állítva, és egy másik szkriptelési változó, servertestserver. Az alábbi kód a test.sql-ban található.

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

USE AdventureWorks2022;

SELECT FirstName, LastName
FROM Person.Person;

A szkript meghívása ezután az sqlcmd használatával történik:

sqlcmd -i c:\test.sql

B. A setvar parancs interaktív használata

Az alábbi példa bemutatja, hogyan állíthat be interaktívan szkriptelési változót a setvar paranccsal.

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

Itt van az eredmény.

Changed database context to 'AdventureWorks2022'
1>

C. Parancssori környezeti változók használata az sqlcmdben

Az alábbi példában négy környezeti változó are van beállítva, majd meg van hívva a sqlcmdáltal.

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. Felhasználói szintű környezeti változók használata az SQLCMD-ben

Az alábbi példában a %Temp% felhasználói szintű környezeti változó a parancssorban van beállítva, és a sqlcmd bemeneti fájlnak továbbítja. A felhasználói szintű környezeti változó beszerzéséhez a Vezérlőpult-ban kattintson duplán a Rendszer. Válassza a Tovább lapot, majd válassza Környezeti változóklehetőséget.

A következő kód található a bemeneti fájlban C:\testscript.txt:

:OUT $(MyTempDirectory)
USE AdventureWorks2022;

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

A következő kódot adja meg a parancssorban:

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

A rendszer a következő eredményt küldi el a kimeneti fájlnak C:\Documents and Settings\<user>\Local Settings\Temp\output.txt.

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

(4 rows affected)

E. Indítási szkript használata

Egy sqlcmd indítási szkript végrehajtása sqlcmd indításakor. Az alábbi példa a SQLCMDINIkörnyezeti változót állítja be. Ez a init.sql. tartalma.

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

Ez meghívja a init.sql fájlt sqlcmd indításakor.

SET sqlcmdini=c:\init.sql
sqlcmd

Ez a kimenet.

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

Note

A -X beállítás letiltja az indítási szkript funkciót.

F. Változó kiterjesztése

Az alábbi példa az adatok sqlcmd változó formájában történő működését mutatja be.

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

Szúrjon be egy sort a Col1dbo.VariableTest-ba, amely tartalmazza a $(tablename)értéket.

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

A sqlcmd parancssorban, ha nincs beállítva változó, amely egyenlő $(tablename)értékével, az alábbi utasítások visszaadják a sort, és visszaadják a "'tablename' szkriptváltozó nincs definiálva" üzenetet is. Alapértelmezés szerint a sqlcmd kapcsoló nincs beállítva -b értékre. Ha -b van beállítva, sqlcmd a "nem definiált változó" hiba után leáll.

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

Itt van az eredmény.

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

Figyelembe véve, hogy a MyVar változó értéke $(tablename)-re van állítva.

6> :setvar MyVar $(tablename)

Ezek az utasítások visszaadják a sort, és a "tablename" szkriptelési változó nem definiált üzenetét is visszaadják.

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

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

Ezek az utasítások visszaadják a sort.

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