使用 Powershell 在数据表中加载多个 SQL 查询结果集时出现问题

Issue with loading multiple SQL query results sets in datatables with Powershell

我正在 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 文件,一切都很好。

但如上加载数据 table 中的结果失败并显示以下消息:

Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.

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

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

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

有什么想法吗?

我怀疑颠倒顺序是否有效。更有可能的是,它正在做一些事情,比如附加到第一次尝试时已经创建的 csv 文件。

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

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