在SSIS中,如何查找ID的值,如果不匹配,则插入值并返回ID

使用SSIS,我正在将分段的摘要加载到其主数据库中。该过程的一部分是使用LOOKUP获取字符串值的ID,如果不存在,则将其插入到引用表中(使用OLE DB COMMAND),然后通过后续查找返回该ID。

在SSIS中,如何查找ID的值,如果不匹配,则插入值并返回ID

LOOKUP说即使插入后,前50个值也不匹配。 有办法解决这个问题吗? 还是我应该尝试另一种方法?

一些研究/尝试...

  1. 最初,没有匹配项被返回。我必须将所有查找都更改为“无缓存”,这样它才能重新加载参考表(它们很小,所以我怀疑我会有很大的性能问题)。

  2. 我看到的一个替代方法是将组播多播到不同的查找中(基于我正在查找的列),然后在成功插入/查找它们之后将它们合并在一起。但是据我所读,这种方法存在严重的性能问题。

我希望查询匹配或不匹配。如果不匹配,则插入新值;然后,再次查找ID的值(如果不匹配,则失败)。合并原始匹配项和原始不匹配项以进行下一次查找。

dy1900 回答:在SSIS中,如何查找ID的值,如果不匹配,则插入值并返回ID

尝试以下模式:

enter image description here

1.You are multicasting the dataset and grouping by just your lookup column
2.inserting your lookup and adding the scopeidentity(lookupid) to you grouped data
3.joining in the data you inserted to effective add your lookup value to every row
4.unioning your data back in

我不是很肯定,但是您可能需要添加一些类别才能使用合并联接。

,

SSIS数据流

Here is the final SSIS data flow model... 根据@KeithL的建议,我在合并加入之前添加了排序。

脚本组件

using System;
using System.Data;
using System.Data.SqlClient;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

public class ScriptMain : UserComponent
{
    IDTSConnectionManager100 serverConMgr;

    public override void PreExecute()
    {
        base.PreExecute();
        serverConMgr = this.Connections.Connection;
    }
    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        using (SqlConnection serverCon = new SqlConnection(serverConMgr.ConnectionString))
        {
            SqlCommand sql = new SqlCommand(
            "INSERT INTO DIM.CONTRIBUTOR (CONTRIBUTOR) VALUES ('" + Row.CONTRIBUTOR + "') " +
            "\n SELECT CAST(SCOPE_IDENTITY() AS INT) AS 'ID'",serverCon);

            serverCon.Open();

            SqlDataReader data = sql.ExecuteReader();

            while (data.Read())
            {
                Row.CONTRIBUTORID = data.GetInt32(0);
            }

            data.Close();
        }

    }
}

“脚本组件”是最棘手的部分。它插入新值并检索相应的ID。下面是该脚本的代码。

请注意3件重要的事情...

  1. 数据库连接管理器(在这种情况下,名称为“ Connection”,必须为ADO.Net连接)
  2. Row.CONTRIBUTOR_ID是我在脚本编辑器的“输入和输出”部分中手动配置为输出的行
  3. 除非在SQL命令中将SCOPE_IDENTITY显式转换为int,否则SqlDataReader的“ GetInt32()”方法不适用于SCOPE_IDENTITY。

以下是与脚本相关的其他说明...

  1. 您可以insert and return SCOPE_IDENTITY through OLE DB command,但是相当复杂
  2. 这是Microsoft文档对how to retrieve data using SqlDataReader的引用
本文链接:https://www.f2er.com/3151504.html

大家都在问