스크립팅 변수와 함께 sqlcmd 사용

업데이트: 2006년 7월 17일

스크립트에서 사용할 수 있는 변수를 스크립팅 변수라고 합니다. 스크립팅 변수를 사용하면 하나의 스크립트를 여러 시나리오에서 사용할 수 있습니다. 예를 들어 하나의 스크립트를 여러 서버에서 실행해야 하는 경우 각 서버에 맞게 스크립트를 수정하는 대신 서버 이름에 스크립팅 변수를 사용할 수 있습니다. 스크립팅 변수로 제공되는 서버 이름을 변경하여 같은 스크립트를 다른 서버에서 실행할 수 있습니다.

스크립팅 변수는 setvar 명령을 사용하여 명시적으로 정의하거나 sqlcmd-v 옵션을 사용하여 암시적으로 정의할 수 있습니다.

이 항목에는 SET을 사용하여 Cmd.exe 명령 프롬프트에서 환경 변수를 정의하는 예도 포함되어 있습니다.

setvar 명령을 사용하여 스크립팅 변수 설정

setvar 명령을 사용하여 스크립팅 변수를 정의할 수 있습니다. setvar 명령을 사용하여 정의된 변수는 내부적으로 저장됩니다. 스크립팅 변수를 SET을 사용하여 명령 프롬프트에서 정의되는 환경 변수와 혼동하면 안 됩니다. 스크립트에서 환경 변수가 아니거나 setvar을 사용하여 정의되지 않은 변수를 참조하면 오류 메시지가 반환되고 스크립트 실행이 중지됩니다. 자세한 내용은 sqlcmd 유틸리티-b 옵션을 참조하십시오.

변수 우선 순위(낮은 순위에서 높은 순위)

같은 이름의 변수 유형이 둘 이상인 경우 우선 순위가 가장 높은 변수가 사용됩니다.

  1. 시스템 수준 환경 변수
  2. 사용자 수준 환경 변수
  3. sqlcmd를 시작하기 전에 명령 프롬프트에서 설정된 명령 셸(SET X=Y)
  4. sqlcmd-v X=Y
  5. :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초로 설정되고 다른 스크립팅 변수인 servertestserver로 설정된 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.VariableTestCol1에 하나의 행을 삽입합니다.

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일

새로운 내용
  • 예를 추가했습니다.

참고 항목

개념

sqlcmd 유틸리티 사용

관련 자료

sqlcmd 유틸리티
명령 프롬프트 유틸리티

도움말 및 정보

SQL Server 2005 지원 받기