在一个数据库上创建全局临时表并在另一个数据库上的查询中使用它 - 可能吗?

Stu*_*SQL 4 ssis temporary-tables

我的问题如下:

我正在尝试使用来自 DB1 的数据创建一个全局临时表,然后在 DB2 中执行的查询中使用该临时表,然后将结果导入到 DB2 上的新表中。由于查询有点复杂,一个简单的合并连接不会做,因为我需要转换数据并根据两个数据库的数据添加一个额外的列 (dense_rank)。根据我的一位同事的说法,这应该可以在 SSIS 中完成。

我想在来自 DB2 的连接上执行的简化查询:

Select db2.a,db2.b,db2.c,db1.c, db1.d,
DENSE_RANK() OVER (PARTITION BY db2.a order by db1.c asc) as FinalRank
from DB2.table  as db2
left join ##globaltemp as db1 on db2.a=db1.a
Run Code Online (Sandbox Code Playgroud)

经过大量的谷歌搜索和不同的尝试后,DB2 源连接将找不到我在 DB1 中创建的临时表 (##globaltemp)。

这样的操作甚至可能吗?

tldr:是否可以在 SSIS 会话中创建一个全局临时表并从中提取数据,而不管数据库是什么?

Mik*_*lsh 5

只要您留在会话上下文中,即使是本地临时表 (#Table) 也能工作。全局临时表 (##Table) 只是全局的,因为它可以被其他会话看到。

这里可能发生的事情是您的 create ##Table 会话超出范围/上下文,当会话消失时,它是临时表。无论是本地的还是全球的。所以创建临时表的过程超出了范围,它的临时表也消失了。

换句话说 - 问题不在于您连接到的数据库的范围。无论您使用什么数据库,都可以访问任何临时表。临时表不会在您的任何用户数据库(DB1 或 DB2)中创建,它们总是在 TempDB 中创建。

尝试使用派生表或考虑临时表等。


bil*_*nkc 5

除了 Mike 的好答案之外,您缺少的 SSIS 中的设置是您必须为 OLE/ADO 连接管理器指定 RetainSameConnection 属性为 True。否则,SSIS 可以/将为创建全局表的执行 SQL 任务创建一个连接,关闭该连接,然后为数据流任务打开一个新连接,在这种情况下,临时表将被删除。