다음을 통해 공유


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

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System(PDW)Microsoft Fabric의 SQL 데이터베이스

sqlcmd 유틸리티를 사용하면 Transact-SQL 문, 시스템 프로시저 및 스크립트 파일을 입력할 수 있습니다.

참고

시스템에 설치된 sqlcmd 의 변형 및 버전을 확인하려면 설치된 sqlcmd 버전의 sqlcmd 유틸리티 확인을 참조하세요. sqlcmd를 가져오는 방법에 대한 자세한 내용은 sqlcmd 유틸리티 다운로드 및 설치를 참조하세요.

sqlcmd의 스크립팅 변수

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

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

이 문서에는 SET을(를) 사용하여 명령줄에서 환경 변수를 정의하는 예제가 포함되어 있습니다.

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

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

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

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

  1. 시스템 수준 환경 변수
  2. 사용자 수준 환경 변수
  3. SET X=Y를 시작하기 전에 명령 프롬프트에서 설정한 명령 셸()
  4. sqlcmd -v X=Y
  5. :Setvar X Y

참고

Windows 11에서 환경 변수를 보려면 설정을 연 다음 시스템>정보로 이동하여 고급 시스템 설정 링크를 선택합니다. 시스템 속성 창에서 환경 변수를 선택합니다. Linux에서 명령줄에 입력 printenv 하고 macOS에서 .를 입력합니다 env.

암시적으로 스크립팅 변수 설정

관련 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 스크립팅 변수

변수 관련 옵션 R/W 기본값
SQLCMDUSER 1 -U R 2 ""
SQLCMDPASSWORD 1 -P -- ""
SQLCMDSERVER 1 -S R 2 기본 로컬 인스턴스
SQLCMDWORKSTATION -H R 2 컴퓨터 이름
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 값을 다시 설정할 수 있음을 나타내고 후속 명령은 새 값을 사용합니다.

예제

이 문서의 코드 샘플은 AdventureWorks2022 또는 AdventureWorksDW2022 샘플 데이터베이스를 사용합니다. 이 데이터베이스는 Microsoft SQL Server 샘플 및 커뮤니티 프로젝트 홈페이지에서 다운로드할 수 있습니다.

A. 스크립트에서 setvar 명령어 사용

많은 sqlcmd 옵션은 setvar 명령을 사용하여 스크립트에서 제어할 수 있습니다. 다음 예에서는 test.sql 변수가 SQLCMDLOGINTIMEOUT 초로 설정되고 다른 스크립팅 변수인 60server로 설정된 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

Col1dbo.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