使用 SSIS 中的参数作为 OLE DB 源执行存储过程

Execute Stored Procedure with parameters in SSIS as OLE DB Source

我想执行一个需要参数的存储过程作为 OLE DB 源,以便稍后从 SSIS 导出一个 Excel 文件。

SP 生成了一组数据,我想将其导出到 Excel 文件

这是我运行给SP的代码。 (运行像这样产生我想要的结果)

DECLARE @RC int
DECLARE @startweek varchar(20)
DECLARE @endweek varchar(20)
DECLARE @payroll varchar(30)
DECLARE @job varchar(25)
DECLARE @job_to varchar(25)
DECLARE @manager varchar(30)
DECLARE @office varchar(100)
DECLARE @pu varchar(6)
DECLARE @pu_to varchar(6)
DECLARE @task varchar(25)
DECLARE @task_to varchar(25)
DECLARE @Prj_pu varchar(6)
DECLARE @Prj_pu_to varchar(6)

SET @endweek = dateadd(d, -((datepart(weekday, getdate()) + 1 + @@DATEFIRST) % 7), getdate());
SET @startweek = DATEADD(WEEK, -25, @endweek)

EXECUTE @RC = [dbo].[TIME_lynx_extract] 
   @startweek
  ,@endweek 
  ,@payroll
  ,@job
  ,@job_to
  ,@manager
  ,@office
  ,@pu
  ,@pu_to
  ,@task
  ,@task_to
  ,@Prj_pu
  ,@Prj_pu_to
GO

我不确定 运行 的格式是否正确。

这是设置图片:

这些是黄色背景部分的错误:

Exception from HRESULT: 0xC020204A

Error at Data Flow Task [OLE DB Source [37]]: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80004005.

An OLE DB record is available. Source: "Microsoft SQL Server Native Client 11.0" Hresult: 0x80004005 Description: "The metadata could not be determined because statement 'EXECUTE SP_EXECUTESQL @STR_SQL' in procedure 'TIME_lynx_extract' contains dynamic SQL. Consider using the WITH RESULT SETS clause to explicitly describe the result set.".

Error at Data Flow Task [OLE DB Source [37]]: Unable to retrieve column information from the data source. Make sure your target table in the database is available.

此外,如果我尝试在 OLE DB 源上执行基本查询,它会工作,所以与数据库的连接似乎没问题。 现在的主要问题是如何执行这个SP。

在 DFT 中使用您的 EXEC 参数并不难。

首先,您需要确保所有输入参数值都有 SSIS 变量。

具体来说,制作所有这些 [User::{var_name}] 并填充它们(填充值超出了本答案的范围):

DECLARE @startweek varchar(20)
DECLARE @endweek varchar(20)
DECLARE @payroll varchar(30)
DECLARE @job varchar(25)
DECLARE @job_to varchar(25)
DECLARE @manager varchar(30)
DECLARE @office varchar(100)
DECLARE @pu varchar(6)
DECLARE @pu_to varchar(6)
DECLARE @task varchar(25)
DECLARE @task_to varchar(25)
DECLARE @Prj_pu varchar(6)
DECLARE @Prj_pu_to varchar(6)

此外,在 DFT 之前的 Execute SQL Task 中设置 @endweek@startweek

现在您已准备好所有 SSIS 变量,返回到您的 OLE DB Source 任务,并编辑您的查询。您需要删除 return 变量,并更改所有输入参数,如下所示:

EXECUTE [dbo].[TIME_lynx_extract] ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?
WITH RESULT SETS(
(
worker_reference NVARCHAR(50),
placement_reference NVARCHAR(10),
worker_name NVARCHAR(50),
job_title NVARCHAR(100),
authorising_line_manager NVARCHAR(100),
timesheet_date DATETIME,
company_agent_name NVARCHAR(100),
type_of_worker NVARCHAR(100),
week_number NVARCHAR(10),
hours_worked NVARCHAR(10),
rate_description NVARCHAR(100),
rate_per_hour NVARCHAR(10),
job NVARCHAR(50),
work_stage NVARCHAR(100),
project_name NVARCHAR(100),
location NVARCHAR(100)
))

完成后,点击查询 window 旁边的 Parameters 按钮。 SSIS 应使用 Parameter0Parameter12 预填充列表。您要做的是将所有这些 ParameterX 名称更改为您的输入参数名称。然后为每个参数选择相应的 SSIS 变量。

这是我的 Set Query Parameters window 为我的测试过程执行此操作时的样子:

好的,我将在 ssis 中为 Execute SQL Task 任务回答这个问题。这些示例适用于 VS 2017 Enterprise。您可能认为,当您添加 Execute SQL Task 时,ResultSet 和 Parameters 的语法将是相同的,无论您如何连接到数据库,但事实并非如此。 如果使用 OLEDB 数据库连接到 ms sql,则使用一种语法,如果使用 ADO.Net,则对参数和结果集使用另一种语法

如果您使用 OLEDB 连接到 MS Sql 和单行结果集:

您的参数是输入参数,您指定 0 作为参数名称。您可以有一个参数长度。那么你的 MS Sql 是: 设置@myvar = (select mycol from mytable where xwherecol = ?) 问号?是您的参数替换的地方。如果您有多个输入参数,只需在参数映射的每一行中加载一个参数名称为 0,1,2,... 的参数,然后使用多个问号。

OLEDB ResultSet 将采用命名结果,因此请设置您的 ResultName 到 xxxx,然后在你最后的 ms sql select 从 Execute SQL Task:

select @myvar 作为 xxxx 并且@myvar 将被放置在xxxx ResultSet 变量

如果您使用 ADO.Net 连接到 ms sql 和单行结果集:

你的参数是输入,在这里你指定你的参数名称(我将在参数映射窗格中使用 xyz (NO @) 作为我的参数名称) .您的 MS Sql 是:

set @myvar = (select mycol from mytable as xwherecol = @xyz) 并且您没有在 ms sql 中为您的 Execute SQL Task

声明 @xyz

对于 ResultSet,ADO.Net 不会采用命名的 ResultSet,因此在 ResultSet 中,对于您想要 return 的每个结果,您的 ResultName 仅为 0,1,2 ...。 然后您的最终 select 将按照您列出的顺序将您的 selected 列分配给结果集。

不直观,但希望对您有所帮助。此示例假设您连接到 ms sql,如果您连接到 Oracle 或 Teradata,我不确定我上面描述的内容是否有效。 parms 和结果集可能有效,sql 语法显然会有所不同。