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


sqlcmd – Szkriptelési változók használata

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Database a Microsoft Fabric

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 definiálhatók a setvar paranccsal, vagy implicit módon a sqlcmd -v beállítással.

Ez a cikk olyan példákat is tartalmaz, amelyek környezeti változókat határoznak meg a Cmd.exe parancssorban SEThasználatával.

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

A szkriptelési változók definiálásához a setvar parancs használható. A setvar paranccsal definiált változók belsőleg vannak tárolva. 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 nincs definiálva setvarhasználatával, 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

Jegyzet

A környezeti változók megtekintéséhez nyissa meg Vezérlőpult, nyissa meg Rendszer, majd válassza a Speciális lapot.

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.

    Jegyzet

    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 setvar vagy a -v beállítással definiált változóértékeket 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

Az sqlcmd által definiált változók szkriptelési változók. Az alábbi táblázat sqlcmd szkriptelési változókat sorolja fel.

Változó Kapcsolódó opció R/W Alapértelmezett
SQLCMDUSER 1 -U R 2 ""
SQLCMDPASSWORD 1 -P -- ""
SQLCMDSERVER 1 -S R 2 AlapértelmezettHelyiPéldány (DefaultLocalInstance)
SQLCMDWORKSTATION -H R 2 SzámítógépNév
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.

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

Példák

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)

Jegyzet

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

F. Változóbővítés

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

Következő lépések