Program Club

PowerShell을 사용하여 .sql 파일을 실행하는 방법은 무엇입니까?

proclub 2020. 11. 7. 10:40
반응형

PowerShell을 사용하여 .sql 파일을 실행하는 방법은 무엇입니까?


나는. sql파일. Powershell 스크립트를 통해 연결 문자열 세부 정보를 전달하고 .sql파일을 호출하려고 합니다.

검색 중 .NET 관련 cmdlet을 찾았습니다 Invoke-sqlcmd. SQL에 해당하는 모듈을 찾으려고했지만 내 컴퓨터에서 하나도 찾지 못했습니다.

모듈을 가져 오려면 내 컴퓨터 (컴퓨터에 이미 SQL Server Management Studio 2008 R2가 있음)에 무엇이든 설치해야합니까 .sql? 아니면 Powershell을 사용하여 파일을 쉽게 실행할 수있는 방법이 있습니까?


SQL 스냅인이 있는지 확인하십시오.

get-pssnapin -Registered

Name        : SqlServerCmdletSnapin100
PSVersion   : 2.0
Description : This is a PowerShell snap-in that includes various SQL Server cmdlets.

Name        : SqlServerProviderSnapin100
PSVersion   : 2.0
Description : SQL Server Provider

그렇다면

Add-PSSnapin SqlServerCmdletSnapin100 # here lives Invoke-SqlCmd
Add-PSSnapin SqlServerProviderSnapin100

그러면 다음과 같이 할 수 있습니다.

invoke-sqlcmd -inputfile "c:\mysqlfile.sql" -serverinstance "servername\serverinstance" -database "mydatabase" # the parameter -database can be omitted based on what your sql script does.

MSDN의 Import the SQLPS Module 에서 인용 ,

PowerShell에서 SQL Server를 관리하는 권장 방법은 sqlps 모듈을 Windows PowerShell 2.0 환경으로 가져 오는 것입니다.

예, Add-PSSnapinChristian이 자세히 설명 하는 접근 방식을 사용할 수 있지만 권장되는 sqlps 모듈 접근 방식을 이해하는 것도 유용합니다.

가장 간단한 경우는 SQL Server 2012가 있다고 가정합니다. sqlps 가 설치에 포함되어 있으므로를 통해 다른 모듈 (일반적으로 프로필에 있음 )을 로드하기 만하면 됩니다 Import-Module sqlps. 을 사용하여 시스템에서 모듈을 사용할 수 있는지 확인할 수 있습니다 Get-Module -ListAvailable.

SQL Server 2012가없는 경우에는 sqlps 모듈을 모듈 디렉터리에 다운로드하기 만하면 Get-Module / Import-Module에서 찾을 수 있습니다. 흥미롭게도 Microsoft는 이 모듈을 다운로드 할 수 있도록 하지 않습니다 ! 그러나 Chad Miller는 필요한 부분을 친절하게 패키지화 하고이 모듈 다운로드를 제공 했습니다 . ... Documents \ WindowsPowerShell \ Modules 디렉토리에 압축을 풀고 가져 오기를 계속하십시오.

모듈 방식과 스냅인 방식이 동일하지 않다는 점은 흥미 롭습니다. 그런 다음 실행 스냅인 (snapin)로드하면 Get-PSSnapin( 없이 -registered 매개 변수 넣은 것만 보여주기를) 당신은 SQL 스냅인 (snapin)를 볼 수 있습니다. 반면에 sqlps 모듈을로드하면 Get-PSSnapin로드 된 스냅인이 표시되지 않으므로 스냅인 Invoke-Sqlcmd만 검사 하여 cmdlet 을 테스트하는 다양한 블로그 항목이 거짓 부정 결과를 제공 할 수 있습니다.

2012.10.06 갱신

sqlps 모듈, sqlps 미니 셸 및 SQL Server 스냅인에 대한 전체 스토리를 보려면 최근 Simple-Talk.com에 게시 된 SQL Server 개발자 및 DBA를위한 두 부분으로 구성된 미니 시리즈 Practical PowerShell을 살펴보십시오. 한 독자의 의견에 따르면,이 문제를 성공적으로 "혼란"했습니다. :-)


if(Test-Path "C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS") { #Sql Server 2012
    Import-Module SqlPs -DisableNameChecking
    C: # Switch back from SqlServer
} else { #Sql Server 2008
    Add-PSSnapin SqlServerCmdletSnapin100 # here live Invoke-SqlCmd
}

Invoke-Sqlcmd -InputFile "MySqlScript.sql" -ServerInstance "Database name" -ErrorAction 'Stop' -Verbose -QueryTimeout 1800 # 30min

다음은 SQL 스냅인을로드하기 위해 PowerShell 프로필에있는 함수입니다.

function Load-SQL-Server-Snap-Ins
{
    try 
    {
        $sqlpsreg="HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.SqlServer.Management.PowerShell.sqlps"

        if (!(Test-Path $sqlpsreg -ErrorAction "SilentlyContinue"))
        {
            throw "SQL Server Powershell is not installed yet (part of SQLServer installation)."
        }

        $item = Get-ItemProperty $sqlpsreg
        $sqlpsPath = [System.IO.Path]::GetDirectoryName($item.Path)

        $assemblyList = @(
            "Microsoft.SqlServer.Smo",
            "Microsoft.SqlServer.SmoExtended",
            "Microsoft.SqlServer.Dmf",
            "Microsoft.SqlServer.WmiEnum",
            "Microsoft.SqlServer.SqlWmiManagement",
            "Microsoft.SqlServer.ConnectionInfo ",
            "Microsoft.SqlServer.Management.RegisteredServers",
            "Microsoft.SqlServer.Management.Sdk.Sfc",
            "Microsoft.SqlServer.SqlEnum",
            "Microsoft.SqlServer.RegSvrEnum",
            "Microsoft.SqlServer.ServiceBrokerEnum",
            "Microsoft.SqlServer.ConnectionInfoExtended",
            "Microsoft.SqlServer.Management.Collector",
            "Microsoft.SqlServer.Management.CollectorEnum"
        )

        foreach ($assembly in $assemblyList)
        { 
            $assembly = [System.Reflection.Assembly]::LoadWithPartialName($assembly) 
            if ($assembly -eq $null)
                { Write-Host "`t`t($MyInvocation.InvocationName): Could not load $assembly" }
        }

        Set-Variable -scope Global -name SqlServerMaximumChildItems -Value 0
        Set-Variable -scope Global -name SqlServerConnectionTimeout -Value 30
        Set-Variable -scope Global -name SqlServerIncludeSystemObjects -Value $false
        Set-Variable -scope Global -name SqlServerMaximumTabCompletion -Value 1000

        Push-Location

         if ((Get-PSSnapin -Name SqlServerProviderSnapin100 -ErrorAction SilentlyContinue) -eq $null) 
        { 
            cd $sqlpsPath

            Add-PsSnapin SqlServerProviderSnapin100 -ErrorAction Stop
            Add-PsSnapin SqlServerCmdletSnapin100 -ErrorAction Stop
            Update-TypeData -PrependPath SQLProvider.Types.ps1xml
            Update-FormatData -PrependPath SQLProvider.Format.ps1xml
        }
    } 

    catch 
    {
        Write-Host "`t`t$($MyInvocation.InvocationName): $_" 
    }

    finally
    {
        Pop-Location
    }
}

2008 Server 2008 및 2008 R2 포함

Add-PSSnapin -Name SqlServerCmdletSnapin100, SqlServerProviderSnapin100

2012 년과 2014 년

Push-Location
Import-Module -Name SQLPS -DisableNameChecking
Pop-Location

참고 URL : https://stackoverflow.com/questions/10894688/how-to-execute-sql-file-using-powershell

반응형