sqlcmd - 스크립팅 변수와 함께 사용
적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW)
스크립트에서 사용할 수 있는 변수를 스크립팅 변수라고 합니다. 스크립팅 변수를 사용하면 여러 시나리오에서 하나의 스크립트를 사용할 수 있습니다. 예를 들어 하나의 스크립트를 여러 서버에서 실행해야 하는 경우 각 서버에 맞게 스크립트를 수정하는 대신 서버 이름에 스크립팅 변수를 사용할 수 있습니다. 스크립팅 변수에 제공된 서버 이름을 변경하여 다른 서버에서 동일한 스크립트를 실행할 수 있습니다.
setvar 명령을 사용하거나 sqlcmd -v
옵션을 사용하여 암시적으로 스크립팅 변수를 정의할 수 있습니다.
이 문서에는 SET
를 사용하여 Cmd.exe 명령 프롬프트에서 환경 변수를 정의하는 예제도 포함되어 있습니다.
setvar 명령을 사용하여 스크립팅 변수 설정
setvar 명령은 스크립팅 변수를 정의하는 데 사용됩니다. setvar 명령을 사용하여 정의된 변수는 내부적으로 저장됩니다. 스크립팅 변수는 SET
를 사용하여 명령 프롬프트에 정의된 환경 변수와 혼동해서는 안 됩니다. 스크립트가 환경 변수가 아니거나 setvar을 사용하여 정의되지 않은 변수를 참조하는 경우 오류 메시지가 반환되고 스크립트 실행이 중지됩니다. 자세한 내용은 sqlcmd의 -b
옵션을 참조하세요.
변수 우선 순위(낮음에서 높음)
같은 이름의 변수 유형이 둘 이상인 경우 우선 순위가 가장 높은 변수가 사용됩니다.
- 시스템 수준 환경 변수
- 사용자 수준 환경 변수
- sqlcmd를 시작하기 전에 명령 프롬프트에서 설정한 명령 셸(
SET X=Y
) sqlcmd -v X=Y
:Setvar X Y
참고 항목
환경 변수를 보려면 제어 패널에서 시스템을 연 다음 고급 탭을 선택합니다.
암시적으로 스크립팅 변수 설정하기
관련 sqlcmd 변수가 있는 옵션을 사용하여 sqlcmd 를 시작하면 sqlcmd 변수는 옵션을 사용하여 지정한 값으로 암시적으로 설정됩니다. 다음 예제 에서는 sqlcmd
이 -l
옵션으로 시작합니다. 이렇게 하면 SQLLOGINTIMEOUT
변수가 암시적으로 설정됩니다.
sqlcmd -l 60
-v
옵션을 사용하여 스크립트에 존재하는 스크립팅 변수를 설정할 수도 있습니다. 다음 스크립트에서(파일 이름 testscript.sql
) ColumnName
(은)는 스크립팅 변수입니다.
USE AdventureWorks2022;
SELECT x.$(ColumnName)
FROM Person.Person x
WHERE x.BusinessEntityID < 5;
다음과 같이 -v
옵션을 사용하여 반환하려는 열의 이름을 지정할 수 있습니다.
sqlcmd -v ColumnName ="FirstName" -i c:\testscript.sql
동일한 스크립트를 사용하여 다른 열을 반환하려면 ColumnName
스크립팅 변수의 값을 변경합니다.
sqlcmd -v ColumnName ="LastName" -i c:\testscript.sql
스크립팅 변수의 이름 및 값에 대한 지침
스크립팅 변수에 이름을 붙이는 경우 다음 지침을 고려합니다.
변수 이름에는 공백 문자나 따옴표가 포함되어서는 안 됩니다.
변수 이름은 $(var)와 같은 변수 식 형태가 될 수 없습니다.
스크립팅 변수는 대/소문자를 구분하지 않습니다
참고 항목
sqlcmd 환경 변수에 할당된 값이 없으면 변수가 제거됩니다. 값 없이
:setvar VarName
을(를) 사용하면 변수가 지워지게 됩니다.
스크립팅 변수의 값을 지정하는 경우 다음 지침을 고려합니다.
- 문자열 값에 공백이 포함된 경우 setvar 또는
-v
옵션을 사용하여 정의된 변수 값을 따옴표로 묶어야 합니다. - 따옴표가 변수 값의 일부인 경우 이스케이프해야 합니다. 예:
setvar MyVar "spac""e"
Cmd.exe SET 변수 값 및 이름에 대한 지침
SET
를 사용하여 정의한 변수는 Cmd.exe 환경의 일부이며 sqlcmd에서 참조될 수 있습니다. 다음 지침을 고려하세요.
- 변수 이름에는 공백 문자나 따옴표가 포함되어서는 안 됩니다.
- 변수 값에는 공백 또는 따옴표가 포함될 수 있습니다.
sqlcmd 스크립팅 변수
sqlcmd에서 정의한 변수를 스크립팅 변수라고 정의합니다. 다음 테이블 목록에서는 sqlcmd 스크립팅 변수를 나열합니다.
변수 | 관련 옵션 | R/W | 기본값 |
---|---|---|---|
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"(초) |
SQLCMDSTATTIMEOUT | -t | R/W 3 | "0" = 무기한 대기 |
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" = 제한 없음 |
SQLCMDEDITOR | R/W 3 | "edit.com" | |
SQLCMDINI | R 2 | :\ |
1 SQLCMDUSER, SQLCMDPASSWORD 및 SQLCMDSERVER는 :Connect
가 사용될 때 설정합니다.
2 R은 프로그램 초기화 중에 값을 한 번만 설정할 수 있음을 나타냅니다.
3 R/W는 setvar 명령을 사용하여 값을 다시 설정할 수 있음을 나타내고 후속 명령은 새 값을 사용합니다.
예제
A. 스크립트 구성 요소에서 변수 사용
많은 sqlcmd 옵션은 setvar 명령을 사용하여 스크립트에서 제어할 수 있습니다. 다음 예에서는 test.sql
변수가 SQLCMDLOGINTIMEOUT
초로 설정되고 다른 스크립팅 변수인 60
가 server
로 설정된 testserver
스크립트를 만듭니다. 다음 코드는 test.sql
에 대한 것입니다.
:setvar SQLCMDLOGINTIMEOUT 60
:setvar server "testserver"
:connect $(server) -l $(SQLCMDLOGINTIMEOUT)
USE AdventureWorks2022;
SELECT FirstName, LastName
FROM Person.Person;
그런 다음 sqlcmd를 사용하여 스크립트를 호출합니다.
sqlcmd -i c:\test.sql
B. 대화형으로 setvar 명령 사용
다음 예제에서는 setvar
명령을 사용하여 대화형으로 스크립팅 변수를 설정하는 방법을 보여줍니다.
sqlcmd
:setvar MYDATABASE AdventureWorks2022
USE $(MYDATABASE);
GO
결과 집합은 다음과 같습니다.
Changed database context to 'AdventureWorks2022'
1>
C. sqlcmd 내에서 명령 프롬프트 환경 변수 사용
다음 예에서는 환경 변수 4개가 are
설정된 다음 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. sqlcmd 내에서 사용자 수준 환경 변수 사용
다음 예제에서 사용자 수준 %Temp%
환경 변수는 명령 프롬프트에서 설정되고 sqlcmd
입력 파일에 전달됩니다. 사용자 수준 환경 변수를 얻으려면 제어판에서 시스템을 두 번 클릭하고 고급 탭을 선택한 다음 환경 변수를 선택합니다.
다음 코드는 C:\testscript.txt
입력 파일에 있습니다.
:OUT $(MyTempDirectory)
USE AdventureWorks2022;
SELECT FirstName
FROM AdventureWorks2022.Person.Person
WHERE BusinessEntityID < 5;
다음 코드는 명령 프롬프트에서 입력합니다.
SET MyTempDirectory=%Temp%\output.txt
sqlcmd -i C:\testscript.txt
다음 결과가 C:\Documents and Settings\<user>\Local Settings\Temp\output.txt
출력 파일로 전달됩니다.
Changed database context to 'AdventureWorks2022'.
FirstName
--------------------------------------------------
Gustavo
Catherine
Kim
Humberto
(4 rows affected)
E. 시작 스크립트 사용
sqlcmd 시작 스크립트는 sqlcmd가 시작될 때 실행됩니다. 다음 예제에서는 SQLCMDINI
환경 변수를 설정합니다. 다음은 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
다음은 init.sql
가 시작될 때 sqlcmd
파일을 호출합니다.
SET sqlcmdini=c:\init.sql
sqlcmd
다음은 출력입니다.
1> <user> is connected to <server> (9.00.2047.00)
참고 항목
-X
옵션은 시작 스크립트 기능을 사용하지 않도록 설정합니다.
F. 변수 확장
다음 예제에서는 sqlcmd 변수 형식의 데이터 작업을 보여 드립니다.
USE AdventureWorks2022;
GO
CREATE TABLE AdventureWorks2022.dbo.VariableTest (Col1 NVARCHAR(50));
GO
행 하나를 Col1
에 삽입하며 dbo.VariableTest
에는 $(tablename)
의 값이 포함됩니다.
INSERT INTO AdventureWorks2022.dbo.VariableTest (Col1)
VALUES ('$(tablename)');
GO
sqlcmd
프롬프트에서 $(tablename)
과 동일하게 설정된 변수가 없을 경우 다음 문은 행을 반환하고 “’tablename’ 스크립팅 변수가 정의되지 않았습니다”라는 메시지도 반환합니다. 기본값으로 sqlcmd 플래그 -b
는 설정되지 않습니다. -b
를 설정하면 "변수가 정의되지 않았습니다" 오류가 발생한 후 sqlcmd가 종료됩니다.
sqlcmd
1> SELECT Col1 FROM dbo.VariableTest WHERE Col1 = '$(tablename)';
2> GO
3> SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(tablename)';
4> GO
결과 집합은 다음과 같습니다.
1> Col1
2> ------------------
3> $(tablename)
4>
5> (1 rows affected)
MyVar
변수는 $(tablename)
에 설정되었습니다.
6> :setvar MyVar $(tablename)
이러한 문은 행을 반환하고 "'tablename' 스크립팅 변수가 정의되지 않았습니다."라는 메시지도 반환합니다.
6> SELECT Col1 FROM dbo.VariableTest WHERE Col1 = '$(tablename)';
7> GO
1> SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(tablename)';
2> GO
이러한 문은 행을 반환합니다.
1> SELECT Col1 FROM dbo.VariableTest WHERE Col1 = '$(MyVar)';
2> GO
1> SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(MyVar)';
2> GO