【发布时间】:2019-01-10 04:49:43
【问题描述】:
我正在尝试使用一个查询的结果创建一个全局临时表,然后可以将其选为一个表并进一步操作多次,而无需一遍又一遍地重新处理数据。
这在SQL management studio中完美运行,但是当我尝试通过Excel查询添加表时,当时可以引用该表,但它不是在tempdb数据库的Temporary Tables中创建的。
我已经把它分解成一个简单的例子。
如果我在 SQL management studio 中运行,结果为 1 会按预期返回,并在 Temporary Tables 中创建表 ##testtable1
set nocount on;
select 1 as 'Val1', 2 as 'Val2' into ##testtable1
select Val1 from ##testtable1
然后我可以在这个表上运行另一个选择,即使在不同的会话中,正如你所期望的那样。例如
Select Val2 from ##testtable1
如果我不删除 ##testtable1,则在 Excel 中的查询中运行以下命令将返回 2 的结果,如您所料。
Select Val2 from ##testtable1
但是,如果我直接在 Excel 中将相同的 Select... 运行到 ##testtable1 查询中,则会正确返回 1 的结果,但不会创建临时表。
如果我然后尝试运行
Select Val2 from ##testtable1
作为一个单独的查询,它错误地说“无效的对象名称'##testtable1'
该表未列在 SQL 管理工作室的临时表中。
就好像在查询完成后它正在对表执行删除一样,即使我没有调用删除。
我该如何解决这个问题?
【问题讨论】:
-
为什么首先需要一个全局临时表?它们充满了并发问题。请记住,当使用它的最后一个连接关闭时,全局表将被删除。这意味着如果您在 Excel 中创建但不使用它,则临时表不会无限期地挂起。
-
只是为了强调@SeanLange 已经提到的内容:SSMS(能够)保持会话打开,而 Excel 不能。每次发送查询时,都会创建一个新会话并立即再次关闭(一旦查询完成)。
-
最终这是为属于母公司的 5 个品牌创建财务资产负债表报告。每个品牌都是一个单独的数据库。有 5 个查询返回结果,然后需要进一步处理以将它们全部加在一起作为“组总数”。没有理由不能在一个查询中全部完成,但 5 个查询中的每一个都有 22,000 个字符长,因此将它们加在一起会使我超过 .ConnectionString 字符限制。以这种方式在 Management Studio 中完美运行,它只是试图通过 Excel 进行数据处理。
-
你要关闭每个通话之间的连接吗?你用的是哪个版本的excel?您是否为此或 vba 使用 excel 中的内置查询工具?最后一个问题:您可以创建一个视图或存储过程来执行此操作吗?如果需要,这些可以跨越多个数据库:D
标签: sql-server excel