首页 > 解决方案 > 加入数据集和 sql server 表

问题描述

我有一个包含大约40000dataset object行并包含大约. 我想把这些表放在他们的ID上。SQL table50000000 rowsjoin

我无法SQL table在 C# 中加载它,因为它太大了,而且我没有在该服务器上创建表的权限(用于从C#克隆对象)。

有什么方法可以加入对象和表吗?

C# 或 SSIS 包是否支持这种解决方案?

标签: c#sqlsql-serverssisdataset

解决方案


可以在 SSIS 中进行。
以下是一些执行此操作的场景。关键问题 - 你有 1-many match 还是 many-many match

备选方案 1 - 您需要匹配 SQL 表引用 C# 表的所有行(1 个 SQL 表行匹配 0 或 1 个 C# 表行)。

该方法的高级视图:

  1. 使用数据创建数据集对象并将其存储在 SSIS 对象类型变量中。脚本任务会做到这一点。
  2. 在 DataFlow 脚本源中 - 从变量中读取行并将其写入缓存目标,持久保存到缓存文件中。
  3. 在下一个数据流中 - 使用 OLEDB 读取 SQL 表,并使用 Lookup 转换执行连接,其中 Lookup 使用在步骤 2 中创建的缓存文件作为参考。您可以根据需要从缓存表中添加列。
  4. 最后一个数据流的目的地由您决定

注释和示例:
在脚本源中输入代码之前 - 添加输出并指定输出列及其名称和数据类型。
从 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 表行)

该方法的高级视图:

  1. 使用数据创建数据集对象并将其存储在 SSIS 对象类型变量中。脚本任务会做到这一点。
  2. 在 DataFlow 脚本源中 - 从变量中读取行。
  3. 然后 - 创建一个带有部分缓存的查找并为您的表定义 SQL 查询。如果 C# 表中的 ID 是唯一的,则可以创建无缓存查找。从 SQL 表中定义匹配条件和所需的列。
  4. 将结果保存在某个目的地

Bad Alternative - 1-many match with row multiplication

示例 - C# 表中的行可以匹配多个 SQL 表行,在这种情况下您必须输出多行。

该方法的高级视图:

  1. 使用数据创建数据集对象并将其存储在 SSIS 对象类型变量中。脚本任务会做到这一点。
  2. 在 DataFlow 脚本源中 - 从变量中读取行。按 ID 排序。
  3. 添加另一个读取 SQL 表的数据源,按同一方向按 ID 排序。
  4. 做一个 SSIS 合并加入
  5. 将结果保存到某个目的地

这种情况的坏处是它可能需要大量 RAM 来执行排序和合并连接转换。


推荐阅读