【发布时间】:2021-05-12 18:17:37
【问题描述】:
我使用以下 PowerShell 函数对 SQL Server 实例运行任意 SQL 查询,然后返回那里的任何数据:
Function ExecSQLReader([string] $sqlText) {
$cn = New-Object System.Data.SqlClient.SqlConnection
$cn.ConnectionString = "Data Source={0};Initial Catalog={1};Integrated Security=SSPI;" -f $fc.server,$fc.database
$cn.Open()
$cmd = $cn.CreateCommand()
$cmd.CommandText = $sqlText
$cmd.CommandTimeout = 60
$resTable = New-Object("System.Data.DataTable")
try {
$result = $cmd.ExecuteReader()
$resTable.Load($result)
$result.Close()
$cn.Close()
} catch {
"=======ERROR in ExecSQLReader========" | DoLog
"Message: {0}" -f $_.Exception.Message | DoLog
"SQL: {0}" -f $sqlText | DoLog
"=======/ERROR in ExecSQLReader=======" | DoLog
}
return($resTable)
}
当有查询返回数据时,该函数可以正常工作。
但是,当查询没有返回数据时,该函数不会返回任何与列相关的信息。
即使没有数据行,我也需要知道列名/类型/顺序等。
我可以看到返回的值根据结果记录数不同(这使事情变得更加复杂):
- 0 条记录的空结果
- 单个记录的 [DataRow] 对象
- 多于 1 条记录的 [DataRow] 对象集合
那么,问题来了:如何确保返回的对象始终是“System.Data.DataTable”类型?
或者,至少,无论查询返回的行数如何,如何确保与列相关的信息(名称、类型、顺序)始终在函数结果中可用?
有什么提示吗?
【问题讨论】:
标签: sql-server function powershell datatable