首页 > 解决方案 > 使用 Powershell 在数据表中加载多个 SQL 查询结果集的问题

问题描述

我在 Powershell 脚本中对单独的数据库/连接执行 2 个单独的 SQL 查询。目标是将两个请求的结果导出到单个 CSV 文件中。

我现在正在做的是:

# Create a data table for Clients
$ClientsTable = new-object "System.Data.DataTable"

# Create text commands
$ClientsCommand1 = $connection1.CreateCommand()
$ClientsCommand1.CommandText = $ClientsQuery1

$ClientsCommand2 = $connection2.CreateCommand()
$ClientsCommand2.CommandText = $ClientsQuery2

# Get Clients results
$ClientsResults1 = $ClientsCommand1.ExecuteReader()
$ClientsResults2 = $ClientsCommand2.ExecuteReader()

# Load Clients in data table
$ClientsTable.Load($ClientsResults1)
$ClientsTable.Load($ClientsResults2)

# Export Clients data table to CSV
$ClientsTable | export-csv -Encoding UTF8 -NoTypeInformation -delimiter ";" "C:\test\clients.csv"

在哪里$connection1$connection2被打开System.Data.SqlClient.SqlConnection

两个请求都可以正常工作,并且两个输出数据都具有完全相同的列名。如果我将 2 个结果集导出到 2 个单独的 CSV 文件,一切都很好。

但是如上所述在数据表中加载结果失败并显示以下消息:

无法启用约束。一行或多行包含违反非空、唯一或外键约束的值。

相反,如果我切换将数据加载到数据表中的顺序,例如

$ClientsTable.Load($ClientsResults2)
$ClientsTable.Load($ClientsResults1)

(在第一个结果集之前加载第二个结果集),然后错误消失,生成我的 CSV,对来自 2 个请求的数据没有任何问题。我想不出为什么以一种或另一种方式附加数据会触发这个错误,或者工作正常。

任何的想法?

标签: powershellcsvdatatableexport-to-csvpowershell-5.0

解决方案


我怀疑颠倒订单是否有效。更有可能的是,它正在执行类似于附加到第一次尝试已经创建的 csv 文件的操作。

但是,与原始数据不同的主键定义可能会产生您所看到的结果。从其他排序中提取数据时Datatable.Load()可能会做意想不到的事情。它将尝试合并数据而不是简单地附加它,根据重载和参数使用不同的匹配策略。如果用于其中一个表的主键没有导致任何匹配且没有记录要合并,但该表的主键匹配所有内容,这可能会解释它。

如果您只想追加结果,您要做的是将第一个结果加载()到数据表中,导出为 CSV,清除表,将第二个结果加载到表中,然后以追加模式再次导出。


推荐阅读