如何使 bulkCopy 映射相同的列?

How can I make bulkCopy map the same columns?

假设我有一个 SQL Table 包含这些列:

[server_name],[SESSION_ID],[SESSION_SPID]

我正在尝试将存储在数据 table ($dmvResult) 中的值复制到上面的 SQL Table ($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] 被复制到 [server_name] 并且 [SESSION_SPID] 正在复制到 [SESSION_ID]

如何让 bulkCopy 匹配列并复制?

结果副本应该是 [server_name] 是空的,因为它不是从 DMV 查询中选择的。

我在这个帖子中找到了一个巧妙的解决方案:

但我不知道如何将它翻译成我的 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.ColumnName 输出

编辑2: 我试过这个:

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

它没有输出任何东西。

在你说 $dmvResult 数据 table 必须为空之前,解释一下这怎么可能实际工作并复制数据?

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

出于某种原因,它也将其输出到控制台:

因此数据 table $dmvResult 已明确填充。

我希望不要像这样为每一列定义映射:

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

相反会有这样的自动选项:

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

但这会抛出异常:

Exception calling "WriteToServer" with "1" argument(s): "The given ColumnMapping does not match up with any column in the source or destination."

一个非常奇怪的解决方案,但我只需要在 $dataset:

之前在这里添加一个逗号
,$dataSet.Tables[0]

在DMV_Query函数中

然后我使用了这个 foreach 循环

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

成功了!

它现在自动映射列!!