2009-09-17 120 views
1

我创建了一个ADO.NET连接管理器,用下面的SQL命令一个DataReader源:使用临时表

select 
    'test' as testcol 
INTO 
    #tmp 

select * from #tmp 

如果我点击的DataReader组件的刷新按钮,我得到的SQLException “无效的对象名称#tmp”。 SQL语句本身显然是有效的,并在sql server management studio中正确执行。我也尝试过在连接管理器上设置DelayValidation,但无济于事。

+0

我还没有与SSIS合作过。但是,是否有可能由于对SSIS任务可以运行的用户/上下文的权限而未创建#tmp? – shahkalpesh 2009-09-17 20:38:37

+0

不确定,但我会认为我会得到权限错误,如果是这种情况。 – Jeremy 2009-09-18 02:24:52

回答

2

是INSERT或SELECT错误吗?

如果您只发出一条包含INSERT和SELECT的命令,请尝试在SELECT之前放一个分号。

编辑后OP评论
封装在存储过程中所有的逻辑:

CREATE PROCEDURE YourProcedureName 
AS 
select 
    'test' as testcol 
INTO 
    #tmp 

select * from #tmp 

GO 

的让应用程序运行这个单独的SQL命令:下一个后

exec YourProcedureName 

编辑 OP评论

OP不说,他们正在使用的SQL Server版本,如果2005年或向上,尝试CTE:

;with CTEtemp as 
(
select 
    'test' as testcol 
) 
select * from CTEtemp 
+0

分号似乎没有帮助。 – Jeremy 2009-09-18 13:35:09

+0

确实,存储过程会更容易。不幸的是,我们的服务器组阻止了我在该sql服务器上创建存储过程,并且如果我在另一个服务器上放置了一个存储过程,那么跨服务器连接将不是最优的。 – Jeremy 2009-09-18 14:53:32

+0

幸运的是,我能够将查询返工为不需要临时表,但我仍然对如何在SSIS中执行此操作感兴趣,因为如果你问我,这似乎是一个明显的不足。 – Jeremy 2009-09-18 14:54:58

0

为什么不能这样用“选择‘测试’为testcol”被取代? SSIS查询解析器可能会遇到问题,因为涉及到一个临时表,它期望一个单一的语句,而不是一个实际的SQL脚本。或者,如果你要共享以上仅是为了说明一个例子,也许是这样的:

SELECT * 
    FROM (SELECT 'test' AS testcol) 

你能否详细说明你要在这里完成的,如果是这样,为什么临时表是必须的?

+0

这只是一个简单的例子。在我的真实情况下,我需要临时表,但为了简单起见,我使用了这个示例。 – Jeremy 2009-09-18 13:34:02

0

使用sp_executesql

你的命令将成为

exec sp_executesql @statement=N' 
select 
    ''test'' as testcol 
INTO 
    #tmp 

select * from #tmp' 

您必须使用nvarchar的字符串(因此N),并通过他们加倍逃脱单引号。

我和你有同样的问题,我就是这么解决它的。

+0

这里有一个答案,尽管我的希望最大,但对我来说并不起作用。它没有任何意义,它没有奏效。但是,再次,这就是为什么我现在用原生C#与SqlBulkCopy和其他帮助函数来执行ETL。编码器的SSIS太膨胀了。我有可能在NuGet上发布我的ETL库。 – Todd 2016-01-27 00:33:55