sqlcmd - 유틸리티 사용

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System(PDW)

sqlcmd 유틸리티는 T-SQL(Transact-SQL) 문 및 스크립트의 임시 대화형 실행 및 T-SQL 스크립팅 작업을 자동화하기 위한 명령줄 유틸리티입니다. sqlcmd를 대화형으로 사용하거나 sqlcmd를 사용하여 실행할 스크립트 파일을 빌드하려면 사용자는 T-SQL을 이해해야 합니다. sqlcmd 유틸리티는 일반적으로 다음과 같은 방법으로 사용됩니다.

  • 사용자는 명령 프롬프트에서 작업하는 것과 비슷한 방식으로 T-SQL 문을 입력합니다. 결과는 명령 프롬프트에 표시됩니다. 명령 프롬프트 창을 열려면 Windows 검색 상자에 입력 cmd 하고 명령 프롬프트를 선택하여 엽니다. 명령 프롬프트에서 sqlcmd를 입력한 뒤 원하는 옵션을 입력합니다. sqlcmd에서 지원하는 옵션의 전체 목록은 sqlcmd 유틸리티를 참조하세요.

  • 사용자는 실행할 단일 T-SQL 문을 지정하거나 실행할 T-SQL 문이 포함된 텍스트 파일을 유틸리티를 가리켜 sqlcmd 작업을 제출합니다. 출력은 텍스트 파일로 전달되지만 명령 프롬프트에도 표시될 수 있습니다.

  • SSMS(SQL Server Management Studio)의 SQLCMD 모드는 쿼리 편집기.

  • SMO(SQL Server Management Objects).

  • cmdExec 작업을 SQL Server 에이전트.

일반적으로 사용되는 sqlcmd 옵션

  • 서버 옵션(-S)은 sqlcmd연결되는 SQL Server의 인스턴스를 식별합니다.

  • 인증 옵션(-E-U-P)은 sqlcmdSQL Server 인스턴스에 연결하는 데 사용하는 자격 증명을 지정합니다.

    참고 항목

    이 옵션은 -E 기본값이며 지정할 필요가 없습니다.

  • 입력 옵션(-Q-q-i)은 sqlcmd대한 입력 위치를 식별합니다.

  • 출력 옵션(-o)은 sqlcmd출력을 배치할 파일을 지정합니다.

sqlcmd 유틸리티에 커넥트

  • Windows 인증을 사용하여 T-SQL 문을 대화형으로 실행하여 기본 인스턴스로 커넥트.

    sqlcmd -S <ComputerName>
    

    참고 항목

    이전 예제 -E 에서는 기본값 이고 sqlcmd 는 Windows 인증을 사용하여 기본 인스턴스에 연결하므로 지정되지 않았습니다.

  • Windows 인증을 사용하여 T-SQL 문을 대화형으로 실행하여 명명된 인스턴스에 커넥트.

    sqlcmd -S <ComputerName>\<InstanceName>
    

    또는

    sqlcmd -S .\<InstanceName>
    
  • Windows 인증을 사용하고 입력 및 출력 파일을 지정하여 명명된 인스턴스에 커넥트.

    sqlcmd -S <ComputerName>\<InstanceName> -i <MyScript.sql> -o <MyOutput.rpt>
    
  • Windows 인증을 사용하고, 쿼리를 실행하고, 쿼리 실행을 완료한 후 sqlcmd를 다시 실행하도록 기본 로컬 컴퓨터의 기본 인스턴스로 커넥트.

    sqlcmd -q "SELECT * FROM AdventureWorks2022.Person.Person"
    
  • Windows 인증을 사용하고, 쿼리를 실행하고, 출력을 파일로 전달하고, 쿼리 실행이 완료된 후 sqlcmd를 종료하여 로컬 컴퓨터의 기본 인스턴스로 커넥트.

    sqlcmd -Q "SELECT * FROM AdventureWorks2022.Person.Person" -o MyOutput.txt
    
  • SQL Server 인증을 사용하여 명명된 인스턴스에 커넥트 암호를 묻는 sqlcmd 메시지와 함께 T-SQL 문을 대화형으로 실행합니다.

    sqlcmd -U MyLogin -S <ComputerName>\<InstanceName>
    

    sqlcmd 유틸리티에서 지원하는 옵션 목록을 보려면 sqlcmd -?를 실행하세요.

sqlcmd를 사용하여 Transact-SQL 문을 대화형으로 실행

sqlcmd 유틸리티를 대화형으로 사용하여 명령 프롬프트 창에서 T-SQL 문을 실행할 수 있습니다. sqlcmd를 사용하여 T-SQL 문을 대화형으로 실행하려면 입력 파일 또는 -i 쿼리를 -Q-q-Z지정하는 옵션을 사용하지 않고 유틸리티를 실행합니다. 예시:

sqlcmd -S <ComputerName>\<InstanceName>

명령이 입력 파일이나 쿼리 없이 실행되면 sqlcmd는 SQL Server의 지정된 인스턴스에 연결한 다음 sqlcmd 프롬프트라는 깜박이는 밑줄이 있는 새 줄을 1> 표시합니다. 이는 1 T-SQL 문의 첫 번째 줄임을 의미하며 , sqlcmd 프롬프트는 T-SQL 문을 입력할 때 시작되는 지점입니다.

sqlcmd 프롬프트에서 T-SQL 문과 sqlcmd 명령(예: GOEXIT)을 모두 입력할 수 있습니다. 각 T-SQL 문은 문 캐시라는 버퍼에 배치됩니다. 이러한 문은 명령을 입력하고 Enter 키를 누르면 SQL Server로 GO 전송됩니다. sqlcmd를 종료하려면 새 줄을 입력하거나 QUIT 시작 부분에 입력EXIT합니다.

문 캐시를 지우려면 .를 입력합니다 :RESET. Ctrl+C를 입력하면 sqlcmd가 종료됩니다. Ctrl+C 를 사용하여 명령이 실행된 후 GO 문 캐시 실행을 중지할 수도 있습니다.

대화형 세션에 입력된 T-SQL 문은 명령 및 sqlcmd 프롬프트를 :ED 입력하여 편집할 수 있습니다. 편집기가 열리고, T-SQL 문을 편집하고 편집기를 닫은 후 수정된 T-SQL 문이 명령 창에 나타납니다. 수정된 T-SQL 문을 실행하려면 입력 GO 합니다.

따옴표 붙은 문자열

따옴표 두 개를 연속으로 입력하여 문자열 내에 따옴표를 삽입하는 예외적인 경우를 제외하고 따옴표로 묶인 문자는 추가적인 전처리 없이 사용됩니다. SQL Server는 이 문자 시퀀스를 하나의 따옴표로 처리합니다. (그러나 변환은 서버에서 발생합니다.) 스크립팅 변수는 문자열 내에 표시될 때 확장되지 않습니다.

예시:

sqlcmd
PRINT "Length: 5"" 7'";
GO

결과 집합은 다음과 같습니다.

Length: 5" 7'

여러 줄에 걸쳐 있는 문자열

sqlcmd 는 여러 줄에 걸쳐 있는 문자열이 있는 스크립트를 지원합니다. 예를 들어 다음 SELECT 문은 여러 줄에 걸쳐 있지만 입력한 후 Enter 키를 누 때 실행되는 단일 문자열입니다 GO.

SELECT <First line>
FROM <Second line>
WHERE <Third line>;
GO

대화형 sqlcmd 실행 예

이는 sqlcmd를 대화형으로 실행할 때 표시되는 내용의 예입니다.

명령 프롬프트 창을 열면 다음과 비슷한 한 줄이 있습니다.

C:\Temp\>

즉, 폴더 C:\Temp\ 가 현재 폴더이고 파일 이름을 지정하면 Windows에서 해당 폴더의 파일을 찾습니다.

sqlcmd를 입력하여 로컬 컴퓨터에서 SQL Server의 기본 인스턴스에 연결하고 명령 프롬프트 창의 내용은 다음과 같습니다.

C:\Temp>sqlcmd
1>

즉, SQL Server 인스턴스에 연결했고 sqlcmd 는 이제 T-SQL 문 및 sqlcmd 명령을 수락할 준비가 되었습니다. 그 뒤의 1> 깜박이는 밑줄은 입력한 문과 명령이 표시되는 위치를 표시하는 sqlcmd 프롬프트입니다. 이제 Enter 키를 입력 USE AdventureWorks2022 하고 누 다음 Enter 키를 입력 GO 하고 누릅니 . 명령 프롬프트 창의 내용은 다음과 같습니다.

sqlcmd
USE AdventureWorks2022;
GO

결과 집합은 다음과 같습니다.

Changed database context to 'AdventureWorks2022'.
1>

Enter 키를 누르면 sqlcmd에 새 줄을 시작하라는 신호가 표시됩니다. 입력GO한 후 Enter 키를 누르면 sqlcmd에 신호를 보내 문을 SQL Server 인스턴스로 보냅니 USE AdventureWorks2022 다. 그런 다음 sqlcmd 는 문이 성공적으로 완료되었음을 USE 나타내는 메시지를 반환하고 새 명령문 또는 명령을 입력하기 위한 신호로 새 1> 프롬프트를 표시합니다.

다음 예제에서는 문을 입력 SELECT 하는 경우 명령 프롬프트 창에 포함된 내용, GO 실행할 SELECT명령 프롬프트 창 및 EXIT sqlcmd를 종료하는 방법을 보여 줍니다.

USE AdventureWorks2022;
GO
SELECT TOP (3) BusinessEntityID, FirstName, LastName
FROM Person.Person;
GO

결과 집합은 다음과 같습니다.

BusinessEntityID  FirstName  LastName
----------------- ---------- ------------
1                 Syed       Abbas
2                 Catherine  Abel
3                 Kim        Abercrombie

출력을 생성한 후 sqlcmd는 sqlcmd 프롬프트를 다시 설정하여 표시합니다1>. 프롬프트에 1> 입력 EXIT 하여 세션을 종료합니다. 이제 다른 EXIT 명령을 입력하여 명령 프롬프트 창을 닫을 수 있습니다.

SQL Server 컨테이너 만들기 및 쿼리

sqlcmd(Go)를 사용하여 컨테이너에 SQL Server의 새 인스턴스를 만들 수 있습니다. sqlcmd (Go)는 컨테이너 이미지 및 SQL Server 백업을 지정하여 개발, 디버깅 및 분석 목적으로 SQL Server 인스턴스를 신속하게 만들 수 있는 문을 노출 create 합니다.

Important

Docker 또는 Podman과 같은 컨테이너 런타임이 설치되어 있어야 합니다.

다음 명령은 사용 가능한 모든 옵션을 확인하여 새 SQL Server 컨테이너를 만드는 방법을 보여줍니다.

sqlcmd create mssql --help

다음 명령은 최신 버전의 SQL Server 2022(16.x)를 사용하여 새 SQL Server 인스턴스를 만든 다음 Wide World Importers 샘플 데이터베이스를 복원합니다.

sqlcmd create mssql --accept-eula --tag 2022-latest --using https://github.com/Microsoft/sql-server-samples/releases/download/wide-world-importers-v1.0/WideWorldImporters-Full.bak

SQL Server 인스턴스가 만들어지면 sqlcmd(Go)를 사용하여 관리하고 쿼리할 수 있습니다.

다음 명령은 생성된 인스턴스의 버전을 확인합니다.

sqlcmd query "SELECT @@version"

다음 명령은 생성된 인스턴스를 사용하여 대화형 세션을 시작합니다.

sqlcmd query

다음 명령은 Azure Data Studio를 열고 만들기 프로세스 중에 복원된 데이터베이스에 자동으로 연결합니다.

sqlcmd open ads

다음 명령은 생성된 인스턴스에 연결하는 데 사용할 연결 문자열 나열합니다.

sqlcmd config connection-strings

다음 명령은 더 이상 필요하지 않은 경우 컨테이너를 제거하는 데 사용됩니다.

sqlcmd delete

sqlcmd를 사용하여 Transact-SQL 스크립트 파일 실행

sqlcmd를 사용하여 데이터베이스 스크립트 파일을 실행할 수 있습니다. 스크립트 파일은 T-SQL 문, sqlcmd 명령 및 스크립팅 변수가 혼합된 텍스트 파일입니다. 변수를 스크립팅하는 방법에 대한 자세한 내용은 스크립팅 변수와 함께 sqlcmd 사용을 참조 하세요. sqlcmd 는 대화형으로 입력된 문과 명령을 사용하는 방식과 유사한 방식으로 스크립트 파일의 문, 명령 및 스크립팅 변수를 사용합니다. 기본 차이점은 sqlcmd사용자가 문, 명령 및 스크립팅 변수를 입력할 때까지 기다리지 않고 일시 중지하지 않고 입력 파일을 읽는다는 것입니다.

데이터베이스 스크립트 파일을 만드는 방법에는 여러 가지가 있습니다.

  • SQL Server Management Studio에서 T-SQL 문 집합을 대화형으로 빌드하고 디버그한 다음 쿼리 창의 내용을 스크립트 파일로 저장할 수 있습니다.

  • 메모장 같은 텍스트 편집기를 사용하여 T-SQL 문이 포함된 텍스트 파일을 만들 수 있습니다.

예제

A. sqlcmd를 사용하여 스크립트 실행

메모장 시작하고 다음 T-SQL 문을 입력합니다.

USE AdventureWorks2022;
GO
SELECT TOP (3) BusinessEntityID, FirstName, LastName
FROM Person.Person;
GO

명명 MyFolder 된 폴더를 만든 다음, 스크립트를 폴더C:\MyFolder에 파일 MyScript.sql 로 저장합니다. 명령 프롬프트에서 다음 명령을 입력하여 스크립트를 실행하고 출력 MyOutput.txt 을 입력합니다 MyFolder.

sqlcmd -i C:\MyFolder\MyScript.sql -o C:\MyFolder\MyOutput.txt

결과 집합은 다음과 같습니다.

Changed database context to 'AdventureWorks2022'.
BusinessEntityID  FirstName  LastName
----------------- ---------- ------------
1                 Syed       Abbas
2                 Catherine  Abel
3                 Kim        Abercrombie
(3 rows affected)

B. 전용 관리 연결에서 sqlcmd 사용

다음 예제 에서 sqlcmd 는 전용 DAC(관리자 연결)를 사용하여 차단 문제가 있는 서버에 연결하는 데 사용됩니다.

C:\Temp\>sqlcmd -S ServerName -A
1> SELECT session_id, blocking_session_id FROM `sys.dm_exec_requests` WHERE blocking_session_id <> 0;
2> GO

결과 집합은 다음과 같습니다.

session_id   blocking_session_id
-----------  --------------------`
62           64
(1 rows affected)

sqlcmd를 사용하여 차단 프로세스를 종료합니다.

1> KILL 64;
2> GO

C. sqlcmd를 사용하여 저장 프로시저 실행

다음 예제에서는 sqlcmd를 사용하여 저장 프로시저를 실행하는 방법을 보여줍니다. 다음 저장 프로시저를 만듭니다.

USE AdventureWorks2022;
GO

IF OBJECT_ID('dbo.ContactEmailAddress', 'P') IS NOT NULL
    DROP PROCEDURE dbo.ContactEmailAddress;
GO

CREATE PROCEDURE dbo.ContactEmailAddress (
    @FirstName NVARCHAR(50),
    @LastName NVARCHAR(50)
)
AS
SET NOCOUNT ON;

SELECT EmailAddress
FROM Person.Person
WHERE FirstName = @FirstName
    AND LastName = @LastName;

SET NOCOUNT OFF;
GO

sqlcmd 프롬프트에서 다음을 입력합니다.

C:\Temp\sqlcmd
1> :Setvar FirstName Gustavo
1> :Setvar LastName Achong
1> EXEC dbo.ContactEmailAddress $(FirstName),$(LastName)
2> GO
EmailAddress
-----------------------------
gustavo0@adventure-works.com

D. 데이터베이스 기본 테넌스에 sqlcmd 사용

다음 예제에서는 데이터베이스 기본 테넌스 작업에 sqlcmd를 사용하는 방법을 보여 드립니다. 다음 코드를 사용하여 만듭니 C:\Temp\BackupTemplate.sql 다.

USE master;
BACKUP DATABASE [$(db)] TO DISK='$(bakfile)';

sqlcmd 프롬프트에서 다음 코드를 입력합니다.

C:\Temp\>sqlcmd
1> :connect <server>
Sqlcmd: Successfully connected to server <server>.
1> :setvar db msdb
1> :setvar bakfile C:\Temp\msdb.bak
1> :r C:\Temp\BackupTemplate.sql
2> GO
Changed database context to 'master'.
Processed 688 pages for database 'msdb', file 'MSDBData' on file 2.
Processed 5 pages for database 'msdb', file 'MSDBLog' on file 2.
BACKUP DATABASE successfully processed 693 pages in 0.725 seconds (7.830 MB/sec)

E. sqlcmd를 사용하여 여러 인스턴스에서 코드 실행

단일 파일에 있는 다음 코드는 두 개의 인스턴스에 연결하는 스크립트를 보여 줍니다. 두 번째 인스턴스에 대한 연결 전에 GO 가 있습니다.

:CONNECT <server>\,<instance1>
EXEC dbo.SomeProcedure
GO
:CONNECT <server>\,<instance2>
EXEC dbo.SomeProcedure
GO

E. 반환 XML 출력

다음 예에서는 XML 출력이 서식이 지정되지 않은 연속 스트림으로 반환되는 방법을 보여 줍니다.

C:\Temp\>sqlcmd -d AdventureWorks2022
1> :XML ON
1> SELECT TOP 3 FirstName + ' ' + LastName + ', '
2> FROM Person.Person
3> GO
Syed Abbas, Catherine Abel, Kim Abercrombie,

F. Windows 스크립트 파일에서 sqlcmd 사용

같은 sqlcmd -i C:\Temp\InputFile.txt -o C:\Temp\OutputFile.txt, sqlcmd 명령은 VBScript와 함께 .bat 파일에서 실행할 수 있습니다. 이 경우 대화형 옵션을 사용하지 마세요. .bat 파일을 실행하는 컴퓨터에 sqlcmd 를 설치해야 합니다.

먼저 다음 네 개의 파일을 만듭니다.C:\Temp

  • C:\Temp\badscript.sql

    SELECT batch_1_this_is_an_error
    GO
    SELECT 'batch #2'
    GO
    
  • C:\Temp\goodscript.sql

    SELECT 'batch #1';
    GO
    SELECT 'batch #2';
    GO
    
  • C:\Temp\returnvalue.sql

    :exit(select 100)
    
  • C:\Temp\windowsscript.bat

    @echo off
    
    echo Running badscript.sql
    sqlcmd -i badscript.sql -b -o out.log
    if not errorlevel 1 goto next1
    echo == An error occurred
    
    :next1
    
    echo Running goodscript.sql
    sqlcmd -i goodscript.sql -b -o out.log
    if not errorlevel 1 goto next2
    echo == An error occurred
    
    :next2
    echo Running returnvalue.sql
    sqlcmd -i returnvalue.sql -o out.log
    echo SQLCMD returned %errorlevel% to the command shell
    
    :exit
    

그런 다음 명령 프롬프트에서 C:\Temp\windowsscript.bat를 실행합니다.

C:\Temp\>windowsscript.bat
Running badscript.sql
== An error occurred
Running goodscript.sql
Running returnvalue.sql

SQLCMD returned 100 to the command shell

G. sqlcmd를 사용하여 Azure SQL Database에서 암호화 설정

SQL Database 데이터에 대한 연결에서 sqlcmd 를 실행하여 암호화 및 인증서 트러스트를 지정할 수 있습니다. 다음 두 가지 sqlcmd 옵션을 사용할 수 있습니다.

  • -N 스위치는 클라이언트에서 암호화된 연결을 요청하는 데 사용됩니다. 이 옵션은 ADO.net 옵션 ENCRYPT = true와 동일합니다.

  • 스위치는 -C 클라이언트에서 암시적으로 신뢰 서버 인증서를 구성하고 유효성을 검사하지 않도록 구성하는 데 사용됩니다. 이 옵션은 ADO.net 옵션 TRUSTSERVERCERTIFICATE = true와 동일합니다.

SQL Database 서비스는 SQL Server 인스턴스에서 사용할 수 있는 모든 SET 옵션을 지원하지 않습니다. 다음 옵션은 해당하는 SET 옵션이 ON 또는 OFF로 설정되어 있는 경우 오류를 반환합니다.

  • SET ANSI_DEFAULTS
  • SET ANSI_NULLS
  • SET REMOTE_PROC_TRANSACTIONS
  • SET ANSI_NULL_DEFAULT

다음 SET 옵션은 예외를 throw하지 않지만 사용할 수 없습니다. 더 이상 사용되지 않습니다.

  • SET CONCAT_NULL_YIELDS_NULL
  • SET ANSI_PADDING
  • SET QUERY_GOVERNOR_COST_LIMIT

구문

다음 예제는 SQL Server Native Client Provider 설정이 포함된 경우를 참조합니다.

  • ForceProtocolEncryption = False
  • Trust Server Certificate = No

Windows 자격 증명을 사용하고 통신을 암호화하는 커넥트.

sqlcmd -E -N

Windows 자격 증명을 사용한 연결 및 서버 인증서 신뢰:

sqlcmd -E -C

Windows 자격 증명을 사용한 연결, 통신 암호화 및 서버 인증서 신뢰:

sqlcmd -E -N -C

다음 예제는 SQL Server Native Client Provider 설정이 포함된 경우를 참조합니다.

  • ForceProtocolEncryption = True
  • TrustServerCertificate = Yes

Windows 자격 증명을 사용한 연결, 통신 암호화 및 서버 인증서 신뢰:

sqlcmd -E

Windows 자격 증명을 사용한 연결, 통신 암호화 및 서버 인증서 신뢰:

sqlcmd -E -N

Windows 자격 증명을 사용한 연결, 통신 암호화 및 서버 인증서 신뢰:

sqlcmd -E -C

Windows 자격 증명을 사용한 연결, 통신 암호화 및 서버 인증서 신뢰:

sqlcmd -E -N -C

공급자가 지정ForceProtocolEncryption = True하는 경우 연결 문자열 경우에도 Encrypt=No 암호화가 활성화됩니다.

다음 단계