我在SSIS中使用ADO.net源并运行包含CTE的查询。我收到以下错误:
SQL命令返回没有列信息
我使用了SET NOCOUNT
和set 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
答案 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。