Предположим, у меня есть таблица 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. Выходные данные столбца
EDIT2: я попробовал это:
$dmvResult.Columns |%{$_.Name}
и ничего не выводится.
, прежде чем сказать, что таблица данных $ dmvResult должна быть пустой, объясните, как возможно, что это на самом деле работает и копирует в данные?
$bulkCopy.ColumnMappings.Add('SESSION_ID', 'SESSION_ID')
$bulkCopy.ColumnMappings.Add('SESSION_SPID', 'SESSION_SPID')
$bulkCopy.WriteToServer($dmvResult)
и по какой-то причине выводит это втакже консоль:
, поэтому таблица данных $ dmvResult четко заполнена.
Я надеялся вместо того, чтобы определять отображение для каждого отдельного столбца, как это:
$bulkCopy.ColumnMappings.Add('SESSION_SPID', 'SESSION_SPID')
вместо этого был бы автоматический вариант, подобный этому:
foreach ($column in $dmvResult.Columns) { $bulkCopy.ColumnMappings.Add($column.ColumnName, $column.ColumnName)}
, но это бросаетисключение:
Исключение, вызывающее «WriteToServer» с аргументом (ами) «1»: «Указанное сопоставление ColumnMapping не совпадает ни с одним столбцом в источнике или месте назначения.»