PowerShell执行2个SQL查询并将结果添加到一起
我需要使用Windows身份验证查询SQL Server数据库中的表。查询需要拉取2个值并将结果相加。我有第一部分。我遇到的问题是执行查询并将结果添加到一起。任何帮助都将不胜感激 到目前为止,我所拥有的:PowerShell执行2个SQL查询并将结果添加到一起,sql,sql-server,powershell,Sql,Sql Server,Powershell,我需要使用Windows身份验证查询SQL Server数据库中的表。查询需要拉取2个值并将结果相加。我有第一部分。我遇到的问题是执行查询并将结果添加到一起。任何帮助都将不胜感激 到目前为止,我所拥有的: $date = Get-Date $d = $date.day $m = $date.month $y = $date.year $ServerName = "SERVERNAME" $DatabaseName = "DATABASENAME"
$date = Get-Date
$d = $date.day
$m = $date.month
$y = $date.year
$ServerName = "SERVERNAME"
$DatabaseName = "DATABASENAME"
$Table = "STATSDATA" + $m + "_" + $d + "_" + $y
$Query1 = "SELECT TOP 1 VAL FROM" + $Table +
"WHERE POLLID=16267 ORDER BY TTIME DESC"
$Query2 = "SELECT TOP 1 VAL FROM" + $Table +
"WHERE POLLID=16272 ORDER BY TTIME DESC"
#Timeout parameters
$QueryTimeout = 120
$ConnectionTimeout = 30
#Action of connecting to the Database and executing the query and
returning results if there were any.
$conn = New-Object System.Data.SqlClient.SQLConnection
$ConnectionString = "Server={0};Database={1};Integrated Security=True;Connect Timeout={2}" -f $ServerName,$DatabaseName,$ConnectionTimeout
$conn.ConnectionString = $ConnectionString
$conn.Open()
对其余部分不确定:
$cmd1 = New-Object system.Data.SqlClient.SqlCommand($Query1, $conn)
$cmd2 = New-Object system.Data.SqlClient.SqlCommand($Query2, $conn)
$cmd1.CommandTimeout = $QueryTimeout
$cmd2.CommandTimeout = $QueryTimeout
$ds1 = New-Object system.Data.DataSet
$ds2 = New-Object system.Data.DataSet
$da1 = New-Object system.Data.SqlClient.SqlDataAdapter($cmd1)
$da2 = New-Object system.Data.SqlClient.SqlDataAdapter($cmd2)
[void]$da1.fill($ds1)
[void]$da2.fill($ds2)
$conn.Close()
$ds.Tables
不要执行两个查询,而是只运行一个查询。假设您有两个查询:
$Query1 = "SELECT TOP 1 VAL FROM" + $Table + "WHERE POLLID=16267 ORDER BY TTIME DESC"
$Query2 = "SELECT TOP 1 VAL FROM" + $Table + "WHERE POLLID=16272 ORDER BY TTIME DESC"
可以使用以下语法:
$querySum = "SELECT ($Query1)+($Query2) VAL"
只运行$querySum。只运行一个查询,而不是执行两个查询。假设您有两个查询:
$Query1 = "SELECT TOP 1 VAL FROM" + $Table + "WHERE POLLID=16267 ORDER BY TTIME DESC"
$Query2 = "SELECT TOP 1 VAL FROM" + $Table + "WHERE POLLID=16272 ORDER BY TTIME DESC"
可以使用以下语法:
$querySum = "SELECT ($Query1)+($Query2) VAL"
并且只运行$querySum。严格来说,使用现有代码对您的问题的答案是:
$ds1.Tables[0].Rows[0].Val + $ds2.Tables[0].Rows[0].Val
成员可能是表和行,而不是表和行。我现在记不得了。我的语法可能不完全正确,但本质上这就是你必须要做的。您需要引用数据集中的第一个表,然后是表中的第一行,然后是行中的第一列或Val列。我想你可以用这个专栏的名字
但是,由于每次查询只获取一行中的一列,因此还可以使用SqlCommand.ExecuteScalar函数两次:
$cmd1=New-Object system.Data.SqlClient.SqlCommand($Query1,$conn)
$cmd2=New-Object system.Data.SqlClient.SqlCommand($Query2,$conn)
$cmd1.CommandTimeout=$QueryTimeout
$cmd2.CommandTimeout=$QueryTimeout
$val1 = $cmd1.ExecuteScalar()
$val2 = $cmd2.ExecuteScalar()
$val1 + $val2
就我个人而言,我会使用一个不同的查询,只需运行一次即可获得两个结果:
$Date = Get-Date
$Query = @'
SELECT SUM(VAL) Val
FROM (
SELECT VAL,
ROW_NUMBER() OVER (PARTITION BY POLLID ORDER BY TTIME DESC) RN
FROM STATSDATA{0:m_d_yyyy}
WHERE POLLID IN (16267,16272)
) T
WHERE RN = 1
'@ -f $Date
严格来说,使用现有代码对您的问题的答案是:
$ds1.Tables[0].Rows[0].Val + $ds2.Tables[0].Rows[0].Val
成员可能是表和行,而不是表和行。我现在记不得了。我的语法可能不完全正确,但本质上这就是你必须要做的。您需要引用数据集中的第一个表,然后是表中的第一行,然后是行中的第一列或Val列。我想你可以用这个专栏的名字
但是,由于每次查询只获取一行中的一列,因此还可以使用SqlCommand.ExecuteScalar函数两次:
$cmd1=New-Object system.Data.SqlClient.SqlCommand($Query1,$conn)
$cmd2=New-Object system.Data.SqlClient.SqlCommand($Query2,$conn)
$cmd1.CommandTimeout=$QueryTimeout
$cmd2.CommandTimeout=$QueryTimeout
$val1 = $cmd1.ExecuteScalar()
$val2 = $cmd2.ExecuteScalar()
$val1 + $val2
就我个人而言,我会使用一个不同的查询,只需运行一次即可获得两个结果:
$Date = Get-Date
$Query = @'
SELECT SUM(VAL) Val
FROM (
SELECT VAL,
ROW_NUMBER() OVER (PARTITION BY POLLID ORDER BY TTIME DESC) RN
FROM STATSDATA{0:m_d_yyyy}
WHERE POLLID IN (16267,16272)
) T
WHERE RN = 1
'@ -f $Date
此查询应执行以下操作:
SELECT SUM(VAL) AS sum_val FROM (
SELECT TOP 1 VAL FROM <insert table name here> WHERE POLLID=16267 ORDER BY TTIME DESC
UNION ALL
SELECT TOP 1 VAL FROM <insert table name here> WHERE POLLID=16272 ORDER BY TTIME DESC
) AS X
此查询应执行以下操作:
SELECT SUM(VAL) AS sum_val FROM (
SELECT TOP 1 VAL FROM <insert table name here> WHERE POLLID=16267 ORDER BY TTIME DESC
UNION ALL
SELECT TOP 1 VAL FROM <insert table name here> WHERE POLLID=16272 ORDER BY TTIME DESC
) AS X
你到底有什么问题?你到底有什么问题。。?