Как сделать так, чтобы массовая копия отображала те же столбцы? - PullRequest
0 голосов
/ 31 января 2019

Предположим, у меня есть таблица SQL, в которой есть следующие столбцы:

[имя_сервера], [SESSION_ID], [SESSION_SPID]

Я пытаюсь скопировать сохраненные значенияв таблице данных ($dmvResult) в таблицу SQL выше ($Table)

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

Во время успешного копирования возникает проблема: копирование выполняется по позиции, а не по имени столбцаматч.Другими словами, скопированные столбцы не отображаются и не копируются в одни и те же столбцы.

[SESSION_ID] копируется в [имя_сервера], а [SESSION_SPID] копируется в [SESSION_ID]

Как я могу настроить bulkCopy для сопоставления столбцов и копирования?

В результате копия [имя_сервера] должна быть пустой, поскольку она не была выбрана в запросе DMV.

Я нашел правильное решение в этой теме:

https://stackoverflow.com/a/20045505/8397835

но я не знаю, как перевести его в мой код PowerShell:

var meta = definition.Context.Mapping.GetMetaType(typeof(T));
        foreach (var col in meta.DataMembers)
        {
            copy.ColumnMappings.Add(col.Member.Name, col.MappedName);
        }

РЕДАКТИРОВАТЬ: foreach column. Выходные данные столбца foreachoutput

EDIT2: я попробовал это:

$dmvResult.Columns |%{$_.Name}

и ничего не выводится.

, прежде чем сказать, что таблица данных $ dmvResult должна быть пустой, объясните, как возможно, что это на самом деле работает и копирует в данные?

$bulkCopy.ColumnMappings.Add('SESSION_ID', 'SESSION_ID')
$bulkCopy.ColumnMappings.Add('SESSION_SPID', 'SESSION_SPID')
$bulkCopy.WriteToServer($dmvResult)

и по какой-то причине выводит это втакже консоль:

consoleoutput

, поэтому таблица данных $ dmvResult четко заполнена.

Я надеялся вместо того, чтобы определять отображение для каждого отдельного столбца, как это:

$bulkCopy.ColumnMappings.Add('SESSION_SPID', 'SESSION_SPID')

вместо этого был бы автоматический вариант, подобный этому:

foreach ($column in $dmvResult.Columns) { $bulkCopy.ColumnMappings.Add($column.ColumnName, $column.ColumnName)}

, но это бросаетисключение:

Исключение, вызывающее «WriteToServer» с аргументом (ами) «1»: «Указанное сопоставление ColumnMapping не совпадает ни с одним столбцом в источнике или месте назначения.»

1 Ответ

0 голосов
/ 01 февраля 2019

Очень странное решение, но мне просто нужно было добавить запятую здесь до $dataset:

,$dataSet.Tables[0]

в функции DMV_Query

, а затем я использовал этот цикл foreach

foreach ($column in $dmvResult.Columns) { $bulkCopy.ColumnMappings.Add($column.ColumnName, $column.ColumnName) > $null }

и это сработало!

теперь оно отображает столбцы автоматически !!

...