如何使bulkCopy映射相同的列?

时间:2019-01-31 20:40:14

标签: sql-server powershell dmv

假设我有一个包含以下列的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]被复制到[server_name],并且 [SESSION_SPID]正在复制到[SESSION_ID]

如何告诉bulkCopy匹配列并进行复制?

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

我在此线程中找到了一个整洁的解决方案:

foreachoutput

但是我不知道如何将其转换为我的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输出 consoleoutput

EDIT2: 我试过了:

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

,它不输出任何内容。

在您说$ dmvResult数据表必须为空之前,请解释一下这怎么可能真正起作用并复制到数据中?

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

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

{{3}}

因此清楚地填充了数据表$ dmvResult。

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

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

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

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

但是会引发异常:

  

使用“ 1”参数调用“ WriteToServer”的异常:“给定   ColumnMapping与源或   目的地。”

1 个答案:

答案 0 :(得分:0)

一个非常奇怪的解决方案,但是我只需要在$dataset之前在此处添加逗号:

,$dataSet.Tables[0]

在DMV_Query函数中

然后我用这个foreach循环

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

成功了!

现在它会自动映射列!!