스크립팅 변수와 함께 sqlcmd 사용
업데이트: 2006년 7월 17일
스크립트에서 사용할 수 있는 변수를 스크립팅 변수라고 합니다. 스크립팅 변수를 사용하면 하나의 스크립트를 여러 시나리오에서 사용할 수 있습니다. 예를 들어 하나의 스크립트를 여러 서버에서 실행해야 하는 경우 각 서버에 맞게 스크립트를 수정하는 대신 서버 이름에 스크립팅 변수를 사용할 수 있습니다. 스크립팅 변수로 제공되는 서버 이름을 변경하여 같은 스크립트를 다른 서버에서 실행할 수 있습니다.
스크립팅 변수는 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 변수가 설정됩니다.
c:\> sqlcmd -l 60
-v 옵션을 사용하여 스크립트에 존재하는 스크립팅 변수를 설정할 수도 있습니다. 파일 이름이 testscript.sql
인 다음 스크립트에서 ColumnName
이 스크립팅 변수입니다.
USE AdventureWorks;
SELECT c.$(ColumnName)
FROM Person.Contact x
WHERE c.ContactID < 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* |
-U |
R |
"" |
SQLCMDPASSWORD* |
-P |
-- |
"" |
SQLCMDSERVER* |
-S |
R |
"DefaultLocalInstance" |
SQLCMDWORKSTATION |
-H |
R |
"ComputerName" |
SQLCMDDBNAME |
-d |
R |
"" |
SQLCMDLOGINTIMEOUT |
-l |
R/W |
"8"(초) |
SQLCMDSTATTIMEOUT |
-t |
R/W |
"0" = 무기한 대기 |
SQLCMDHEADERS |
-h |
R/W |
"0" |
SQLCMDCOLSEP |
-s |
R/W |
" " |
SQLCMDCOLWIDTH |
-w |
R/W |
"0" |
SQLCMDPACKETSIZE |
-a |
R |
"4096" |
SQLCMDERRORLEVEL |
-m |
R/W |
"0" |
SQLCMDMAXVARTYPEWIDTH |
-y |
R/W |
"256" |
SQLCMDMAXFIXEDTYPEWIDTH |
-Y |
R/W |
"0" = 제한 없음 |
SQLCMDEDITOR |
R/W |
"edit.com" |
|
SQLCMDINI |
R |
"" |
* SQLCMDUSER, SQLCMDPASSWORD 및 SQLCMDSERVER는 :Connect가 사용될 때 설정됩니다.
R은 값이 프로그램 초기화 시 한 번만 설정될 수 있음을 나타냅니다.
R/W는 값이 setvar 명령을 사용하여 다시 설정될 수 있으며 후속 명령이 새 값을 사용할 수 있음을 나타냅니다.
예
1. 스크립트에서 setvar 명령 사용
대다수의 sqlcmd 옵션은 스크립트에서 setvar 명령을 사용하여 제어됩니다. 다음 예에서는 SQLCMDLOGINTIMEOUT
변수가 60
초로 설정되고 다른 스크립팅 변수인 server
가 testserver
로 설정된 test.sql
스크립트를 만듭니다. test.sql
의 코드는 다음과 같습니다.
:setvar SQLCMDLOGINTIMEOUT 60
:setvar server "testserver"
:connect $(server) -l $(SQLCMDLOGINTIMEOUT)
USE AdventureWorks;
SELECT FirstName, LastName
FROM Person.Contact;
The script is then called by using sqlcmd:
sqlcmd -i c:\test.sql
2. 대화식으로 setvar 명령 사용
다음 예에서는 setvar
명령을 사용하여 대화식으로 스크립팅 변수를 설정하는 방법을 보여 줍니다.
sqlcmd
:setvar MYDATABASE AdventureWorks
USE $(MYDATABASE);
GO
결과 집합은 다음과 같습니다.
Changed database context to 'AdventureWorks'
1>
3. sqlcmd 내에서 명령 프롬프트 환경 변수 사용
다음 예에서는 4가지 환경 변수를 설정한 다음 sqlcmd
에서 호출합니다.
C:\>SET tablename=Person.Contact
C:\>SET col1=FirstName
C:\>SET col2=LastName
C:\>SET title=Ms.
C:\>sqlcmd -d AdventureWorks
1> SELECT TOP 5 $(col1) + ' ' + $(col2) AS Name
2> FROM $(tablename)
3> WHERE Title ='$(title)'
4> GO
4. sqlcmd 내에서 사용자 수준 환경 변수 사용
다음 예에서는 명령 프롬프트에서 사용자 수준 환경 변수인 %Temp%
를 설정하고 sqlcmd
입력 파일로 전달합니다. 사용자 수준 환경 변수를 얻으려면 제어판에서 시스템을 두 번 클릭하고 고급 탭을 클릭한 다음 환경 변수를 클릭합니다.
입력 파일 c:\testscript.txt
의 코드는 다음과 같습니다.
:OUT $(MyTempDirectory)
USE AdventureWorks;
SELECT FirstName
FROM AdventureWorks.Person.Contact
WHERE ContactID < 5;
명령 프롬프트에서 입력되는 코드는 다음과 같습니다.
C:\ >SET MyTempDirectory=%Temp%\output.txt
C:\ >sqlcmd -i C:\testscript.txt
출력 파일 C:\Documents and Settings\<user>\Local Settings\Temp\output.txt로 보내지는 결과는 다음과 같습니다.
Changed database context to 'AdventureWorks'.
FirstName
--------------------------------------------------
Gustavo
Catherine
Kim
Humberto
(4 rows affected)
5. 시작 스크립트 사용
sqlcmd 시작 스크립트는 sqlcmd가 시작될 때 실행되는 스크립트입니다. 다음 예에서는 SQLCMDINI
환경 변수를 설정합니다. 이는 init.sql
의 내용입니다.
SET NOCOUNT ON
GO
DECLARE @nt_user_name nvarchar(128)
SET @nt_user_name = (SELECT rtrim(convert(nvarchar(128), nt_user_name))
FROM sys.dm_exec_sessions WHERE session_id = @@SPID);
SELECT @nt_user_name + ' is connected to ' +
rtrim(CONVERT(nvarchar(20), SERVERPROPERTY('servername'))) + ' (' +
rtrim(CONVERT(nvarchar(20), SERVERPROPERTY('productversion'))) + ')';
:setvar SQLCMDMAXFIXEDTYPEWIDTH 100
SET NOCOUNT OFF
GO
:setvar SQLCMDMAXFIXEDTYPEWIDTH
다음은 sqlcmd
가 시작될 때 init.sql
파일을 호출합니다.
C:\> SET sqlcmdini=c:\init.sql
>1 Sqlcmd
다음은 출력입니다.
>1 < user > is connected to < server > (9.00.2047.00)
참고-X 옵션은 시작 스크립트 기능을 해제합니다.
6. 변수 확장 사용
다음 예에서는 sqlcmd 변수 형식의 데이터로 작업하는 방법을 보여 줍니다.
USE AdventureWorks;
CREATE TABLE AdventureWorks.dbo.VariableTest
(
Col1 nvarchar(50)
);
GO
$(tablename)
값을 포함하는 dbo.VariableTest
의 Col1
에 하나의 행을 삽입합니다.
INSERT INTO AdventureWorks.dbo.VariableTest(Col1)
VALUES('$(tablename)');
GO
sqlcmd
프롬프트에서 $(tablename)
와 같게 설정된 변수가 없을 경우 다음 문은 행을 반환합니다.
C:\> 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
변경 내역
릴리스 | 내역 |
---|---|
2006년 7월 17일 |
|