sqlcmd - 스크립팅 변수와 함께 사용sqlcmd - Use with Scripting Variables

스크립트에서 사용할 수 있는 변수를 스크립팅 변수라고 합니다.Variables that are used in scripts are called scripting variables. 스크립팅 변수를 사용하면 하나의 스크립트를 여러 시나리오에서 사용할 수 있습니다.Scripting variables enable one script to be used in multiple scenarios. 예를 들어 하나의 스크립트를 여러 서버에서 실행해야 하는 경우 각 서버에 맞게 스크립트를 수정하는 대신 서버 이름에 스크립팅 변수를 사용할 수 있습니다.For example, if you want to run one script against multiple servers, instead of modifying the script for each server, you can use a scripting variable for the server name. 스크립팅 변수로 제공되는 서버 이름을 변경하여 같은 스크립트를 다른 서버에서 실행할 수 있습니다.By changing the server name supplied to the scripting variable, the same script can be executed on different servers.

스크립팅 변수는 setvar 명령을 사용하여 명시적으로 정의하거나 sqlcmd-v 옵션을 사용하여 암시적으로 정의할 수 있습니다.Scripting variables can be defined explicitly by using the setvar command, or implicitly by using the sqlcmd-v option.

이 항목에는 SET를 사용하여 Cmd.exe 명령 프롬프트에서 환경 변수를 정의하는 예도 포함되어 있습니다.This topic also includes examples defining environmental variables at the Cmd.exe command prompt by using SET.

setvar 명령을 사용하여 스크립팅 변수 설정Setting Scripting Variables by Using the setvar Command

setvar 명령은 스크립팅 변수를 정의하는 데 사용됩니다.The setvar command is used to define scripting variables. setvar 명령을 사용하여 정의한 변수는 내부적으로 저장됩니다.Variables that are defined by using the setvar command are stored internally. SET를 사용하여 명령 프롬프트에서 정의하는 환경 변수와 스크립팅 변수를 혼동하면 안 됩니다.Scripting variables should not be confused with environment variables that are defined at the command prompt by using SET. 스크립트에서 환경 변수가 아니거나 setvar을 사용하여 정의되지 않은 변수를 참조하면 오류 메시지가 반환되고 스크립트 실행이 중지됩니다.If a script references a variable that is not an environment variable or is not defined by using setvar, an error message is returned and the execution of the script will stop. 자세한 내용은 sqlcmd 유틸리티-b옵션을 참조하세요.For more information, see the -b option in sqlcmd Utility.

변수 우선 순위(낮은 순위에서 높은 순위)Variable Precedence (Low to High)

같은 이름의 변수 유형이 둘 이상인 경우 우선 순위가 가장 높은 변수가 사용됩니다.If more than one type of variable has the same name, the variable with the highest precedence is used.

  1. 시스템 수준 환경 변수System level environmental variables

  2. 사용자 수준 환경 변수User level environmental variables

  3. SET X=Y를 시작하기 전에 명령 프롬프트에서 설정된 명령 셸( SET X=Y)Command shell (SET X=Y) set at command prompt before starting sqlcmd

  4. sqlcmd-v X=Ysqlcmd-v X=Y

  5. :Setvar X Y:Setvar X Y

참고

환경 변수를 보려면 제어판에서 시스템을 연 다음 고급 탭을 클릭합니다.To view the environmental variables, in Control Panel, open System, and then click the Advanced tab.

암시적 스크립팅 변수 설정Implicitly Setting Scripting Variables

관련 sqlcmd 변수가 있는 옵션을 사용하여 sqlcmd 를 시작하면 sqlcmd 변수는 옵션을 사용하여 지정한 값으로 암시적으로 설정됩니다.When you start sqlcmd with an option that has a related sqlcmd variable, the sqlcmd variable is set implicitly to the value that is specified by using the option. 다음 예에서는 sqlcmd-l 옵션으로 시작합니다.In the following example, sqlcmd is started with the -l option. 이 경우 암시적으로 SQLLOGINTIMEOUT 변수가 설정됩니다.This implicitly sets the SQLLOGINTIMEOUT variable.

c:\> sqlcmd -l 60

-v 옵션을 사용하여 스크립트에 있는 스크립팅 변수를 설정할 수도 있습니다.You can also use the -v option to set a scripting variable that exists in a script. 파일 이름이 testscript.sql인 다음 스크립트에서 ColumnName 이 스크립팅 변수입니다.In the following script (the file name is testscript.sql), ColumnName is a scripting variable.

USE AdventureWorks2012;

SELECT x.$(ColumnName)
FROM Person.Person x
WHERE x.BusinessEntityID < 5;

다음과 같이 -v 옵션을 사용하여 반환하려는 열의 이름을 지정할 수 있습니다.You can then specify the name of the column that you want returned by using the -v option:

sqlcmd -v ColumnName ="FirstName" -i c:\testscript.sql

같은 스크립트를 사용하여 다른 열을 반환하려면 ColumnName 스크립팅 변수 값을 변경합니다.To return a different column by using the same script, change the value of the ColumnName scripting variable.

sqlcmd -v ColumnName ="LastName" -i c:\testscript.sql

스크립팅 변수 이름 및 값에 대한 지침Guidelines for Scripting Variable Names and Values

스크립팅 변수의 이름을 지정하는 경우 다음 지침을 고려합니다.Consider the following guidelines when you name scripting variables:

  • 변수 이름은 공백 문자나 따옴표를 포함할 수 없습니다.Variable names must not contain white space characters or quotation marks.

  • 변수 이름은 $(var)와 같은 변수 식 형태가 될 수 없습니다.Variable names must not have the same form as a variable expression, such as $(var).

  • 스크립팅 변수는 대/소문자를 구분하지 않습니다.Scripting variables are case-insensitive

    참고

    sqlcmd 환경 변수에 값을 지정하지 않으면 변수가 제거됩니다.If no value is assigned to a sqlcmd environment variable, the variable is removed. 값이 없는 :setvar VarName 을 사용하면 변수가 지워집니다.Using :setvar VarName without a value clears the variable.

    스크립팅 변수의 값을 지정하는 경우 다음 지침을 고려합니다.Consider the following guidelines when you specify values for scripting variables:

  • 문자열 값에 공백이 포함된 경우 setvar 또는 -v 옵션을 사용하여 정의한 변수 값을 따옴표로 묶어야 합니다.Variable values that are defined by using setvar or the -v option must be enclosed by quotation marks if the string value contains spaces.

  • 변수 값에 따옴표가 포함되는 경우 따옴표를 이스케이프 처리해야 합니다.If quotation marks are part of the variable value, they must be escaped. 예를 들면 :setvar MyVar "spac""e"와 같습니다.For example: :setvar MyVar "spac""e".

Cmd.exe SET 변수 값 및 이름에 대한 지침Guidelines for Cmd.exe SET Variable Values and Names

SET를 사용하여 정의한 변수는 Cmd.exe 환경의 일부이며 sqlcmd에서 참조될 수 있습니다.Variables that are defined by using SET are part of the Cmd.exe environment and can be referenced by sqlcmd. 다음 지침을 살펴 보십시오.Consider the following guidelines:

  • 변수 이름은 공백 문자나 따옴표를 포함할 수 없습니다.Variable names must not contain white space characters or quotation marks.

  • 변수 값은 공백이나 따옴표를 포함할 수 있습니다.Variable values may contain spaces or quotation marks.

sqlcmd 스크립팅 변수sqlcmd Scripting Variables

sqlcmd 에서 정의하는 변수를 스크립팅 변수라고 합니다.Variables that are defined by sqlcmd are known as scripting variables. 다음 표에는 sqlcmd 스크립팅 변수가 나와 있습니다.The following table lists sqlcmd scripting variables.

변수Variable 관련 옵션Related option R/WR/W 기본값Default
SQLCMDUSERSQLCMDUSER -U-U RR """"
SQLCMDPASSWORDSQLCMDPASSWORD -P-P -- """"
SQLCMDSERVERSQLCMDSERVER -S-S RR "DefaultLocalInstance""DefaultLocalInstance"
SQLCMDWORKSTATIONSQLCMDWORKSTATION -H-H RR "ComputerName""ComputerName"
SQLCMDDBNAMESQLCMDDBNAME -d-d RR """"
SQLCMDLOGINTIMEOUTSQLCMDLOGINTIMEOUT -l-l R/WR/W "8"(초)"8" (seconds)
SQLCMDSTATTIMEOUTSQLCMDSTATTIMEOUT -t-t R/WR/W "0" = 무기한 대기"0" = wait indefinitely
SQLCMDHEADERSSQLCMDHEADERS -H-h R/WR/W "0""0"
SQLCMDCOLSEPSQLCMDCOLSEP -S-s R/WR/W " "" "
SQLCMDCOLWIDTHSQLCMDCOLWIDTH -w-w R/WR/W "0""0"
SQLCMDPACKETSIZESQLCMDPACKETSIZE -A-a RR "4096""4096"
SQLCMDERRORLEVELSQLCMDERRORLEVEL -M-m R/WR/W "0""0"
SQLCMDMAXVARTYPEWIDTHSQLCMDMAXVARTYPEWIDTH -y-y R/WR/W "256""256"
SQLCMDMAXFIXEDTYPEWIDTHSQLCMDMAXFIXEDTYPEWIDTH -y-Y R/WR/W "0" = 제한 없음"0" = unlimited
SQLCMDEDITORSQLCMDEDITOR R/WR/W "edit.com""edit.com"
SQLCMDINISQLCMDINI RR """"

SQLCMDUSER, SQLCMDPASSWORD 및 SQLCMDSERVER는 :Connect 가 사용될 때 설정됩니다.SQLCMDUSER, SQLCMDPASSWORD and SQLCMDSERVER are set when :Connect is used.

R은 값이 프로그램 초기화 시 한 번만 설정될 수 있음을 나타냅니다.R indicates the value can only be set one time during program initialization.

R/W는 setvar 명령을 사용하여 값을 다시 설정할 수 있으며 후속 명령에 새 값이 사용됨을 나타냅니다.R/W indicates that the value can be reset by using the setvar command and subsequent commands will use the new value.

Examples

1.A. 스크립트에서 setvar 명령 사용Using the setvar command in a script

setvar 명령을 사용하면 스크립트에서 여러 sqlcmd 옵션을 제어할 수 있습니다.Many sqlcmd options can be controlled in a script by using the setvar command. 다음 예에서는 test.sql 변수가 SQLCMDLOGINTIMEOUT 초로 설정되고 다른 스크립팅 변수인 60server로 설정된 testserver스크립트를 만듭니다.In the following example, the script test.sql is created in which the SQLCMDLOGINTIMEOUT variable is set to 60 seconds and another scripting variable, server, is set to testserver. test.sql의 코드는 다음과 같습니다.The following code is in test.sql.

:setvar SQLCMDLOGINTIMEOUT 60
:setvar server "testserver"
:connect $(server) -l $(SQLCMDLOGINTIMEOUT)

USE AdventureWorks2012;

SELECT FirstName, LastName
FROM Person.Person;

그러면 sqlcmd를 사용하여 스크립트가 호출됩니다.The script is then called by using sqlcmd:

sqlcmd -i c:\test.sql

2.B. 대화식으로 setvar 명령 사용Using the setvar command interactively

다음 예에서는 setvar 명령을 사용하여 대화식으로 스크립팅 변수를 설정하는 방법을 보여 줍니다.The following example shows how to set a scripting variable interactively by using the setvar command.

sqlcmd
:setvar  MYDATABASE AdventureWorks2012
USE $(MYDATABASE);
GO

결과 집합은 다음과 같습니다.Here is the result set.

Changed database context to 'AdventureWorks2012'
1>

3.C. sqlcmd 내에서 명령 프롬프트 환경 변수 사용Using command prompt environment variables within sqlcmd

다음 예에서는 환경 변수 4개를 are 다음 sqlcmd에서 호출합니다.In the following example, four environment variables are set and then called from sqlcmd.

C:\>SET tablename=Person.Person
C:\>SET col1=FirstName
C:\>SET col2=LastName
C:\>SET title=Ms.
C:\>sqlcmd -d AdventureWorks2012
1> SELECT TOP 5 $(col1) + ' ' + $(col2) AS Name
2> FROM $(tablename)
3> WHERE Title ='$(title)'
4> GO

4.D. sqlcmd 내에서 사용자 수준 환경 변수 사용Using user-level environment variables within sqlcmd

다음 예에서는 명령 프롬프트에서 사용자 수준 환경 변수인 %Temp% 를 설정하고 sqlcmd 입력 파일로 전달합니다.In the following example the user-level environmental variable %Temp% is set at the command prompt and passed to the sqlcmd input file. 사용자 수준 환경 변수를 얻으려면 제어판에서 시스템을 두 번 클릭하고To obtain the user-level environment variable, in Control Panel, double-click System. 고급 탭을 클릭한 다음 환경 변수를 클릭합니다.Click the Advance tab, and then click Environment Variables.

입력 파일 c:\testscript.txt의 코드는 다음과 같습니다.The following code is in the input file c:\testscript.txt:

:OUT $(MyTempDirectory)
USE AdventureWorks2012;

SELECT FirstName
FROM AdventureWorks2012.Person.Person
WHERE BusinessEntityID` `< 5;

명령 프롬프트에서 입력되는 코드는 다음과 같습니다.This following code is entered at the command prompt:

C:\ >SET MyTempDirectory=%Temp%\output.txt
C:\ >sqlcmd -i C:\testscript.txt

출력 파일 C:\Documents and Settings\<user>\Local Settings\Temp\output.txt로 보내지는 결과는 다음과 같습니다.The following result is sent to the output file C:\Documents and Settings\<user>\Local Settings\Temp\output.txt.

Changed database context to 'AdventureWorks2012'.
FirstName
--------------------------------------------------
Gustavo
Catherine
Kim
Humberto

(4 rows affected)

5.E. 시작 스크립트 사용Using a startup script

sqlcmd 시작 스크립트는 sqlcmd 가 시작될 때 실행됩니다.A sqlcmd startup script is executed when sqlcmd is started. 다음 예에서는 SQLCMDINI환경 변수를 설정합니다.The following example sets the environment variable SQLCMDINI. 다음은 init.sql.This is the contents of 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 파일을 호출합니다.This calls the init.sql file when sqlcmd is started.

c:\> SET sqlcmdini=c:\init.sql
>1 Sqlcmd

다음은 출력입니다.This is the output.

>1 < user > is connected to < server > (9.00.2047.00)
참고

-X 옵션은 시작 스크립트 기능을 사용하지 않도록 설정합니다.The -X option disables the startup script feature.

6.F. 변수 확장Variable expansion

다음 예에서는 sqlcmd 변수 형식의 데이터로 작업하는 방법을 보여 줍니다.The following example shows working with data in the form of a sqlcmd variable.

USE AdventureWorks2012;
CREATE TABLE AdventureWorks2012.dbo.VariableTest
(
Col1 nvarchar(50)
);
GO

Col1 값을 포함하는 dbo.VariableTest$(tablename)에 하나의 행을 삽입합니다.Insert one row into Col1 of dbo.VariableTest that contains the value $(tablename).

INSERT INTO AdventureWorks2012.dbo.VariableTest(Col1)
VALUES('$(tablename)');
GO

sqlcmd 프롬프트에서 $(tablename)와 같게 설정된 변수가 없을 경우 다음 문은 행을 반환합니다.At the sqlcmd prompt, when no variable is set equal to $(tablename), the following statements return the row.

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

결과 집합은 다음과 같습니다.Here is the result set.

>1 Col1
>2 ------------------
>3 $(tablename)
>4
>5 (1 rows affected)

MyVar 변수가 $(tablename)으로 설정된 경우Given the variable MyVar is set to $(tablename).

>6 :setvar MyVar $(tablename)

다음 문은 행을 반환하며 "'tablename' 스크립팅 변수가 정의되지 않습니다"라는 메시지도 반환합니다.These statements return the row and also return the message "'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

다음 문은 행을 반환합니다.These statements return the row.

>1 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = '$(MyVar)';
>2 GO
>1 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(MyVar)';
>2 GO

참고 항목See Also

sqlcmd 유틸리티 사용 Use the sqlcmd Utility
-b sqlcmd Utility
명령 프롬프트 유틸리티 참조(데이터베이스 엔진#41;Command Prompt Utility Reference (Database Engine)