在具有条件的循环中使用存储过程的结果

时间:2014-01-24 20:03:53

标签: sql sql-server powershell

我有以下代码,我希望用它来确定服务器上是否有活动查询,并且此逻辑将用于阻止或允许其他事情发生。我在Powershell做这个。

$Active = invoke-sqlcmd "sp_whoisactive" -database $DATABASE -serverinstance $SQLSERVER -verbose 
Foreach($item in $Active){
    If ($item -eq $null) {
        "There is nothing active on the database server."
        }
    Else {
        "There is something active on the database server."
        }
    }

无论是否运行,它都会给我以下警告:

VERBOSE: Warning: Null value is eliminated by an aggregate or other SET operation.

我假设它来自sp_whoisactive的内部。

另一个问题是,如果服务器上没有任何活动,它就不显示消息,所以我不确定逻辑是否实际触发。

为什么要显示这些信息?如何在这种测试中使用该SP的结果?

请注意,我愿意以其他方式执行此操作,问题是我只需要一些可以触发的逻辑来查看服务器上是否存在活动事务。我会使用类似于查看是否存在连接的内容,但始终存在背景连接。我只关心影响表的实际活动事务。

编辑:所以我只是给了另一个想法一个镜头,它似乎有同样的问题,我认为除了标题(没有任何东西在运行时)没有任何返回时该怎么做才会窒息。

$Active = invoke-sqlcmd "sp_whoisactive" -database $DATABASE -serverinstance $SQLSERVER -verbose | Out-String

select-string -InputObject $Active -Pattern "query" -quiet

如果某些内容正在运行,它将返回True(因此我可以在条件检查中使用它)但如果没有运行则不会返回False

1 个答案:

答案 0 :(得分:0)

看起来我需要了解Powershell如何处理空值berrer,我发现使用this链接。

基本上,如果我只是单独留下$Active变量并进行Powershell测试,它就可以了。所以结束代码如下所示:

$Active = invoke-sqlcmd "sp_whoisactive" -database $DATABASE -serverinstance $SQLSERVER     -verbose
    If ($Active) {
        "There is something active on the database server. Stopping."
        }
    Else {
         "There is nothing active on the database server." }

它看起来很有效!