Invoke-Sqlcmd cmdlet 사용
Invoke-Sqlcmd는 Transact-SQL 및 XQuery 언어로 된 문과 sqlcmd 유틸리티에서 지원되는 명령이 포함된 스크립트를 실행하는 SQL Server cmdlet입니다.
Invoke-Sqlcmd 사용
Invoke-Sqlcmd cmdlet을 사용하여 sqlcmd 스크립트 파일을 Windows PowerShell 환경에서 실행할 수 있습니다. sqlcmd로 할 수 있는 많은 작업을 Invoke-Sqlcmd로도 수행할 수 있습니다.
다음은 Invoke-Sqlcmd를 호출하여 간단한 쿼리를 실행하는 예입니다. 이는 sqlcmd에 -Q 및 -S 옵션을 지정하는 것과 유사합니다.
Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance"
다음은 Invoke-Sqlcmd를 호출하고 입력 파일을 지정한 후 출력을 파일로 파이핑하는 예입니다. 이는 sqlcmd에 -i 및 -o 옵션을 지정하는 것과 유사합니다.
Invoke-Sqlcmd -InputFile "C:\MyFolder\TestSQLCmd.sql" | Out-File -filePath "C:\MyFolder\TestSQLCmd.rpt"
다음은 Windows PowerShell 배열을 사용하여 여러 개의 sqlcmd 스크립팅 변수를 Invoke-Sqlcmd로 전달하는 예입니다. SELECT 문에서 sqlcmd 스크립팅 변수를 식별하는 "$" 문자는 Windows PowerShell 역따옴표(`) 이스케이프 문자를 사용하여 이스케이프 처리되었습니다.
$MyArray = "MyVar1 = 'String1'", "MyVar2 = 'String2'"
Invoke-Sqlcmd -Query "SELECT `$(MyVar1) AS Var1, `$(MyVar2) AS Var2;" -Variable $MyArray
다음은 SQL Server 공급자를 사용하여 데이터베이스 엔진 인스턴스로 이동한 다음 Windows PowerShell Get-Item cmdlet을 사용하여 해당 인스턴스에 대한 SMO 서버 개체를 가져와 Invoke-Sqlcmd로 전달하는 예입니다.
Set-Location SQLSERVER:\SQL\MyComputer\MyInstance
Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance (Get-Item .)
-Query 매개 변수는 위치 매개 변수이며 이름을 지정할 필요가 없습니다. Invoke-Sqlcmd에 전달된 첫 번째 문자열의 이름이 지정되지 않은 경우 해당 문자열을 -Query 매개 변수로 처리합니다.
Invoke-Sqlcmd "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance"
Invoke-Sqlcmd의 경로 컨텍스트
-Database 매개 변수를 사용하지 않는 경우 Invoke-Sqlcmd에 대한 데이터베이스 컨텍스트는 cmdlet을 호출할 때 활성화된 경로에 의해 설정됩니다.
경로 |
데이터베이스 컨텍스트 |
---|---|
SQLSERVER: 이외의 드라이브로 시작 |
로컬 컴퓨터에 있는 기본 인스턴스의 로그인 ID에 대한 기본 데이터베이스입니다. |
SQLSERVER:\SQL |
로컬 컴퓨터에 있는 기본 인스턴스의 로그인 ID에 대한 기본 데이터베이스입니다. |
SQLSERVER:\SQL\ComputerName |
지정된 컴퓨터에 있는 기본 인스턴스의 로그인 ID에 대한 기본 데이터베이스입니다. |
SQLSERVER:\SQL\ComputerName\InstanceName |
지정된 컴퓨터에 있는 지정된 인스턴스의 로그인 ID에 대한 기본 데이터베이스입니다. |
SQLSERVER:\SQL\ComputerName\InstanceName\Databases |
지정된 컴퓨터에 있는 지정된 인스턴스의 로그인 ID에 대한 기본 데이터베이스입니다. |
SQLSERVER:\SQL\ComputerName\InstanceName\Databases\DatabaseName |
지정된 컴퓨터에 있는 지정된 인스턴스의 지정된 데이터베이스입니다. 이는 또한 데이터베이스 내의 테이블 및 열 노드를 지정하는 경로와 같은 보다 긴 경로에 적용됩니다. |
예를 들어 로컬 컴퓨터의 기본 인스턴스에 있는 Windows 계정에 대한 기본 데이터베이스가 master라고 가정합니다. 이 경우 다음 명령에서 master를 반환합니다.
Set-Location SQLSERVER:\SQL
Invoke-Sqlcmd "SELECT DB_NAME() AS DatabaseName;"
다음 명령에서 AdventureWorks를 반환합니다.
Set-Location SQLSERVER:\SQL\MyComputer\DEFAULT\Databases\AdventureWorks\Tables\Person.Contact
Invoke-Sqlcmd "SELECT DB_NAME() AS DatabaseName;"
Invoke-Sqlcmd에서 경로 데이터베이스 컨텍스트를 사용하는 경우 경고를 제공합니다. -SuppressProviderContextWarning 매개 변수를 사용하여 경고 메시지를 해제할 수 있습니다. -IgnoreProviderContext 매개 변수를 사용하여 Invoke-Sqlcmd에서 로그인에 대한 기본 데이터베이스를 항상 사용하도록 지정할 수 있습니다.
Invoke-Sqlcmd와 sqlcmd 유틸리티 비교
Invoke-Sqlcmd를 사용하면 sqlcmd 유틸리티로 실행할 수 있는 많은 스크립트를 실행할 수 있습니다. 하지만 Invoke-Sqlcmd는 sqlcmd가 실행되는 명령 프롬프트 환경과 다른 Windows PowerShell 환경에서 실행됩니다. Invoke-Sqlcmd의 동작은 Windows PowerShell 환경에서 작동하도록 수정되었습니다.
모든 sqlcmd 명령이 Invoke-Sqlcmd에서 구현되는 것은 아닙니다. 구현되지 않는 명령으로는 :!!, :connect, :error, :out, :ed, :list, :listvar, :reset, :perftrace 및 :serverlist가 있습니다.
Invoke-Sqlcmd는 sqlcmd 환경이나 SQLCMDDBNAME 또는 SQLCMDWORKSTATION과 같은 스크립팅 변수를 초기화하지 않습니다.
Invoke-Sqlcmd는 Windows PowerShell -Verbose 공통 매개 변수를 지정하지 않을 경우 PRINT 문의 출력과 같은 메시지를 표시하지 않습니다. 예를 들면 다음과 같습니다.
Invoke-Sqlcmd -Query "PRINT N'abc';" -Verbose
모든 sqlcmd 매개 변수가 Windows PowerShell 환경에서 필요한 것은 아닙니다. 예를 들어 Windows PowerShell은 모든 cmdlet 출력의 서식을 적용하므로 서식 옵션을 지정하는 sqlcmd 매개 변수는 Invoke-Sqlcmd에서 구현되지 않습니다. 다음 표에서는 Invoke-Sqlcmd 매개 변수와 sqlcmd 옵션 사이의 관계를 보여 줍니다.
설명 |
sqlcmd 옵션 |
Invoke-Sqlcmd 매개 변수 |
---|---|---|
서버 및 인스턴스 이름 |
-S |
-ServerInstance |
사용할 초기 데이터베이스 |
-d |
-Database |
지정된 쿼리 실행 후 종료 |
-Q |
-Query |
SQL Server 인증 로그인 ID |
-U |
-Username |
SQL Server 인증 암호 |
-P |
-Password |
변수 정의 |
-v |
-Variable |
쿼리 제한 시간 간격 |
-t |
-QueryTimeout |
오류 발생 시 실행 중지 |
-b |
-AbortOnError |
관리자 전용 연결 |
-A |
-DedicatedAdministratorConnection |
대화형 명령, 시작 스크립트 및 환경 변수를 사용하지 않음 |
-X |
-DisableCommands |
변수 대체를 사용하지 않음 |
-x |
-DisableVariables |
보고할 최소 심각도 수준 |
-V |
-SeverityLevel |
보고할 최소 오류 수준 |
-m |
-ErrorLevel |
로그인 제한 시간 간격 |
-l |
-ConnectionTimeout |
호스트 이름 |
-H |
-HbostName |
암호 변경 후 종료 |
-Z |
-NewPassword |
쿼리가 포함된 입력 파일 |
-i |
-InputFile |
최대 문자 출력 길이 |
-w |
-MaxCharLength |
최대 이진 출력 길이 |
-w |
-MaxBinaryLength |
SSL 암호화를 사용하여 연결 |
매개 변수 없음 |
-EncryptConnection |
오류 표시 |
매개 변수 없음 |
-OutputSqlErrors |
메시지를 stderr로 출력 |
-r |
매개 변수 없음 |
클라이언트의 국가별 설정 사용 |
-R |
매개 변수 없음 |
지정된 쿼리 실행 후 실행 중인 상태로 유지 |
-q |
매개 변수 없음 |
출력 데이터에 사용할 코드 페이지 |
-f |
매개 변수 없음 |
암호 변경 후 실행 중인 상태로 유지 |
-z |
매개 변수 없음 |
패킷 크기 |
-a |
매개 변수 없음 |
열 구분 기호 |
-s |
매개 변수 없음 |
출력 헤더 제어 |
-h |
매개 변수 없음 |
제어 문자 지정 |
-k |
매개 변수 없음 |
고정 길이 표시 너비 |
-Y |
매개 변수 없음 |
변수 길이 표시 너비 |
-y |
매개 변수 없음 |
입력 에코 |
-e |
매개 변수 없음 |
따옴표 붙은 식별자 사용 |
-I |
매개 변수 없음 |
후행 공백 제거 |
-W |
매개 변수 없음 |
인스턴스 나열 |
-L |
매개 변수 없음 |
출력을 유니코드 형식으로 지정 |
-u |
매개 변수 없음 |
통계 인쇄 |
-p |
매개 변수 없음 |
명령 종료 |
-c |
매개 변수 없음 |
Windows 인증을 사용하여 연결 |
-E |
매개 변수 없음 |