Stored procedures 无效的对象名称'#结果';在数据流中使用sp时的SSI
我有一个在SQL Management Studio中运行良好的存储过程,但在SSIS 2008 R2中运行它时遇到问题。如果我将其作为Stored procedures 无效的对象名称'#结果';在数据流中使用sp时的SSI,stored-procedures,ssis,Stored Procedures,Ssis,我有一个在SQL Management Studio中运行良好的存储过程,但在SSIS 2008 R2中运行它时遇到问题。如果我将其作为executesql任务运行,它运行良好,没有任何错误,但当我将其作为数据流任务中的ADO NET源使用时,会收到错误消息 无效的对象名称#结果(Microsoft SQL Server,错误:208) 但是,当我单击“预览”时,确实会显示数据行 我没有修改存储过程的访问权限,因此我不确定存储过程本身内部发生了什么,但正如我前面所说的,我可以在managemen
executesql任务运行
,它运行良好,没有任何错误,但当我将其作为数据流任务中的ADO NET源使用时,会收到错误消息
无效的对象名称#结果(Microsoft SQL Server,错误:208)
但是,当我单击“预览”时,确实会显示数据行
我没有修改存储过程的访问权限,因此我不确定存储过程本身内部发生了什么,但正如我前面所说的,我可以在management studio中运行存储过程,也可以在SSIS中的执行SQL任务中使用存储过程 SSIS中的一个步骤是元数据验证——合同规定我们应该有一个整数,然后是一个字符大小8。当数据流数据库源组件(ado或ole)试图获取其元数据时,基本上就是对找到的第一个查询进行归纳 这里的方法与我们在存储过程中处理动态表时使用的方法相同。更改存储过程(您已指定不能执行此操作),以向SSIS提供有关预期元数据的提示
CREATE PROCEDURE dbo.Sample
AS
BEGIN
SET NOCOUNT ON;
-- Any condition that will never evaluate to true
IF NULL = NULL
BEGIN
-- SSIS will key off of this query even
-- though it is impossible for this branch to ever execute
-- So, define our metadata here
SELECT
CAST(NULL AS int) AS MyFirstColumn
, CAST(NULL as char(8)) AS SomeCodeColumn;
END
-- Assume complex queries here that banjax the metadata
-- yet ultimately return the actual data
SELECT TOP 1000
CAST(ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS int) AS MyFirstColumn
, CAST(LEFT(AC.name, 8) AS char(8)) AS SomeCodeColumn
INTO
#RubeG
FROM
sys.all_columns AS AC;
SELECT
RG.MyFirstColumn
, RG.SomeCodeColumn
FROM
#RubeG AS RG;
END
对于SQL Server 2012+的源代码,您可以尝试为执行调用指定WITH RESULT set
属性
EXECUTE dbo.Sample
WITH RESULT SETS
(
(
c1 bigint
, c2 varchar(8)
)
);
Biml
biml包定义示例
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<Connections>
<Connection
Name="tempdb"
ConnectionString="Data Source=.\dev2014;Initial Catalog=tempdb;Provider=SQLNCLI10.1;Integrated Security=SSPI;"
/>
<AdoNetConnection
Name="CM_ADO"
ConnectionString="Data Source=localhost\dev2014;Integrated Security=SSPI;Connect Timeout=30;Database=tempdb;"
Provider="SQL"
/>
</Connections>
<Packages>
<Package Name="so_31206473">
<Tasks>
<Dataflow Name="DFT Sample">
<Transformations>
<OleDbSource ConnectionName="tempdb" Name="OLESRC dbo_Source">
<DirectInput>EXECUTE dbo.Sample</DirectInput>
</OleDbSource>
<DerivedColumns Name="DER Placeholder" />
</Transformations>
</Dataflow>
<Dataflow Name="DFT Sample RESULTS SET">
<Transformations>
<OleDbSource ConnectionName="tempdb" Name="OLESRC dbo_Source RS">
<DirectInput>
<![CDATA[EXECUTE dbo.Sample
WITH RESULT SETS
(
(
c1 bigint
, c2 varchar(8)
)
);]]>
</DirectInput>
</OleDbSource>
<DerivedColumns Name="DER Placeholder" />
</Transformations>
</Dataflow>
<Dataflow Name="DFT SampleADO">
<Transformations>
<AdoNetSource ConnectionName="CM_ADO" Name="ADOSRC dbo_Sample">
<DirectInput>EXECUTE dbo.Sample</DirectInput>
</AdoNetSource>
<DerivedColumns Name="DER Placeholder" />
</Transformations>
</Dataflow>
<Dataflow Name="DFT SampleADO RESULTS SET">
<Transformations>
<AdoNetSource ConnectionName="CM_ADO" Name="ADOSRC dbo_Sample">
<DirectInput>
<![CDATA[EXECUTE dbo.Sample
WITH RESULT SETS
(
(
c1 bigint
, c2 varchar(8)
)
);]]>
</DirectInput>
</AdoNetSource>
<DerivedColumns Name="DER Placeholder" />
</Transformations>
</Dataflow>
</Tasks>
</Package>
</Packages>
</Biml>
执行dbo.Sample
执行dbo.Sample
OLE源的元数据示例
使用OLE源的结果集元数据
对于ADO.NET提供者,结果是一样的,我只是在构建屏幕截图时没有注意到问题的细微差别。更新后的Biml使添加这些内容变得很简单。很荣幸能回答您自己的问题!你可以让它空着。这使堆栈溢出成为一个更好的地方!