首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使bulkCopy映射相同的列?

如何使bulkCopy映射相同的列?
EN

Stack Overflow用户
提问于 2019-01-31 20:40:14
回答 1查看 2.6K关注 0票数 1

假设我有一个SQL表,其中包含以下列:

server_name,SESSION_ID,SESSION_SPID

我正在尝试将存储在数据表($dmvResult)中的值复制到上面的SQL ($Table)。

代码语言:javascript
复制
$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查询中选择的。

我在这个线程中找到了一个很好的解决方案:

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

但我不知道如何将其转换为我的powershell代码:

代码语言:javascript
复制
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输出

EDIT2:我试过这个:

代码语言:javascript
复制
$dmvResult.Columns |%{$_.Name}

而且它没有输出任何东西。

在您说$dmvResult数据表必须为空之前,请解释这是如何在数据中实际工作和复制的?

代码语言:javascript
复制
$bulkCopy.ColumnMappings.Add('SESSION_ID', 'SESSION_ID')
$bulkCopy.ColumnMappings.Add('SESSION_SPID', 'SESSION_SPID')
$bulkCopy.WriteToServer($dmvResult)

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

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

我希望不是为这样的每一列定义映射:

代码语言:javascript
复制
$bulkCopy.ColumnMappings.Add('SESSION_SPID', 'SESSION_SPID')

相反,会有这样的假设性的选择:

代码语言:javascript
复制
foreach ($column in $dmvResult.Columns) { $bulkCopy.ColumnMappings.Add($column.ColumnName, $column.ColumnName)}

但这引发了异常:

使用"1“参数调用"WriteToServer”的异常:“给定的ColumnMapping与源或目标中的任何列不匹配。”

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-01 01:11:41

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

代码语言:javascript
复制
,$dataSet.Tables[0]

在DMV_Query函数中

然后我用了这个前奏循环

代码语言:javascript
复制
foreach ($column in $dmvResult.Columns) { $bulkCopy.ColumnMappings.Add($column.ColumnName, $column.ColumnName) > $null }

而且起作用了!

它现在自动映射列!!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54468889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档