我是ssis的新手,我遇到了将包含NULL值的存储过程的结果加载到带有ssis的表中的问题。我所拥有的是:
对Database1执行存储过程将返回完整结果集并放入ADO对象User::CallResults
然后我循环遍历User::CallResults
映射2个变量的结果:
Variable Index ADO object Type Nullable User::ID 0 Object NO User::Result 1 Object Yes
然后在Insert Row Into Database2中获取每一行并执行“insert into dbo.myTable id,result values(?,?)”
我将ID分别映射为int和Result。
当我执行时,我收到错误:
failed with the following error: "An error occurred while extracting the
result into a variable of type (DBTYPE_I4)". Possible failure reasons:
Problems with the query, "ResultSet" property not set correctly,
parameters not set correctly, or connection not established correctly.
如果Result
中存在空值,则会出现错误。任何提出ssis的建议都允许空值?
答案 0 :(得分:2)
您可以使用Data Flow task
来完成问题中描述的过程。下面是使用存储过程获取数据然后插入表格的逐步说明,所有操作都在Data Flow task
内完成。这个例子只是想知道如何做到这一点,它只使用一个SQL Server实例。
分步流程:
创建两个名为dbo.Source
和dbo.Destination
的表,并使用数据填充表dbo.Source,如屏幕截图# 1 所示。创建表脚本在脚本部分下提供。
使用 Scripts 部分下提供的脚本创建名为dbo.GetData
的存储过程。
在SSIS包上,创建名为StoredProcedure
的变量,如屏幕截图# 2 所示。该变量将包含存储过程执行语句。
在连接管理器中创建OLE DB Connection
以连接到SQL Server实例。
在SSIS包的Control Flow
标签上,放置Data Flow task
,如屏幕截图# 3 所示。
双击Data flow task
以导航至Data Flow
标签。在“数据流”标签内,放置OLE DB Source
和OLE DB Destination
,如屏幕截图# 4 所示。
配置OLE DB Source
,如屏幕截图# 5 和# 6 所示。请注意,源正在使用在步骤#3中创建的变量。存储过程返回的数据将是源输入。
配置“OLE DB目标”,如屏幕截图# 7 和# 8 所示。这会将数据插入目标表。
屏幕截图# 9 显示示例包执行。
屏幕截图# 10 显示程序包执行后表中的数据。请注意,目标表包含NULL
个值。这是可能的,因为 Qty 列可以接受NULL
值。但是,如果我们已将NULL
值传递给 ItemNumber 列,则该包将失败,因为该列不可为空。
希望有所帮助。
<强>脚本:强>
CREATE TABLE [dbo].[Destination](
[Id] [int] IDENTITY(1,1) NOT NULL,
[ItemNumber] [varchar](50) NOT NULL,
[Qty] [int] NULL,
CONSTRAINT [PK_Destination] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Source](
[Id] [int] IDENTITY(1,1) NOT NULL,
[ItemNumber] [varchar](50) NOT NULL,
[Qty] [int] NULL,
CONSTRAINT [PK_Source] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO
CREATE PROCEDURE [dbo].[GetData]
AS
BEGIN
SET NOCOUNT ON;
SELECT Id
, ItemNumber
, Qty
FROM dbo.Source
END
GO
屏幕截图#1:
屏幕截图#2:
屏幕截图#3:
屏幕截图#4:
屏幕截图#5:
屏幕截图#6:
屏幕截图#7:
屏幕截图#8:
屏幕截图#9:
屏幕截图#10:
答案 1 :(得分:1)
不是一个真正的答案,但由于代码无法在评论中很好地格式化,我将它放在这里。
您是否意识到,如果您的数据库位于同一台服务器上,您可以执行此操作:
INSERT INTO
database1.dbo.Results
EXEC
database2.dbo.SampleStoredProcedure @param1, @param2, @param3
答案 2 :(得分:0)
将此逻辑放入数据流中。完成之后,只需执行批量插入,它应该允许空值。
SSIS - Unable to insert NULL for Blank fields in BULK INSERT