Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PowerShell执行2个SQL查询并将结果添加到一起_Sql_Sql Server_Powershell - Fatal编程技术网

PowerShell执行2个SQL查询并将结果添加到一起

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"

我需要使用Windows身份验证查询SQL Server数据库中的表。查询需要拉取2个值并将结果相加。我有第一部分。我遇到的问题是执行查询并将结果添加到一起。任何帮助都将不胜感激

到目前为止,我所拥有的:

    $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

你到底有什么问题?你到底有什么问题。。?