Private/smgSql.ps1

<#
    SqlClient-Hilfsfunktionen. Bewusst ohne dbatools: der Generator braucht nur Metadaten
    und soll auch auf Servern ohne PSGallery-Zugang sofort laufen.
#>


function New-smgConnectionString {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)][string]$SqlInstance,
        [string]$Database = 'master',
        [System.Management.Automation.PSCredential]$SqlCredential,
        [bool]$TrustServerCertificate = $true
    )
    $b = New-Object System.Data.SqlClient.SqlConnectionStringBuilder
    $b['Data Source']      = $SqlInstance
    $b['Initial Catalog']  = $Database
    $b['Application Name'] = 'sqmMergeGenerator'
    $b['Connect Timeout']  = 15
    if ($SqlCredential) {
        $b['User ID']  = $SqlCredential.UserName
        $b['Password'] = $SqlCredential.GetNetworkCredential().Password
    } else {
        $b['Integrated Security'] = $true
    }
    $b['TrustServerCertificate'] = $TrustServerCertificate
    $b.ConnectionString
}

function Set-smgConnectionDatabase {
    param([Parameter(Mandatory)][string]$ConnectionString, [Parameter(Mandatory)][string]$Database)
    $b = New-Object System.Data.SqlClient.SqlConnectionStringBuilder $ConnectionString
    $b['Initial Catalog'] = $Database
    $b.ConnectionString
}

function Invoke-smgSqlQuery {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)][string]$ConnectionString,
        [Parameter(Mandatory)][string]$Query,
        [hashtable]$Parameters,
        [switch]$NonQuery,
        [int]$CommandTimeout = 60
    )
    $conn = New-Object System.Data.SqlClient.SqlConnection $ConnectionString
    try {
        $conn.Open()
        $cmd = $conn.CreateCommand()
        $cmd.CommandText    = $Query
        $cmd.CommandTimeout = $CommandTimeout
        if ($Parameters) {
            foreach ($k in $Parameters.Keys) {
                $v = $Parameters[$k]
                if ($null -eq $v) { $v = [DBNull]::Value }
                [void]$cmd.Parameters.AddWithValue("@$k", $v)
            }
        }
        if ($NonQuery) { return $cmd.ExecuteNonQuery() }

        $table   = New-Object System.Data.DataTable
        $adapter = New-Object System.Data.SqlClient.SqlDataAdapter $cmd
        [void]$adapter.Fill($table)
        foreach ($row in $table.Rows) {
            $o = [ordered]@{}
            foreach ($col in $table.Columns) {
                $val = $row[$col]
                $o[$col.ColumnName] = if ($val -is [DBNull]) { $null } else { $val }
            }
            [pscustomobject]$o
        }
    } finally {
        $conn.Dispose()
    }
}

function ConvertTo-smgQuotedName {
    param([Parameter(Mandatory)][AllowEmptyString()][string]$Name)
    '[' + $Name.Replace(']', ']]') + ']'
}