Excel – SQL查询 – ##温度表

我正在尝试使用一个查询的结果创build一个全局临时表,然后可以将它作为一个表进行select,并进行多次操作,而不必一遍又一遍地重新处理数据。

这在SQLpipe理工作室中是完美的,但是当我尝试通过Excel查询来添加表时,表可以在那时被引用,但是它不会在tempdb数据库的临时表中创build。

我已经把它分解成一个简单的例子。

如果我在SQLpipe理工作室中运行这个,那么1的结果将按照预期返回,并且在临时表中创build表## testtable1

set nocount on; select 1 as 'Val1', 2 as 'Val2' into ##testtable1 select Val1 from ##testtable1 

然后,我可以在该表上运行另一个select,即使是在不同的会话中,也可以按照您的预期进行。 例如

 Select Val2 from ##testtable1 

如果我不删除## testtable1,则在Excel中的查询中运行下面的内容将返回2的结果,如您所期望的那样。

 Select Val2 from ##testtable1 

但是,如果我直接在Excel中运行相同的Select … into ## testtable1查询,则正确返回1的结果,但不会创build该temptable。

如果我然后尝试运行

 Select Val2 from ##testtable1 

作为一个单独的查询,它的错误说“无效的对象名称”## testtable1“

该表未列在SQLpipe理工作室的临时表中。

就好像在查询执行完成后在表上执行一个删除操作,尽pipe我没有调用drop。

我该如何解决这个问题?

阅读全局临时表(GTT)。 只要有一个会议引用它,他们就会坚持下去。 在SSMS中,如果您在另一个会话中使用它之前closures了创buildGTT的会话,则GTT将被丢弃。 这是Excel中发生的事情。 Excel创build一个连接,执行和断开连接。 由于在Excel断开连接时没有使用GTT的会话,GTT将被丢弃。

我强烈build议你创build一个普通表而不是使用GTT。 由于其临时性和对活动会话的依赖性,在使用GTT时可能会得到不一致的结果。 如果你创build一个普通的表,你可以肯定,它会仍然存在,当你以后使用它。

创build/清理表的代码非常简单。

 IF OBJECT_ID('db.schema.tablename') IS NOT NULL TRUNCATE TABLE [tablename] ELSE CREATE [tablename]... GO 

您可以将截断更改为删除以清理特定的一组数据,并将其置于每个查询的开头。

是否有可能使用视图? 假设您连接到同一台服务器上的5个数据库,您可以在视图中将数据组合在一起:

  CREATE VIEW [dbo].[testView] AS SELECT * FROM database1.dbo.myTable UNION SELECT * FROM database2.dbo.myTable 

然后在Excel中:

数据>新查询>来自数据库> FromSQL服务器数据库

inputDB服务器

从适当的数据库中select视图 – 完成:)

或者调用视图,但是你正在做(例如vba等)

同样你也可以使用一个存储过程,并从VBA中调用它。基本上,任何将复杂性转移到服务器端的东西都可以让你的生活更轻松:D