【问题标题】:Trying to call a T-SQL Stored Procedure which selects data from linked server in SSIS package尝试调用从 SSIS 包中的链接服务器中选择数据的 T-SQL 存储过程
【发布时间】:2025-12-15 07:45:01
【问题描述】:

我有一个场景,我试图从远程服务器(我只有读取权限)中选择表 t1 和 t2 中的一些数据,从另一个远程服务器(我是 DBO 但没有真的拥有所有权限,以便我可以做任何我想做的事)通过 SSIS 包将 DB db2 中的 S2 放入表 t1。

S1 和 S2 都是链接服务器。我通过 SSMS 中的对象服务器从 S2 链接到 S1。

现在,我在 S2.db2 中创建了一个存储过程 sp1,其中包含来自两个不同表的一些 select 语句,其中包含一个日期范围的连接,这些日期范围作为参数传递给 sp1。

例如如下:

从 s1.db1.schema1.t1 中选择 * 左连接 s1.db1.schema1.t2 开 [条件] [条件] 现在我的 SSIS 包有一个 Dataflow 任务,它具有 OLE DB 源和目标以及到 s2.db2 的连接字符串

在源代码中,我直接在 SQL 命令中调用上述查询并填充到目标表 S2.db2.t1 中,它工作正常

但是当我尝试执行以下操作时它会引发错误

  1. 创建 2 个包级别 DATETIME 变量为 v1、v2 并传递默认值 价值观 - 没问题
  2. 在 OLE DB SOURCE->CONNECTION STRING -> SQL COMMAND -> EXEC sp1 ?, ? - 没问题
  3. 单击 PARAMETERS 选项卡并选择 Parameter0 和 parameter1 的用户参数 - 没问题
  4. 现在,当我对 SQL 命令窗口说确定时,它给了我如下错误

错误是:

标题:Microsoft Visual Studio

FII54_CBI_TM51 [FII54_CBI 1] 出错:SSIS 错误代码 DTS_E_OLEDBERROR。发生 OLE DB 错误。错误代码:0x80004005。 OLE DB 记录可用。来源:“Microsoft SQL Server Native Client 10.0” Hresult:0x80004005 描述:“操作数类型冲突:int 与日期不兼容”。

FII54_CBI_TM51 [FII54_CBI 1] 出错:无法从数据源检索列信息。确保数据库中的目标表可用。


其他信息:

来自 HRESULT 的异常:0xC020204A (Microsoft.SqlServer.DTSPipelineWrap)


按钮:

好的

我理解错误的含义,但我不明白为什么它会抛出这个错误。

如果有人可以帮助我解决此问题,我将不胜感激?这对我来说非常紧迫。

【问题讨论】:

  • 1) sp_help sp1 使用有关该过程所采用的参数的信息编辑您的票证。 2) 在 OLE DB 源上,获取 Set Query Parameters 窗口的屏幕打印(单击参数...时可用) 3) 获取变量窗口的屏幕打印。 4) 你能在与 sp1 相同的数据库上创建一个虚拟过程 sp2 吗?让它具有与 sp1 相同的签名,但不查询任何表,当然也不会访问链接服务器。这将有助于确定是链接服务器问题、您的查询还是您的包。
  • 嘿..我真的不明白你上面建议的步骤的必要性。但是说到最后一点,那就是确定问题,我很确定问题不在于查询或包裹。我也不认为问题出在链接服务器上,因为当我尝试直接粘贴 sp1 内部的链接服务器查询时,它工作得很好。查询也很好,因为它在 SSIS 包和 SSMS 中都有效,并且与包。我相信这与在 SSIS 包中一起调用 SP 和链接服务器有关。我以前从未使用过这种组合。
  • 您可能知道这一点,但我们试图为您的问题提供可能答案的人并不知道这一点。这听起来好像发生了数据类型不匹配,因此,我询问了有关两个系统之间接口的详细信息。拥有过程元数据的具体证据,参数映射和 SSIS 类型将允许想要帮助您查看问题细节的人。我们可能会发现这不是不匹配,而是最终成为权限问题,但我宁愿在寻找一些晦涩难懂的东西之前消除可能的原因。
  • 明白了!!!但是当我尝试将屏幕截图附加为图像时,它给了我以下错误:哎呀!无法提交您的编辑,因为:我们很抱歉,但作为一种垃圾邮件预防机制,新用户不得发布图片。获得超过 10 名发布图片的声望。如果有任何其他方法可以执行此操作,请告诉我。
  • 你应该很快就有足够的声誉,请一些人支持这个问题。

标签: sql-server stored-procedures ssis linked-server


【解决方案1】:

当使用存储过程作为 OLEDB 源时,你应该确保在存储过程中你有:

SET NOCOUNT ON;

然后在执行该过程之前,添加:SET FMTONLY OFF

SET FMTONLY OFF;
EXEC CBI_MASTER_PID ?, ?

你可以试试这个吗?

【讨论】: