functions/New-DBSqlObjects.ps1

function New-DBSqlObjects {
    <#
    .SYNOPSIS
        Creates two objects:
        * The first is a custom PSObject, that can be splatted to Invoke-SqlCmd or any other command that takes similar arguments.
        * The second is a type of [Microsoft.SqlServer.Management.Common.ServerConnection] used for SMO connections
 
    .PARAMETER ServerInstance
        The sql server instance to connect to.
 
    .PARAMETER Credentials
        Specifies credentials to connect to the database with. If not supplied then a trusted connection will be used.
 
    .OUTPUTS
        Creates two objects:
        * return.SqlCmdArguments: The first is a custom PSObject, that can be splatted to Invoke-SqlCmd or any other command that takes similar arguments.
        * return.Server: The second is a type of [Microsoft.SqlServer.Management.Common.ServerConnection] used for SMO connections
 
    .EXAMPLE
 
    PS> $objects = New-DBSqlObjects -ServerInstance "ServerName"
    PS> $server = $objects.Server # this is the SMO connection object
    PS> $sqlCmdArguments = $objects.SqlCmdArguments # this object can be splatted to Invoke-SqlCmd or other functions that take the same parameters
 
    .LINK
        https://blog.kieranties.com/2018/03/26/write-information-with-colours
    #>

    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Justification='Not needed')]
    param (
        [string]$ServerInstance,
        [pscredential]$Credentials
    )

    begin {

    }

    process {
        # these sql cmd arguments will be used to splat the Invoke-SqlCmd arguments
        $SqlCmdArguments = @{
            ServerInstance = $ServerInstance
            Database = "master"
        }
        if ($Credentials) {
            $SqlCmdArguments.Add("Credential", $Credentials)
        }

        $serverConnection = New-Object Microsoft.SqlServer.Management.Common.ServerConnection
        $serverConnection.ServerInstance = $ServerInstance
        if ($Credentials) {
            $serverConnection.LoginSecure = $false
            $serverConnection.Login = $Credentials.UserName
            $serverConnection.SecurePassword = $Credentials.Password
        }

        $server = New-Object Microsoft.SqlServer.Management.Smo.Server($serverConnection)
        if ($null -eq $server.Version ) {
            throw "Unable to connect to: $ServerInstance"
            exit 1
        }
    }

    end {
        return [PSCustomObject] @{
            SqlCmdArguments = $SqlCmdArguments
            Server = $server
        }
    }
}