Dela via


sqlcmd – Använd med skriptvariabler

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics 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.

  1. Miljövariabler på systemnivå
  2. Miljövariabler på användarnivå
  3. Kommandoskalet (SET X=Y) anges vid kommandoraden innan sqlcmd startar.
  4. sqlcmd -v X=Y
  5. :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

Nästa steg