PowerShell выполняет 2 SQL-запроса и добавляет результаты вместе - PullRequest
0 голосов
/ 25 сентября 2018

Мне нужно запросить таблицу в базе данных SQL Server с использованием аутентификации Windows.Запрос должен получить 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

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Строго говоря, ответ на ваш вопрос с существующим кодом:

$ds1.Tables[0].Rows[0].Val + $ds2.Tables[0].Rows[0].Val

Членами могут быть Table и Row вместо Tables и Rows.Я не могу вспомнить в данный момент.Мой синтаксис может быть не совсем правильным, но по сути это то, что вы должны сделать.Вам нужно сослаться на первую таблицу в наборе данных, затем на первую строку в таблице, а затем на первый столбец (или столбец 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
0 голосов
/ 25 сентября 2018

Этот запрос должен сделать это:

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
0 голосов
/ 25 сентября 2018

Вместо того, чтобы выполнить два запроса, запустите только один.Предполагая, что у вас есть два запроса:

 $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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...