在SSIS中使用CTE时出错

时间:2016-01-06 19:25:01

标签: sql sql-server ssis

我在SSIS中使用ADO.net源并运行包含CTE的查询。我收到以下错误:

  

SQL命令返回没有列信息

我使用了SET NOCOUNTset fmtonly off,但仍然没有运气。

请帮我解决这个问题?

示例查询:

with MyCTE as
(
select 
Pno,
jdo,
er,
dtsent,
dtapproved,

ROW_NUMBER() OVER(Partition by Pno,jdo,er ORDER BY dtapproved )  as rn,
Dense_Rank() OVER(ORDER BY Pno,jdo,er )  as rnk  from(
select v1.*,v2.max_jdo as jdo from 
table1 v1 
left join(select Pno,max(jdo) as max_jdo,er from 
 table2
Group by Pno,er ) v2 on
v1.Pno=v2.Pno and
v1.er =v2.er)T
)

select  
c1.Pno ,
c1.jdo, 
c1.er,
case when c1.dtapproved  is null then c1.dtsent else NVL(c2.dtapproved,c1.dtsent) end as Datesent,
c1.dtapproved,
from  MyCTE c1
Left join MyCTE c2
on c1.rn = c2.rn + 1 and c1.rnk=c2.rnk

3 个答案:

答案 0 :(得分:0)

尝试使用如下虚拟结果集启动查询:

IF 1=0
 SELECT 
 '' AS Pno ,
 '' AS jdo, 
 '' AS er,
 GETDATE() AS Datesent,
 GETDATE() AS dtapproved;
ELSE
 with MyCTE as (... the query that works in SSMS)

使用表示预期结果的正确数据类型的虚拟数据。这就是我使用GETDATE()为列创建虚拟数据的原因,看起来它们应该是datetime数据。

另外,请仔细检查发布的示例中的c1.dtapproved之后是否有逗号,因为这会导致语法错误。

答案 1 :(得分:0)

如果有人还在寻找使用ctes的各种解决方法:

首先为什么不使用oledb命令。 如果您已经使用过fmtonly和nocount,则可以使用EXEC WITH RESULT SETS: execute result sets t-sql

或者您可以做的是在proc中运行完整命令,加载临时表并将其用作源。 此外,还可以使用脚本组件将查询作为sqlcommand运行。

答案 2 :(得分:0)

将您的Oracle OLEDB驱动程序更新到版本12.2。

Oracle CTE to SQL Server Using SSIS OLE DB Source上查看完整答案。