如何使用Powershell比较两个SQL表并获取差值

如何使用Powershell比较两个SQL表并获取差值,powershell,invoke-sqlcmd,Powershell,Invoke Sqlcmd,我在SQL Server数据库中有两个表 表1如下所示: ServerName ServiceName ServiceStatus ---------- ----------- ------------- Server1 iis running Server2 sql running Server3 www running ServerName ServiceName Servi

我在SQL Server数据库中有两个表

表1如下所示:

ServerName   ServiceName ServiceStatus
----------   ----------- -------------
Server1      iis         running      
Server2      sql         running      
Server3      www         running 
ServerName   ServiceName ServiceStatus
----------   ----------- -------------
Server1      iis         running      
Server2      sql         Notrunning      
Server3      www         running 
表2如下所示:

ServerName   ServiceName ServiceStatus
----------   ----------- -------------
Server1      iis         running      
Server2      sql         running      
Server3      www         running 
ServerName   ServiceName ServiceStatus
----------   ----------- -------------
Server1      iis         running      
Server2      sql         Notrunning      
Server3      www         running 
我想使用Powershell比较这些表,并获得状态上的差异,因为{在Server2服务上,“sql”状态从“正在运行”更改为“未运行”}

我在下面尝试过,但没有输出。请帮帮我

$SQLServer = "Server1\sql"
$db3 = "test"
$T1data = "SELECT ServerName, ServiceName, ServiceStatus FROM Table1"
$T2data = "SELECT ServerName, ServiceName, ServiceStatus FROM Table2"
$s = Invoke-Sqlcmd -ServerInstance $SQLServer -Database $db3 -Query $T1data 
$p = Invoke-Sqlcmd -ServerInstance $SQLServer -Database $db3 -Query $T2data 
#$q = Compare-Object $p $s -Property servicestatus

Foreach($q in $s.serverName) {
    while ($s.serverName -eq $p.serverName -and $s.servicename -eq $p.servicename ) {
        if($s.servicestatus -ne $p.servicestatus) {
              Write-Output  " On server $s.serverName the service $s.servicename changed from $P.servicestatus to $s.servicestatus " 
        }
    }
}
根据MSSQLStips网站上的阅读:

通过BCP实用程序将表数据转储到文件中,然后获取文件的MD5哈希值进行比较。数据文件格式由-ValueOnly参数控制,如果使用-ValueOnly参数,我们将对BCP.exe使用-c参数(所有列都被视为字符数据类型),否则,我们对BCP.exe使用-n参数(所有列都被视为本机数据类型)。

基于MSSQLSTIPS网站上的阅读:


通过BCP实用程序将表数据转储到文件中,然后获取文件的MD5哈希值进行比较。数据文件格式由-ValueOnly参数控制,如果使用-ValueOnly参数,我们将对BCP.exe使用-c参数(所有列都被视为字符数据类型),否则,我们对BCP.exe使用-n参数(所有列都被视为本机数据类型)。

另一种技术如何,并使用SQL server为您提供差异

SELECT t1.ServerName, t1.ServiceName, t1.ServiceStatus 
FROM Table1 t1
JOIN Table2 t2 on t1.SeverName = t2.ServerName
AND t1.ServiceName = t2.ServiceName 
AND t1.ServiceStatus <> t2.ServiceStatus
选择t1.ServerName、t1.ServiceName、t1.ServiceStatus
来自表1 t1
在t1.SeverName=t2.ServerName上连接表2 t2
和t1.ServiceName=t2.ServiceName
和t1.ServiceStatus t2.ServiceStatus

使用另一种技术,并使用SQL server为您提供差异

SELECT t1.ServerName, t1.ServiceName, t1.ServiceStatus 
FROM Table1 t1
JOIN Table2 t2 on t1.SeverName = t2.ServerName
AND t1.ServiceName = t2.ServiceName 
AND t1.ServiceStatus <> t2.ServiceStatus
选择t1.ServerName、t1.ServiceName、t1.ServiceStatus
来自表1 t1
在t1.SeverName=t2.ServerName上连接表2 t2
和t1.ServiceName=t2.ServiceName
和t1.ServiceStatus t2.ServiceStatus