Visual studio 2010 如何获取存储过程标量输出并将其添加到管道中的每一行?
我正在使用SSIS包将数据从ERP系统(Microsoft Dynamics AX)传输到自定义CRM解决方案。我需要转移/更新的内容之一是客户。在CRM系统中,有一个名为CustomerID的字段,该字段是CRM环境特有的,并且在数据从ERP系统传输到CRM系统时必须设置该字段 问题是我必须调用一个存储过程来获取下一个要插入的客户的CustomerID。如何从SSIS内部执行此操作?我目前正在使用数据流传输数据,唯一可以调用存储过程的地方是作为SQL命令查询的ADO NET源任务,每次调用该过程时,它都会增加ID,因此每次运行SSIS包时,它都会更新CRM数据库中所有客户的CustomerID字段 存储过程驻留在自定义CRM应用程序上。存储过程不接受任何输入参数。每次调用它时,它只输出一个标量值,如Visual studio 2010 如何获取存储过程标量输出并将其添加到管道中的每一行?,visual-studio-2010,ssis,sql-server-2012,Visual Studio 2010,Ssis,Sql Server 2012,我正在使用SSIS包将数据从ERP系统(Microsoft Dynamics AX)传输到自定义CRM解决方案。我需要转移/更新的内容之一是客户。在CRM系统中,有一个名为CustomerID的字段,该字段是CRM环境特有的,并且在数据从ERP系统传输到CRM系统时必须设置该字段 问题是我必须调用一个存储过程来获取下一个要插入的客户的CustomerID。如何从SSIS内部执行此操作?我目前正在使用数据流传输数据,唯一可以调用存储过程的地方是作为SQL命令查询的ADO NET源任务,每次调用该过
CT000001
,CT000002
,等等
正确执行此操作的其他选项有哪些?您需要使用脚本组件为每行调用存储过程,并将值添加到目标下游的管道中 SSIS 2012包示例,演示了一个示例: 该示例使用以下数据库对象
- 名为PracticeDB的SQL Server 2012数据库。在这个场景中,CRM和ERP表都位于同一个数据库中,以保持简单
- 表
将包含目标CRM数据dbo.CRM
- 表
包含源ERP数据dbo.ERP
- 表
是CRM系统中的一个假设表,用于增加客户数量dbo.CustomerId
- 存储过程
每次调用时都会递增客户编号dbo.GetCustomerId
USE PracticeDB;
GO
CREATE TABLE dbo.CRM(
CRMId int IDENTITY(1,1) NOT NULL,
CustomerId int NOT NULL,
CustomerName varchar(50) NULL
);
GO
CREATE TABLE dbo.ERP(
ERPId int IDENTITY(1,1) NOT NULL,
CustomerName varchar(50) NOT NULL
);
GO
CREATE TABLE dbo.CustomerId(
Id int NOT NULL
);
GO
CREATE PROCEDURE dbo.GetCustomerId
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS(SELECT Id FROM dbo.CustomerId)
INSERT INTO dbo.CustomerId (Id) VALUES(1);
ELSE
INSERT INTO dbo.CustomerId (Id)
SELECT MAX(Id) + 1 FROM dbo.CustomerId;
SELECT MAX(Id) AS CustomerId FROM dbo.CustomerId;
END;
GO
INSERT INTO dbo.ERP (CustomerName) VALUES
('John Doe')
, ('Jane Doe')
, ('Stephen Smith')
, ('Dean Jones')
;
GO
- 创建SSIS包并创建ADO.NET连接管理器以连接到适当的数据源
- 将数据流任务拖放到“控制流”选项卡上
- 在数据流任务中,拖放组件
、ADO.NET源代码
和ADO.NET目标脚本组件(转换)
- ADO.NET源将从表dbo.ERP读取数据
- ADO.NET目标将向表dbo.CRM中插入数据
- 双击脚本组件以打开脚本组件编辑器
- 单击连接管理器选项卡页面
- 选择ADO.NET连接管理器
,并为其命名,如ADONET\u PracticeDB
。此连接管理器将在脚本组件代码中使用PracticeDB
- 单击输入和输出选项卡页面
- 将输入重命名为
,并将输出重命名为ERP
CRM
- 展开CRM,选择输出列,然后单击添加列
- 将列名重命名为CustomerID。该示例使用integer类型的列。您需要根据需要更改数据类型
- 单击
选项卡页面Script
- 在脚本选项卡页面上,单击编辑脚本…
- 键入下面的脚本组件部分中显示的代码。脚本使用包中可用的ADO.NET连接管理器启动连接,然后在
方法中启动命令对象PreExecute
- 然后在
方法中为管道中的每一行调用存储过程,以生成新的客户IDERP\u ProcessInputRow
- 关闭脚本组件
- 在执行包之前,对数据执行以下查询以检查行
希望这能给你一个想法。CRM能转化为MS Dynamics吗?@billinkc不,不能。它不是Dynamics CRM。@Siva-ERP是Microsoft Dynamics AX,CRM是一个定制的内置CRM。@Siva-在CRM方面是。存储的过程更新包含最新客户编号的表,并返回值。通常,数字类似于CT000001,CT000002,etc@Siva它不需要输入参数。输出为CT000001、CT000002等。
#region Namespaces
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
using System.Data.OleDb;
using System.Data.SqlClient;
#endregion
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
IDTSConnectionManager100 manager;
SqlConnection connection = null;
SqlCommand command = null;
public override void PreExecute()
{
manager = base.Connections.PracticeDB;
connection = new SqlConnection();
connection = (SqlConnection)manager.AcquireConnection(null);
command = new SqlCommand();
command.Connection = connection;
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "dbo.GetCustomerId";
base.PreExecute();
}
public override void PostExecute()
{
base.PostExecute();
}
public override void ERP_ProcessInputRow(ERPBuffer Row)
{
Row.CustomerID = Convert.ToInt32(command.ExecuteScalar());
}
}
SELECT * FROM dbo.ERP;
SELECT * FROM dbo.CRM;
SELECT * FROM dbo.CustomerId;