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 View3 - 查找转换
我不确定它是否支持类似的查询,但您可以在以下链接中阅读有关此组件的更多信息:
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 目标 - 表或视图加载与快速加载