Как выбрать из переменной? - PullRequest
0 голосов
/ 31 января 2019

Моя вспомогательная функция для выполнения запроса DMV:

Function DMV_Query($DMV_Query) {
## Prepare the connection string based on information provided
$connectionString = "Provider=msolap;Data Source=$AS_Server;Initial Catalog=$CUBE;"

## Connect to the data source and open
$connection = New-Object System.Data.OleDb.OleDbConnection $connectionString
$command = New-Object System.Data.OleDb.OleDbCommand
$command.Connection = $connection 
$command.CommandText = $DMV_Query 
$connection.Open()

## Fetch the results, and close the connection
$adapter = New-Object System.Data.OleDb.OleDbDataAdapter #$command
$adapter.SelectCommand = $command 
$dataset = New-Object System.Data.DataSet
[void] $adapter.Fill($dataSet)
$connection.Close()

## Return all of the rows from their query
$dataSet.Tables[0]
}

Пример вызова:

$dmvResult = DMV_Query 'SELECT [SESSION_ID], [SESSION_SPID]
                        FROM $SYSTEM.DISCOVER_SESSIONS'
$dmvResult

Пример содержимого, хранящегося в $dmvResult:

PS> $dmvResult | ConvertTo-Csv
"SESSION_ID","SESSION_SPID"     
"D0kl8975r6df65","5567"
"fghu5r67f65","2234"

Я хочу выбрать все столбцы из переменной $dmvResult и вставить их в таблицу SQL.Это способ, которым я могу выбрать из переменной?

# Doesn't work.

INSERT INTO [dbo].[Table]
SELECT * FROM @dmvResult

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Примечание. Ответ ниже может быть интересен в качестве упражнения в расширенной интерполяции строк в PowerShell , но, учитывая, что $dmvResult содержит строки существующего объекта DataTable, возвращенные из предыдущего запроса,использование операции массового копирования проще и намного эффективнее, как обнаружили сами Cataster : см. этот пост .


Похоже, вы пытаетесь создать инструкцию T-SQL, создав в PowerShell строку, которая включает в себя результат предыдущего запроса $dmvResult.

Поскольку T-SQL ничего не знает о PowerShellпеременных, вам необходимо явно включить все значения , чтобы передать их INSERT INTO в оператор string .

Вот пример, основанный на вашихпример данных с использованием мощных расширяемых строк PowerShell (интерполяция строк; для справки см. этот ответ ):

# Sample query result / imported CSV.
$dmvResult =
  [pscustomobject] @{ SESSION_ID = 'D0kl8975r6df65'; SESSION_SPID = 5567 },
  [pscustomobject] @{ SESSION_ID = 'fghu5r67f65'; SESSION_SPID = 2234 }

# Construct the INSERT INTO statement from $dmvResult, using an expandable
# string ("..." with $variable and $(<command> references))
$insertStatement = @"
INSERT INTO [dbo].[Table]
  ($($dmvResult[0].psobject.properties.name -join ', '))
VALUES
  $(
    @(foreach ($obj in $dmvResult) {
      $values = foreach ($value in $obj.psobject.properties.value) {
        if ($value -is [string]) { "`"$value`"" } else { $value }
      }
      '(' + ($values -join ', ') + ')'
    }) -join ",`n  "
  )
"@

# Output the constructed statement string.
$insertStatement

Обратите внимание, чтоstringificationзначения свойств, возможно, придется сделать более сложными, в зависимости от ваших данных;Приведенный выше код различает только строковые и нестроковые: первые строковые с включением "...", последние как есть.

Выше приведено:

INSERT INTO [dbo].[Table]
  (SESSION_ID, SESSION_SPID)
VALUES
  ("D0kl8975r6df65", 5567),
  ("fghu5r67f65", 2234)
0 голосов
/ 01 февраля 2019

Я нашел решение, BulkCopy!

$dmvResult = DMV_Query 'SELECT [SESSION_ID]
      ,[SESSION_SPID]
FROM $SYSTEM.DISCOVER_SESSIONS';

$ConnectionString ='Data Source=$server; Database=$database; Trusted_Connection=True;'
$bulkCopy = new-object Data.SqlClient.SqlBulkCopy($ConnectionString)
$bulkCopy.DestinationTableName=$Table
$bulkCopy.WriteToServer($dmvResult)

Это, однако, неправильно отображает столбцы, если они не в порядке, так как BulkCopy копирует по позиции, а не по названию, совпадает

0 голосов
/ 31 января 2019

Используйте запрос, как показано ниже, Не сохраняйте значение в переменной.

INSERT INTO [dbo].[Table]
SELECT [SESSION_ID]
      ,[SESSION_SPID]`enter code here`
FROM $SYSTEM.DISCOVER_SESSIONS
...