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