假设我有一个包含以下列的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查询中选择它。
我在此线程中找到了一个整洁的解决方案:
但是我不知道如何将其转换为我的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)
出于某种原因,它也将其输出到控制台:
{{3}}
因此清楚地填充了数据表$ dmvResult。
我希望不要像这样为每列定义映射:
$bulkCopy.ColumnMappings.Add('SESSION_SPID', 'SESSION_SPID')
相反,会有这样的自动选项:
foreach ($column in $dmvResult.Columns) { $bulkCopy.ColumnMappings.Add($column.ColumnName, $column.ColumnName)}
但是会引发异常:
使用“ 1”参数调用“ WriteToServer”的异常:“给定 ColumnMapping与源或 目的地。”
答案 0 :(得分:0)
一个非常奇怪的解决方案,但是我只需要在$dataset
之前在此处添加逗号:
,$dataSet.Tables[0]
在DMV_Query函数中
然后我用这个foreach循环
foreach ($column in $dmvResult.Columns) { $bulkCopy.ColumnMappings.Add($column.ColumnName, $column.ColumnName) > $null }
成功了!
现在它会自动映射列!!