functions/new-bacpacv2.ps1

function New-BacPacv2 {
    [CmdletBinding(DefaultParameterSetName = 'Default')]
    param (
        [Parameter(Mandatory = $false, ParameterSetName = 'Default', Position = 1 )]            
        [Parameter(Mandatory = $false, ParameterSetName = 'RawBacpacOnly', Position = 1 )]            
        [ValidateSet('FromSql', 'FromAzure')]
        [string] $ExecutionMode = 'FromSql',

        [Parameter(Mandatory = $false, ParameterSetName = 'Default', Position = 2 )]        
        [Parameter(Mandatory = $false, ParameterSetName = 'RawBacpacOnly', Position = 2 )]        
        [Alias('AzureDB')]
        [string]$DatabaseServer = $Script:DatabaseServer,

        [Parameter(Mandatory = $false, ParameterSetName = 'Default', Position = 3 )]
        [Parameter(Mandatory = $false, ParameterSetName = 'RawBacpacOnly', Position = 3 )]
        [string]$DatabaseName = $Script:DatabaseName,

        [Parameter(Mandatory = $false, ParameterSetName = 'Default', Position = 4 )]
        [Parameter(Mandatory = $false, ParameterSetName = 'RawBacpacOnly', Position = 4 )]        
        [string]$SqlUser = $Script:DatabaseUserName,

        [Parameter(Mandatory = $false, ParameterSetName = 'Default', Position = 5 )]
        [Parameter(Mandatory = $false, ParameterSetName = 'RawBacpacOnly', Position = 5 )]        
        [string]$SqlPwd = $Script:DatabaseUserPassword,

        [Parameter(Mandatory = $true, ParameterSetName = 'Default', Position = 6 )]
        [string]$BackupDirectory = "C:\Temp",

        [Parameter(Mandatory = $true, ParameterSetName = 'Default', Position = 7 )]        
        [string]$NewDatabaseName,

        [Parameter(Mandatory = $true, ParameterSetName = 'Default', Position = 8 )]
        [Parameter(Mandatory = $true, ParameterSetName = 'RawBacpacOnly' )]
        [string]$BacpacDirectory = "C:\Temp",      

        [Parameter(Mandatory = $false, ParameterSetName = 'Default', Position = 9 )]
        [Parameter(Mandatory = $false, ParameterSetName = 'RawBacpacOnly', Position = 6 )]        
        [string]$BacpacName = $Script:DatabaseName,

        [Parameter(Mandatory = $false, ParameterSetName = 'RawBacpacOnly' )]        
        [switch]$RawBacpacOnly 

    )
    
    $sqlmode = $false
    $azuremode = $false

    $sqlPackagePath = $Script:SqlPackage

    if ([System.IO.File]::Exists($sqlPackagePath) -ne $True) {
        Write-Host "The sqlpackage.exe is not present on the system. This is an important part of making the bacpac file. Please install latest SQL Server Management Studio on the machine and run the cmdlet again. `r`nVisit this link:`r`ndocs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms" -ForegroundColor Yellow
        Write-Host "The sqlpackage.exe is expected to be found at this location: " -ForegroundColor Yellow 
        Write-Host $sqlPackagePath -ForegroundColor Yellow 
        Write-Error "The sqlpackage.exe is missing on the system." -ErrorAction Stop
    }

    $StartTime = Get-Date

    if ((Test-path $BackupDirectory) -eq $false) {$null = new-item -ItemType directory -path $BackupDirectory }
    if ((Test-path $BacpacDirectory) -eq $false) {$null = new-item -ItemType directory -path $BacpacDirectory }

    if ($ExecutionMode.ToLower() -eq "FromSql".ToLower()) {
        $sqlmode = $true
    }
    else {
        $azuremode = $true
    }

    if ($RawBacpacOnly.IsPresent) {
        Invoke-SqlPackage $DatabaseServer $DatabaseName $SqlUser $SqlPwd (Join-Path $BacpacDirectory "$BacpacName.bacpac")
    }
    else {
        $bacpacPath = (Join-Path $BacpacDirectory "$BacpacName.bacpac")

        if ($sqlmode) {
            Invoke-SqlBackupRestore $DatabaseServer $DatabaseName $SqlUser $SqlPwd $NewDatabaseName
            
            Invoke-ClearSqlSpecificObjects $DatabaseServer $NewDatabaseName $SqlUser $SqlPwd 

            Invoke-SqlPackage $DatabaseServer $NewDatabaseName $SqlUser $SqlPwd $bacpacPath

            Remove-Database -DatabaseServer $DatabaseServer -DatabaseName $NewDatabaseName -SqlUser $SqlUser -SqlPwd $SqlPwd

            $bacpacPath
        }
        else {
            Invoke-AzureBackupRestore $DatabaseServer $DatabaseName $SqlUser $SqlPwd $NewDatabaseName

            Invoke-ClearAzureSpecificObjects $DatabaseServer $NewDatabaseName $SqlUser $SqlPwd 

            Invoke-SqlPackage $DatabaseServer $NewDatabaseName $SqlUser $SqlPwd $bacpacPath

            Remove-Database -DatabaseServer $DatabaseServer -DatabaseName $NewDatabaseName -SqlUser $SqlUser -SqlPwd $SqlPwd

            $bacpacPath
        }
    }
}