c# - 加入数据集和 sql server 表
问题描述
我有一个包含大约40000dataset object
行并包含大约. 我想把这些表放在他们的ID上。SQL table
50000000 rows
join
我无法SQL table
在 C# 中加载它,因为它太大了,而且我没有在该服务器上创建表的权限(用于从C#克隆对象)。
有什么方法可以加入对象和表吗?
C# 或 SSIS 包是否支持这种解决方案?
解决方案
可以在 SSIS 中进行。
以下是一些执行此操作的场景。关键问题 - 你有 1-many match 还是 many-many match
备选方案 1 - 您需要匹配 SQL 表引用 C# 表的所有行(1 个 SQL 表行匹配 0 或 1 个 C# 表行)。
该方法的高级视图:
- 使用数据创建数据集对象并将其存储在 SSIS 对象类型变量中。脚本任务会做到这一点。
- 在 DataFlow 脚本源中 - 从变量中读取行并将其写入缓存目标,持久保存到缓存文件中。
- 在下一个数据流中 - 使用 OLEDB 读取 SQL 表,并使用 Lookup 转换执行连接,其中 Lookup 使用在步骤 2 中创建的缓存文件作为参考。您可以根据需要从缓存表中添加列。
- 最后一个数据流的目的地由您决定
注释和示例:
在脚本源中输入代码之前 - 添加输出并指定输出列及其名称和数据类型。
从 DataSet 变量中读取数据的脚本代码:
#region Namespaces
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
#endregion
// Add in the appropriate namespaces
using System.Data;
using System.Data.OleDb;
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
public override void CreateNewOutputRows()
{
// Set up the DataAdapter to extract the data, and the DataTable object to capture those results
DataTable dt = new DataTable();
// Copy DataTable from DataSet
dt = Variables.vResults.DataTable["dtName"];
// Since we know the column metadata at design time, we simply need to iterate over each row in
// the DataTable, creating a new row in our Data Flow buffer for each
foreach (DataRow dr in dt.Rows)
{
// Create a new, empty row in the output buffer
SalesOutputBuffer.AddRow();
// Now populate the columns - here are sample names,
// have to define it before as columns in Script Source Output
SalesOutputBuffer.PurchOrderID = int.Parse(dr["PurchOrderID"].ToString());
SalesOutputBuffer.RevisionNumber = int.Parse(dr["RevisionNumber"].ToString());
SalesOutputBuffer.CreateDate = DateTime.Parse(dr["CreateDate"].ToString());
SalesOutputBuffer.TotalDue = decimal.Parse(dr["TotalDue"].ToString());
}
}
}
备选方案 2. 您希望将 C# DataSet 的所有行与 SQL 表匹配(1 个 C# 表行匹配 0 或 1 个 SQL 表行)
该方法的高级视图:
- 使用数据创建数据集对象并将其存储在 SSIS 对象类型变量中。脚本任务会做到这一点。
- 在 DataFlow 脚本源中 - 从变量中读取行。
- 然后 - 创建一个带有部分缓存的查找并为您的表定义 SQL 查询。如果 C# 表中的 ID 是唯一的,则可以创建无缓存查找。从 SQL 表中定义匹配条件和所需的列。
- 将结果保存在某个目的地
Bad Alternative - 1-many match with row multiplication
示例 - C# 表中的行可以匹配多个 SQL 表行,在这种情况下您必须输出多行。
该方法的高级视图:
- 使用数据创建数据集对象并将其存储在 SSIS 对象类型变量中。脚本任务会做到这一点。
- 在 DataFlow 脚本源中 - 从变量中读取行。按 ID 排序。
- 添加另一个读取 SQL 表的数据源,按同一方向按 ID 排序。
- 做一个 SSIS 合并加入
- 将结果保存到某个目的地
这种情况的坏处是它可能需要大量 RAM 来执行排序和合并连接转换。
推荐阅读
- google-cloud-data-fusion - Google Data Fusion 从存储桶中的多个子文件夹读取文件,需要放置在侧子文件夹中的另一个文件夹中
- node.js - 通过 graphql 从子文档中获取所有数据
- mongodb - 如果 [] 为空,则 mongo go 将其视为 false
- python - python seaborn中的countplot
- swift - Swift 将 Unix 时间戳转换为带时区的日期并将其保存到 EKEvent
- python - Selenium,Scrapy Iteration(单击下一步)仅从第一页中提取项目的 href
- python - 如何找到用方括号括起来的数字后跟一个字符串?
- python - Python大矩阵概率计算
- c# - EEPLUS AutoFitColumns() - 对象引用异常
- python - 为什么在使用不同的 python 版本与 Cython 构建包时他们有不同的 MSVC 编译器?