在Powershell脚本中,我使用SqlConnection和SqlCommand在SQL Server上执行查询,并将结果加载到DataTable中,例如:
$sqlconn = New-Object System.Data.SqlClient.SqlConnection "Server=.;Integrated Security=true;Initial Catalog=master"
$sqlconn.Open()
$sqlcmd = $sqlConn.CreateCommand()
$sqlcmd.CommandText = "EXEC sp_WhoIsActive @find_block_leaders=1,@get_outer_command=1,@get_transaction_info=1,@get_task_info=2,@get_additional_info=1,@get_plans=1"
$dt = New-Object System.Data.DataTable
$dt.Load($sqlcmd.ExecuteReader())
以前,它可以按预期运行。我可以操纵DataTable,将其输出到HTML文件,然后根据特定行和列的值执行其他操作...,等等。但是稍后,我在输出HTML文件之前插入以下代码,但它不起作用:< / p>
if(($dt.Rows.Count -gt 0) -and ($dt.Rows[0]["sql_text"] -match 'someTable\.someColumn=(\d+)')) {
$sqlconn.ChangeDatabase("someDB")
$sqlcmd.CommandText = "SELECT name FROM anotherTable WHERE id=$($Matches[1])"
$dt.Rows[0]["sql_text"] = $dt.Rows[0]["sql_text"] + "`n" + "--" + $sqlcmd.ExecuteScalar()
}
您可以看到我想做的是:如果DataTable不为空并且第一行的“ sql_text”列与特定的regex模式匹配,请在另一个表中查找匹配的值以获取其他数据,并追加将该数据字符串返回到第一行的“ sql_text”列中。
Powershell说:
無法編制 System.Data.DataRow 型別物件的索引。
位於 F:\jobs\WhoIsActive.ps1:101 字元:17
+ $dt.Rows[0][ <<<< "sql_text"] = $dt.Rows[0]["sql_text"] + "`n" + "--" + $
sqlcmd.ExecuteScalar()
+ CategoryInfo : InvalidOperation: (sql_text:String) [], RuntimeE
xception
+ FullyQualifiedErrorId : CannotIndex
我在繁体中文环境中,所以很不幸,我不知道英文的确切中文部分。据我所知,它可能是“无法在System.Data.DataRow类型的对象中建立索引。”
我不明白为什么它无法访问$dt.Rows[0]
的“ sql_text”索引。它只是在if(($dt.Rows.Count ...
行,不是吗?