假设我有一个SQL表,其中包含以下列:
server_name,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查询中选择的。
我在这个线程中找到了一个很好的解决方案:
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.ColumnName输出

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)}但这引发了异常:
使用"1“参数调用"WriteToServer”的异常:“给定的ColumnMapping与源或目标中的任何列不匹配。”
发布于 2019-02-01 01:11:41
一个非常奇怪的解决方案,但我只是在$dataset之前添加了一个逗号
,$dataSet.Tables[0]在DMV_Query函数中
然后我用了这个前奏循环
foreach ($column in $dmvResult.Columns) { $bulkCopy.ColumnMappings.Add($column.ColumnName, $column.ColumnName) > $null }而且起作用了!
它现在自动映射列!!
https://stackoverflow.com/questions/54468889
复制相似问题