Sql server 如何使bulkCopy映射到相同的列?
假设我有一个包含以下列的SQL表: [服务器名称],[会话ID],[会话SPID] 我正在尝试将存储在数据表(Sql server 如何使bulkCopy映射到相同的列?,sql-server,powershell,dmv,Sql Server,Powershell,Dmv,假设我有一个包含以下列的SQL表: [服务器名称],[会话ID],[会话SPID] 我正在尝试将存储在数据表($dmvResult)中的值复制到上面的SQL表($table) 复制成功后,出现了一个问题:它是按位置而不是按列名匹配进行复制的。换句话说,复制的列不会映射并复制到相同的列 正在将[SESSION_ID]复制到[server_name]并 [会话\u SPID]正在复制到[会话\u ID] 如何让bulkCopy与列和副本匹配 结果副本应该是空的[server_name],因为它不是从
$dmvResult
)中的值复制到上面的SQL表($table
)
复制成功后,出现了一个问题:它是按位置而不是按列名匹配进行复制的。换句话说,复制的列不会映射并复制到相同的列
正在将[SESSION_ID]复制到[server_name]并
[会话\u SPID]正在复制到[会话\u 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数据表必须为空之前,请解释一下这实际上是如何工作的并在数据中复制的
$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)}
相反,会有这样的自动选项:
$bulkCopy.ColumnMappings.Add('SESSION_SPID', 'SESSION_SPID')
foreach ($column in $dmvResult.Columns) { $bulkCopy.ColumnMappings.Add($column.ColumnName, $column.ColumnName)}
但这带来了一个例外:
使用“1”参数调用“WriteToServer”时出现异常:“给定的
ColumnMapping与源或中的任何列都不匹配
目的地。”
这是一个非常奇怪的解决方案,但我必须在
$dataset
之前在这里添加一个逗号:
,$dataSet.Tables[0]
在DMV_查询函数中
然后我使用了这个foreach循环
foreach ($column in $dmvResult.Columns) { $bulkCopy.ColumnMappings.Add($column.ColumnName, $column.ColumnName) > $null }
成功了
现在它会自动映射列 当然,构建一个列映射。这就像bulkCopy类中唯一的其他方法。我不知道如何翻译成PS为您虽然。类似于
$bulkCopy.ColumnMappings.Add($col1,$col2)
也许?@JacobH darn,我希望有一个自动映射选项。但我似乎必须明确定义列:/@JacobH我用一个链接更新了我的线程,该链接指向一个我认为是自动映射的答案,尽管我不确定如何将其从c转换为powershell。哦,有自动映射——它将按顺序位置自动映射所有列。是的,这是愚蠢的,它可以专门处理DataTable
的情况,但事实并非如此foreach($dmvResult.Columns中的column){$bulkCopy.ColumnMappings.Add($column.ColumnName,$column.ColumnName)}
应该这样做。(免责声明:未测试。)在循环中插入写入输出$column.ColumnName
,以调试此操作。列名可能与您期望的不太一样,特别是如果(我怀疑)这是一个从SSAS生成结果的查询,它有修饰列名的倾向。如果数据库使用区分大小写的排序规则,还要检查表是否正确,以及大小写是否匹配。最后,请记住,[name]
只是name
的转义版本——括号实际上不是列名的一部分,因此如果表中的列名是[SESSION\u SPID]
,那就错了。这个答案令人困惑,因为它与您的DMV\u查询
函数的内部相关,该函数未发布在此处。然而,它是在你的网站上发布的。至于,
:,
是PowerShell中的数组构造运算符,在表达式,$dataSet.Tables[0]
中,它将$dataSet.Tables[0]
包装在单个元素数组中,这确保了$dataSet.Tables[0]
-本身就是一个集合,作为单个对象输出。没有前面的,
,由于PowerShell自动枚举集合,将单独输出的是$dataSet.Tables[0]
的行。您刚刚保存了我。谢谢