sqlcmd – Använd med skriptvariabler
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL-databas i Microsoft Fabric
Variabler som används i skript kallas skriptvariabler. Med skriptvariabler kan ett skript användas i flera scenarier. Om du till exempel vill köra ett skript mot flera servrar kan du i stället för att ändra skriptet för varje server använda en skriptvariabel för servernamnet. Genom att ändra servernamnet som anges i skriptvariabeln kan samma skript köras på olika servrar.
Skriptvariabler kan definieras explicit med hjälp av kommandot setvar eller implicit med hjälp av alternativet sqlcmd -v
.
Den här artikeln innehåller även exempel som definierar miljövariabler i kommandotolken Cmd.exe med hjälp av SET
.
Ange skriptvariabler med setvar-kommandot
Kommandot setvar används för att definiera skriptvariabler. Variabler som definieras med hjälp av kommandot setvar lagras internt. Skriptvariabler bör inte förväxlas med miljövariabler som definieras i kommandotolken med hjälp av SET
. Om ett skript refererar till en variabel som inte är en miljövariabel eller inte definieras med hjälp av setvarreturneras ett felmeddelande och körningen av skriptet stoppas. Mer information finns i alternativet -b
i sqlcmd.
Variabelprioritet (låg till hög)
Om fler än en typ av variabel har samma namn används variabeln med högsta prioritet.
- Miljövariabler på systemnivå
- Miljövariabler på användarnivå
- Kommandoskalet (
SET X=Y
) anges vid kommandoraden innan sqlcmd startar. sqlcmd -v X=Y
:Setvar X Y
Not
Om du vill visa miljövariablerna öppnar du Systemi Kontrollpanelenoch väljer sedan fliken Avancerat.
Implicit inställning av skriptvariabler
När du startar sqlcmd med ett alternativ som har en relaterad sqlcmd variabel, ställs sqlcmd-variabeln implicit in till det värde som anges med hjälp av alternativet. I följande exempel startas sqlcmd
med alternativet -l
. Detta anger implicit variabeln SQLLOGINTIMEOUT
.
sqlcmd -l 60
Du kan också använda alternativet -v
för att ange en skriptvariabel som finns i ett skript. I följande skript (filnamnet är testscript.sql
) är ColumnName
en skriptvariabel.
USE AdventureWorks2022;
SELECT x.$(ColumnName)
FROM Person.Person x
WHERE x.BusinessEntityID < 5;
Du kan sedan ange namnet på den kolumn som du vill returnera med hjälp av alternativet -v
:
sqlcmd -v ColumnName ="FirstName" -i c:\testscript.sql
Om du vill returnera en annan kolumn med samma skript ändrar du värdet för ColumnName
skriptvariabeln.
sqlcmd -v ColumnName ="LastName" -i c:\testscript.sql
Riktlinjer för skriptvariabelnamn och -värden
Tänk på följande riktlinjer när du namnger skriptvariabler:
Variabelnamn får inte innehålla blankstegstecken eller citattecken.
Variabelnamn får inte ha samma formulär som ett variabeluttryck, till exempel $(var).
Skriptvariabler är skiftlägesokänsliga
Not
Om inget värde tilldelas till en sqlcmd miljövariabel tas variabeln bort. Om du använder
:setvar VarName
utan ett värde rensas variabeln.
Tänk på följande riktlinjer när du anger värden för skriptvariabler:
- Variabelvärden som definieras med hjälp av setvar eller alternativet
-v
måste omges av citattecken om strängvärdet innehåller blanksteg. - Om citattecken ingår i variabelvärdet måste de vara undantagna. Till exempel: :
setvar MyVar "spac""e"
.
Riktlinjer för cmd.exe SET-variabelvärden och -namn
Variabler som definieras med hjälp av SET
är en del av den cmd.exe miljön och kan refereras av sqlcmd. Tänk på följande riktlinjer:
- Variabelnamn får inte innehålla blankstegstecken eller citattecken.
- Variabelvärden kan innehålla blanksteg eller citattecken.
sqlcmd-skriptvariabler
Variabler som definieras av sqlcmd kallas skriptvariabler. I följande tabell visas sqlcmd- skriptvariabler.
Variabel | Relaterat alternativ | R/W | Standard |
---|---|---|---|
SQLCMDUSER 1 | -U | R 2 | "" |
SQLCMDPASSWORD 1 | -P | -- | "" |
SQLCMDSERVER 1 | -S | R 2 | Defaultlokalinstans |
SQLCMDWORKSTATION | -H | R 2 | Datornamn |
SQLCMDDBNAME | -d | R 2 | "" |
SQLCMDLOGINTIMEOUT | -L | R/W 3 | "8" (sekunder) |
SQLCMDSTATTIMEOUT | -t | R/W 3 | "0" = vänta på obestämd tid |
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" = obegränsat |
SQLCMDEDITOR | R/W 3 | edit.com | |
SQLCMDINI | R 2 | "" |
1 SQLCMDUSER, SQLCMDPASSWORD och SQLCMDSERVER anges när :Connect
används.
2 R anger att värdet bara kan anges en gång under programinitieringen.
3 R/W anger att värdet kan återställas med hjälp av kommandot setvar och efterföljande kommandon använder det nya värdet.
Exempel
A. Använda setvar-kommandot i ett skript
Många sqlcmd- alternativ kan styras i ett skript med hjälp av kommandot setvar. I följande exempel skapas skriptet test.sql
där variabeln SQLCMDLOGINTIMEOUT
anges till 60
sekunder och en annan skriptvariabel, server
, är inställd på testserver
. Följande kod finns i test.sql
.
:setvar SQLCMDLOGINTIMEOUT 60
:setvar server "testserver"
:connect $(server) -l $(SQLCMDLOGINTIMEOUT)
USE AdventureWorks2022;
SELECT FirstName, LastName
FROM Person.Person;
Skriptet anropas sedan med hjälp av sqlcmd:
sqlcmd -i c:\test.sql
B. Använda setvar-kommandot interaktivt
I följande exempel visas hur du ställer in en skriptvariabel interaktivt med hjälp av kommandot setvar
.
sqlcmd
:setvar MYDATABASE AdventureWorks2022
USE $(MYDATABASE);
GO
Här är resultatet.
Changed database context to 'AdventureWorks2022'
1>
C. Använd miljövariabler för kommandotolken inom sqlcmd
I följande exempel sätts fyra miljövariabler are
och anropas sedan från 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. Använda miljövariabler på användarnivå i sqlcmd
I följande exempel ställs användarnivåmiljövariabeln %Temp%
in vid kommandotolken och överförs till indatafilen sqlcmd
. Om du vill hämta miljövariabeln på användarnivå i Kontrollpanelendubbelklickar du på System. Välj fliken Avancera och välj sedan Miljövariabler.
Följande kod finns i indatafilen C:\testscript.txt
:
:OUT $(MyTempDirectory)
USE AdventureWorks2022;
SELECT FirstName
FROM AdventureWorks2022.Person.Person
WHERE BusinessEntityID < 5;
Följande kod anges i kommandotolken:
SET MyTempDirectory=%Temp%\output.txt
sqlcmd -i C:\testscript.txt
Följande resultat skickas till utdatafilen C:\Documents and Settings\<user>\Local Settings\Temp\output.txt
.
Changed database context to 'AdventureWorks2022'.
FirstName
--------------------------------------------------
Gustavo
Catherine
Kim
Humberto
(4 rows affected)
E. Använda ett startskript
Ett sqlcmd- startskript körs när sqlcmd- startas. I följande exempel anges miljövariabeln SQLCMDINI
. Det här är innehållet i 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
Detta anropar init.sql
-filen när sqlcmd
startas.
SET sqlcmdini=c:\init.sql
sqlcmd
Det här är resultatet.
1> <user> is connected to <server> (9.00.2047.00)
Anteckning
Alternativet -X
inaktiverar funktionen för startskript.
F. Variabelutvidgning
I följande exempel visas hur du arbetar med data i form av en sqlcmd variabel.
USE AdventureWorks2022;
GO
CREATE TABLE AdventureWorks2022.dbo.VariableTest (Col1 NVARCHAR(50));
GO
Infoga en rad i Col1
av dbo.VariableTest
som innehåller värdet $(tablename)
.
INSERT INTO AdventureWorks2022.dbo.VariableTest (Col1)
VALUES ('$(tablename)');
GO
Vid sqlcmd
-prompten, när ingen variabel anges som lika med $(tablename)
, returnerar följande instruktioner raden och visar även meddelandet "'tablename' skriptvariabel inte definierad." Som standard anges inte flaggan sqlcmd-b
. Om -b
anges avslutas sqlcmd- efter felet "variabeln inte definierad".
sqlcmd
1> SELECT Col1 FROM dbo.VariableTest WHERE Col1 = '$(tablename)';
2> GO
3> SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(tablename)';
4> GO
Här är resultatet.
1> Col1
2> ------------------
3> $(tablename)
4>
5> (1 rows affected)
Med tanke på att variabeln MyVar
är inställd på $(tablename)
.
6> :setvar MyVar $(tablename)
Dessa instruktioner returnerar raden och returnerar även meddelandet "'tablename' scripting variable not defined".
6> SELECT Col1 FROM dbo.VariableTest WHERE Col1 = '$(tablename)';
7> GO
1> SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(tablename)';
2> GO
Dessa satser returnerar raden.
1> SELECT Col1 FROM dbo.VariableTest WHERE Col1 = '$(MyVar)';
2> GO
1> SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(MyVar)';
2> GO