Public/New-Database.ps1

function New-Database {

    <#
 
    .SYNOPSIS
    Creates a new database and returns the connection parameters.
 
    .DESCRIPTION
    Creates a database for temporary use on an existing SQL Server instance. The returned object includes the
    instance connection for later database removal. Use -Connected to also open and return a database connection.
 
    .EXAMPLE
    PS> $instance = New-SqlTestInstance
    PS> $instanceConnection = $instance | Connect-TSqlInstance
    PS> $database = New-SqlTestDatabase -Instance $instance -InstanceConnection $instanceConnection
    Creates a temporary database on the SQL Server instance.
    Captured output (temporary database and instance names redacted):
 
    Name : test-<redacted>
    Version : 15.0.4382.1
    DataSource : (LocalDb)\test-<redacted>
    ConnectTimeout : 30
    InitialCatalog : test-<redacted>
    ConnectionString : Data Source=(LocalDb)\test-<redacted>;Connect Timeout=30;Integrated Security=True;Initial Catalog=test-<redacted>
 
    PS> $database | Remove-SqlTestDatabase
    PS> Disconnect-TSqlInstance -Connection $instanceConnection
    PS> $instance | Remove-SqlTestInstance
    Removes the database, closes the instance connection, and removes the server instance.
 
    .LINK
    https://abbgrade.github.io/PsSqlTestServer/docs/New-SqlTestDatabase.html
 
    #>


    [CmdletBinding(SupportsShouldProcess)]
    param (
        # Specifies the instance, to create the database in.
        [Parameter( Mandatory, ValueFromPipeline )]
        [ValidateNotNullOrEmpty()]
        [PsObject] $Instance,

        # Specifies an open SQL connection to the instance.
        [Parameter( Mandatory, ValueFromPipelineByPropertyName )]
        [ValidateNotNullOrEmpty()]
        [Alias('Connection')]
        [Microsoft.Data.SqlClient.SqlConnection] $InstanceConnection,

        # Specifies the name of the database to create.
        [Parameter()]
        [ValidateNotNullOrEmpty()]
        [string] $Name = ( New-DatabaseName ),

        # Specifies whether a SqlClient connection should be created.
        [Parameter()]
        [switch] $Connected
    )

    process {
        if ( -not $PSCmdlet.ShouldProcess($Name, 'Create SQL database') ) {
            return
        }

        $Database = $Instance.PsObject.Copy()
        $Database | Add-Member InstanceName $Database.Name
        $Database.Name = $Name

        Invoke-TSqlCommand "CREATE DATABASE [$Name]" -Connection $InstanceConnection

        $Database | Add-Member InitialCatalog $Name
        $Database.ConnectionString = New-SqlConnectionString `
            -ConnectionString $Database.ConnectionString `
            -InitialCatalog $Database.InitialCatalog
        $Database | Add-Member InstanceConnection $InstanceConnection

        # connect instance if needed
        if ( $Connected.IsPresent ) {
            $DatabaseConnection = $Database | Connect-TSqlInstance
            if ( $DatabaseConnection | Test-TSqlConnection ) {
                $Database.Connection = $DatabaseConnection
            } else {
                Write-Error "Failed to connect database."
            }
        }

        Write-Output $Database
    }
}