admin/sql.ps1

function sql-delete-database {
    Param (
        [Parameter(Mandatory = $true)][string] $dbName
    )

    $Databases = Invoke-SQLcmd -ServerInstance $GLOBAL:Sf.config.sqlServerInstance -Query ("SELECT * from sys.databases where NAME = '$dbName'") -Username $GLOBAL:Sf.config.sqlUser -Password $GLOBAL:Sf.config.sqlPass

    ForEach ($Database in $Databases) { 
        Invoke-SQLcmd -ServerInstance $GLOBAL:Sf.config.sqlServerInstance -Query (
            "alter database [" + $Database.Name + "] set single_user with rollback immediate
            DROP DATABASE ["
 + $Database.Name + "]") -Username $GLOBAL:Sf.config.sqlUser -Password $GLOBAL:Sf.config.sqlPass
    }
}

function sql-rename-database {
    Param (
        [Parameter(Mandatory = $true)][string] $oldName,
        [Parameter(Mandatory = $true)][string] $newName
    )

    $Databases = Invoke-SQLcmd -ServerInstance $GLOBAL:Sf.config.sqlServerInstance -Query ("SELECT * from sys.databases where NAME = '$oldName'") -Username $GLOBAL:Sf.config.sqlUser -Password $GLOBAL:Sf.config.sqlPass

    ForEach ($Database in $Databases) { 
        Invoke-SQLcmd -ServerInstance $GLOBAL:Sf.config.sqlServerInstance -Query (
            "alter database [" + $Database.Name + "] set single_user with rollback immediate
            EXEC sp_renamedb '$oldName', '$newName'
            ALTER DATABASE [$newName] SET MULTI_USER"
) -Username $GLOBAL:Sf.config.sqlUser -Password $GLOBAL:Sf.config.sqlPass
    }
}

function sql-get-dbs {
    $Databases = Invoke-SQLcmd -ServerInstance $GLOBAL:Sf.config.sqlServerInstance -Query ("SELECT * from sys.databases") -Username $GLOBAL:Sf.config.sqlUser -Password $GLOBAL:Sf.config.sqlPass

    return $Databases
}

function sql-get-items {
    Param($dbName, $tableName, $selectFilter, $whereFilter)

    $result = Invoke-SQLcmd -ServerInstance $GLOBAL:Sf.config.sqlServerInstance -Query ("
        SELECT $selectFilter
        FROM [${dbName}].[dbo].[${tableName}]
        WHERE $whereFilter"
) -Username $GLOBAL:Sf.config.sqlUser -Password $GLOBAL:Sf.config.sqlPass

    return $result
}

function sql-update-items {
    Param($dbName, $tableName, $value, $whereFilter)

    $result = Invoke-SQLcmd -ServerInstance $GLOBAL:Sf.config.sqlServerInstance -Query "
        UPDATE [${dbName}].[dbo].[${tableName}]
        SET ${value}
        WHERE $whereFilter"
 -Username $GLOBAL:Sf.config.sqlUser -Password $GLOBAL:Sf.config.sqlPass

    return $result
}

function sql-insert-items {
    Param(
        $dbName, $tableName, $columns, $values
    )

    $result = Invoke-SQLcmd -ServerInstance $GLOBAL:Sf.config.sqlServerInstance -Query "
        INSERT INTO [${dbName}].[dbo].[${tableName}] ($columns)
        VALUES (${values})"
 -Username $GLOBAL:Sf.config.sqlUser -Password $GLOBAL:Sf.config.sqlPass

    return $result
}

function sql-delete-items {
    Param($dbName, $tableName, $whereFilter)

    Invoke-SQLcmd -ServerInstance $GLOBAL:Sf.config.sqlServerInstance -Query ("
        DELETE FROM [${dbName}].[dbo].[${tableName}]
        WHERE $whereFilter"
) -Username $GLOBAL:Sf.config.sqlUser -Password $GLOBAL:Sf.config.sqlPass
}

function sql-test-isDbNameDuplicate {
    Param(
        [string]$dbName
    )

    $existingDbs = @(sql-get-dbs -user $GLOBAL:Sf.config.sqlUser -pass $GLOBAL:Sf.config.sqlPass -sqlServerInstance $GLOBAL:Sf.config.sqlServerInstance)
    $exists = $false
    ForEach ($db in $existingDbs) {
        if ($db.name -eq $dbName) {
            $exists = $true
            break;
        }
    }

    return $exists
}

function sql-copy-db {
    Param(
        [string]$SourceDBName, 
        [string]$targetDbName
    )
    #import SQL Server module

    #your SQL Server Instance Name
    $connection = [Microsoft.SqlServer.Management.Common.ServerConnection]::new()
    $connection.ServerInstance = $GLOBAL:Sf.config.sqlServerInstance
    $connection.LoginSecure = $false
    $connection.Login = $GLOBAL:Sf.config.sqlUser
    $connection.Password = $GLOBAL:Sf.config.sqlPass
    $Server = [Microsoft.SqlServer.Management.Smo.Server]::new($connection)

    #create SMO handle to your database
    $SourceDB = $Server.Databases[$SourceDBName]

    #create a database to hold the copy of your source database
    $CopyDBName = $targetDbName
    $CopyDB = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Database -ArgumentList $Server , $CopyDBName
    $CopyDB.Create()

    #Use SMO Transfer Class by specifying source database
    #you can specify properties you want either brought over or excluded, when the copy happens
    $ObjTransfer = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Transfer -ArgumentList $SourceDB
    $ObjTransfer.CopyAllTables = $true
    $ObjTransfer.CopyAllObjects = $true
    $ObjTransfer.Options.WithDependencies = $true
    $ObjTransfer.Options.ContinueScriptingOnError = $true
    $ObjTransfer.Options.Indexes = $true
    $ObjTransfer.Options.DriIndexes = $true
    $ObjTransfer.Options.DriPrimaryKey = $true
    $ObjTransfer.Options.DriUniqueKeys = $true
    $ObjTransfer.Options.Default = $true
    $ObjTransfer.Options.DriDefaults = $true
    $ObjTransfer.Options.DriAllKeys = $true
    $ObjTransfer.Options.DriAllConstraints = $true
    $ObjTransfer.Options.DriForeignKeys = $true
    $ObjTransfer.DestinationDatabase = $CopyDBName
    $ObjTransfer.DestinationServer = $GLOBAL:Sf.config.sqlServerInstance
    $ObjTransfer.DestinationLoginSecure = $false
    $ObjTransfer.CopySchema = $true
    $ObjTransfer.DestinationLogin = $GLOBAL:Sf.config.sqlUser
    $ObjTransfer.DestinationPassword = $GLOBAL:Sf.config.sqlPass

    #if you wish to just generate the copy script
    #just script out the transfer
    $ObjTransfer.ScriptTransfer()

    #When you are ready to bring the data and schema over,
    #you can use the TransferData method
    $ObjTransfer.TransferData()
}