2017-12-20 2 views
0

매우 간단한 프로세스를 자동화하기 위해 PowerShell 스크립트를 만들려고 노력하고 있지만, 작동하려면 아무 것도 얻을 수 없습니다. 문서화는 내가 필요로하는 것이거나 구식이거나 모순되는 것이 아닙니다. 나는 데이터베이스에 연결하는 관리되지했습니다PowerShell을 통해 로컬 SQL 서버 2016에 연결하고 .sql 파일에 저장된 SQL을 실행하는 방법은 무엇입니까?

$SQLConnection = New-Object System.Data.SQLClient.SQLConnection 
$SQLConnection.ConnectionString = "Data Source=.\SQL2016;Initial Catalog=TEST;Trusted_Connection=true;" 
$SQLConnection.Open() 

$Cmd = new-object system.Data.SqlClient.SqlCommand($SQLConnection) 

Invoke-Sqlcmd -InputFile "C:\dev\test\script.sql" | Out-File -filePath "C:\dev\test\output.sql" 

$SQLConnection.Close() 

:

나는이 몇 가지 변화를 했어.

아이디어는 script.sql입니다. 우리는 소스 제어에 넣을 SQL 묶음을 뱉어냅니다. 소스 제어가되면 젠킨스 (Jenkins)의 일은 그 일로 무언가를 할 것입니다.

가능한 한 기본 설정으로 유지하려고하면 다른 연결 문자열 외에는 유연성이 필요하지 않습니다. 가능한 경우 PSSQL을 사용하지 않으려합니다. 사용자가 연결 문자열 (데이터베이스가 이름 임)을 던지고 스크립트를 실행하면 작업이 완료됩니다.

누구나 올바른 방향으로 나를 가리킬 수 있습니까?

+1

@ wp78de SQL Server 2008 R2와 SQL Server 2016 사이에 중요한 변경 사항이 있었기 때문에 가장 좋은 대답은 아닙니다. 명령 구문은 비슷하지만 Powershell 모듈은 현재 모듈이며 스냅인이었습니다. in 2008 R2. 그런 다음 모듈이 처음 나왔을 때 이름이 SQLPS로 지정되었습니다. 최근에야 SqlServer로 이름을 바꾸고 PowerShell 갤러리에 추가했습니다. –

답변

1

System.Data.SQLClient은 SqlServer 모듈이 설치되어 있지 않거나 특이한 작업을 수행하는 경우에만 필요합니다. 훨씬 더 장황한 방법입니다.

당신은 필요

Import-Module SqlServer; 

Invoke-Sqlcmd -ServerInstance '.\SQL2016' -Database 'TEST' -InputFile 'C:\dev\test\script.sql' | 
    Out-File -FilePath "C:\dev\test\output.sql" 

그러나 ... 출력 파일은 정말 .SQL 파일이 아닙니다 script.sql의 쿼리가 실제로 SQL로 실행되어야 문자열을 반환하지 않는. 아마도 .txt 파일이어야합니다.

정확한 생성 내용에 따라 Out-File 대신 Export-Csv -Path "C:\dev\test\output.csv" -NoTypeInformation을 사용하는 것이 좋습니다. 데이터를 내보내려고하거나 정보를 로깅하려고하는지 알 수 없습니다.

또한, 당신은 당신이 script.sql에 배치 분리기 (GO)를 사용하여, 또는 (가 SQL Server 관리 Studio에서라고으로) 어떤 "SQLCMD 모드"에 의존하거나 다른 sqlcmd.exe 특정하지 않을 있는지 확인해야합니다 통사론. Invoke-Sqlcmd doc은 둘 사이의 차이점을 간략하게 설명합니다. 그것이 무엇인지 모를 경우 아마 안전 할 것입니다.

+0

고마워, 그거 간단 해. 나는 그것을 줄 것이다. script.sql은 소스 컨트롤에 넣어야하는 테이블에 대한 insert 문을 반환합니다. GO 문을 사용하지는 않지만 output.sql에 해당 문이 있으므로 익숙하지 않습니다. output.sql 형식이 올바른 SQL입니다. 단순화 된, 우리는 전체 DB가 소스 제어에있는 시스템을 가지고 있습니다. 하나의 테이블을 제외하고는 스크립팅하고 있습니다. 모든 사용자는 자체 로컬 데이터베이스를 사용합니다. Jenkins는 마스터 데이터베이스를 최신 상태로 유지하면서 repo를 폴링합니다.이 테이블이 누락되었습니다. – OnceInALifetime

+0

귀하의 제안이 효과가없는 이유는 무엇입니까? 이 파일을 실행하면 출력 파일이 생성되지만 실제 파일을 채우지는 않습니다. 입력과 출력 매개 변수를 삭제하고 직선 - 쿼리를 실행하면 예상대로 결과를 얻을 수 있습니다. -i와 -o를 각각 사용하여 sqlcmd를 직접 (PowerShell에서) 실행하면 작동합니다. 나는 관리자로서의 실행을 시도했다. – OnceInALifetime

+0

@OnceInALifetime'Out-File'을 파이프로 연결하지 않으면 빈 파일이 생성됩니다. 이 파일이 한 줄로 실행되는지 확인하십시오.이 코드는 읽기 쉽도록 두 가지 형식으로되어 있지만 실제로는 하나입니다. 그게 아니라면,'script.sql'이 무엇을 실행하는지 정확히 모른 채 말하기는 어렵습니다. 'SELECT @@ VERSION' 쿼리 또는 항상 결과 셋을 리턴해야하는 다른 간단한 쿼리를 사용하여 파일을 생성 해보십시오. 그런 다음'-Query' 매개 변수를 사용하여 쿼리로 Invoke-Sqlcmd를 실행 해 봅니다. –

관련 문제