Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何使bulkCopy映射到相同的列?_Sql Server_Powershell_Dmv - Fatal编程技术网

Sql server 如何使bulkCopy映射到相同的列?

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],因为它不是从

假设我有一个包含以下列的SQL表:

[服务器名称],[会话ID],[会话SPID]

我正在尝试将存储在数据表(
$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]
的行。您刚刚保存了我。谢谢