不載入 `SqlServerCmdletSnapin100`,直接用 `System.Data.SqlClient` 命名空間,**任何裝 .NET Framework 的機器即可執行**,適合跳板機、CI/CD Agent、無完整 SQL 管理工具的環境。
function Show-CustomizedDataTable {
$SQLServer = Read-Host "Enter SQL Server Name"
$Database = Read-Host "Enter Database Name"
$CnnString = "Server=$SQLServer;Database=$Database;Integrated Security=True"
$conn = New-Object System.Data.SqlClient.SqlConnection
$conn.ConnectionString = $CnnString
$cmd = New-Object System.Data.SqlClient.SqlCommand
$cmd.CommandText = "SELECT name FROM sysobjects WHERE type='U' ORDER BY name"
$cmd.Connection = $conn
$adapter = New-Object System.Data.SqlClient.SqlDataAdapter
$adapter.SelectCommand = $cmd
$ds = New-Object System.Data.DataSet
$adapter.Fill($ds) | Out-Null
$conn.Close()
$ds.Tables[0] | Format-Table -AutoSize
}
function Get-DataTable {
param([string]$Query, [string]$ConnString)
$ds = New-Object System.Data.DataSet
$da = New-Object System.Data.SqlClient.SqlDataAdapter($Query, $ConnString)
[void]$da.Fill($ds)
return $ds.Tables[0]
}
# 使用範例
$connStr = "Server=.;Database=AdventureWorks;Integrated Security=True"
$dt = Get-DataTable "SELECT TOP 10 * FROM Person.Person" $connStr
$dt | Format-Table -AutoSize
function Invoke-SqlCmdParam {
param([string]$ConnString, [string]$Query, [hashtable]$Params)
$conn = New-Object System.Data.SqlClient.SqlConnection($ConnString)
$cmd = $conn.CreateCommand()
$cmd.CommandText = $Query
foreach ($p in $Params.GetEnumerator()) {
$cmd.Parameters.AddWithValue($p.Key, $p.Value) | Out-Null
}
$conn.Open()
$reader = $cmd.ExecuteReader()
$dt = New-Object System.Data.DataTable
$dt.Load($reader)
$reader.Close()
$conn.Close()
return $dt
}
# 呼叫
$params = @{ '@City' = 'London'; '@MinOrders' = 5 }
$dt = Invoke-SqlCmdParam $connStr "SELECT * FROM Sales.vCustomerOrders WHERE City = @City AND OrderCount >= @MinOrders" $params