SSIS OLE DB 记录可用。来源:“Microsoft SQL Server Native Client 11.0”Hresult:0x80004005,无法确定元数据

Posted

技术标签:

【中文标题】SSIS OLE DB 记录可用。来源:“Microsoft SQL Server Native Client 11.0”Hresult:0x80004005,无法确定元数据【英文标题】:SSIS An OLE DB record is available. Source: "Microsoft SQL Server Native Client 11.0" Hresult: 0x80004005, The metadata could not be determined 【发布时间】:2020-02-22 19:35:41 【问题描述】:

虽然我已经为结果集提供了动态 SQL,但我收到了以下错误。然而它要求同样的。

一个 OLE DB 记录可用。来源:“Microsoft SQL Server Native Client 11.0” Hresult:0x80004005 描述:“无法确定元数据,因为语句 'EXEC sp_executesql @ExecSQL' 包含动态 SQL。考虑使用 WITH RESULT SETS 子句显式描述结果集。”。

错误:0xC0202080 提取 CSV 文件 - 流,OLE DB 命令 1 [281]:无法从 SQL 命令的参数中检索目标列描述。

以下代码在 MS SQL Management Studio Query 中运行良好。但它在 SSIS 中给出错误

DECLARE @tablename nvarchar(200),  @tablevalue nvarchar(1)

SELECT @tablename =CAST(FLOOR(RAND()*(100000-5+1)+5) as nvarchar)

Select @tablevalue='0'

DECLARE   @ExecSQL NVARCHAR(max)

SET @ExecSQL = 'SELECT d.tablename, d.tablevalue INTO mws_ssis_cust_senti_integration'+ @tablename+
+ ' from  ( select ''' + 'mws_ssis_cust_senti_integration' + @tablename + ''' as tablename, ''' + @tablevalue + ''' as tablevalue ) as d '


EXEC sp_executesql @ExecSQL

Set @tablename = N'mws_ssis_cust_senti_integration'+ cast(@tablename as nvarchar)

Set  @ExecSQL = 'select * from  ' + @tablename

EXEC sp_executesql @ExecSQL
WITH RESULT SETS
(
 (
 tablename varchar(max), tablevalue varchar(1)
 )
)

【问题讨论】:

我真的建议您正确引用您的动态对象名称(使用QUOTENAME)。还有Bad habits to kick : declaring VARCHAR without (length) @Larnu "我尝试通过为变量指定长度,如下所示,仍然是结果,请让我知道如何使用动态对象名称,即 QUOTENAME 它在 MSSQL 查询中工作正常 问题出在 OLEDB 命令中 你想用这段代码做什么?当它坐下时,它只是返回您在顶部声明的两个变量值。当然还有更多,但是呢? 【参考方案1】:

为什么要在 OLE DB 命令中使用此命令?!

参考官方文档:

OLE DB 命令转换为数据流中的每一行运行一条 SQL 语句。例如,您可以运行在数据库表中插入、更新或删除行的 SQL 语句。

它不用于选择语句。我认为您正在寻找具有 SQL 命令访问模式或 查找转换执行 SQL 任务OLE DB 源

1- 执行 SQL 任务

您可以将查询结果存储在对象类型的 SSIS 变量中。有很多文章说明了这个过程:

SSIS Basics: Using the Execute SQL Task to Generate Result Sets Execute SQL Tasks in SSIS: Output Parameters vs Result Sets

请注意,如果您在 SSIS 中有 @tablename 和 @tablevalue 变量,则可以使用表达式以更简单的方式构建此语句并稍后执行。

2 - OLE DB 源

您可以使用 OLE DB 源从类似命令生成行,您可以查看以下答案,因为它提供了一些有关在 OLE DB 源中使用结果集的有用信息:

Execute Stored Procedure with multiple result sets

此外,您可以查看以下文章以获取一些有用的信息:

SSIS OLE DB Source: SQL Command vs Table or View

3 - 查找转换

我不确定它是否支持类似的查询,但您可以在以下链接中阅读有关此组件的更多信息:

An Overview of the LOOKUP TRANSFORMATION in SSIS

【讨论】:

【参考方案2】:

您是否尝试过将整个语句包装在一个存储过程中,然后从 SSIS 调用该存储过程?

这里只是在黑暗中拍摄,但在过去,当我将复杂的 sql 语句,尤其是涉及创建临时表的那些,在 SSMS 之外移动到生产环境中(例如,在应用程序或 s-s-rs 报告中)时,查询将失败没有明确的原因。一旦我将实际的 sql 移动到 sp 中,错误就神奇地消失了,对查询的实际机制进行了 0 次更改。

【讨论】:

以上是关于SSIS OLE DB 记录可用。来源:“Microsoft SQL Server Native Client 11.0”Hresult:0x80004005,无法确定元数据的主要内容,如果未能解决你的问题,请参考以下文章

SSIS - OLE DB 目标 - 表或视图加载与快速加载

SSIS - 检查 OLE DB 源架构

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

SSIS:无法创建OLE DB访问器。验证列元数据是否有效

在 SSIS 2012 的 OLE DB 源中使用动态 SQL

SSIS - 将 Fact 与查找表匹配两次时重用 Ole DB 源