从 Excel 运行的 SQL 不能使用临时表

Posted

技术标签:

【中文标题】从 Excel 运行的 SQL 不能使用临时表【英文标题】:SQL run from Excel cannot use a temporary table 【发布时间】:2014-01-28 22:04:58 【问题描述】:

我已经能够创建从 Excel 到 SQL Server 的数据连接并成功执行许多 SQL 查询。但是如果它包含一个临时表,我将无法让任何 TSQL 工作。例如:

select * into #t from compass3.dbo.freq
select * from #t where freq_id>2

(显然在这种情况下不需要使用#t:我只是给出最简单的例子。)这在 SSMS 中工作正常,但是当通过 Excel 执行时,我收到错误消息“我们无法刷新连接‘audbbicube’。表‘ion Query1’可能不存在。”

在其他一些 SO 帖子中,人们建议添加 set nocount on,但这在这种情况下没有任何区别。

【问题讨论】:

为什么要使用#temp 表? 因为在实际任务中,我需要使用不同的参数多次运行存储过程,合并每次执行的输出,并将整个结果集返回到 Excel。所以我创建了一个临时表,并在每次执行后将存储过程的输出插入到该表中,然后将临时表返回到 Excel。 那么你为什么不编写一个存储过程来完成所有这些,并从 Excel 中调用一次 that 存储过程呢?问题将是 - 我怀疑 - Excel 单独发出所有这些查询,因此 #temp 表或 @table 变量永远不会跨越这些独立语句的范围。 我是 BI 人员,使用已经可用的存储过程为来自业务用户的各种临时请求提供服务。我不是负责编写存储过程的数据库人员。这种特定需求不太可能保证与维护新存储过程相关的变更管理。 据我了解,Aaron 的推理是正确的……临时表在这里无法正常工作。您是否尝试过将 TSQL 语句中存储过程的结果联合起来,而不是尝试将单个结果存储在临时表中? (仅供参考,您的报告创建结构很糟糕,您的公司基本上已经将存储过程转换为数据源并从中编写报告。嘿,您可能对设置感到沮丧) 【参考方案1】:

我想添加到上面的答案 - 只需在查询顶部使用SET NOCOUNT ON,使用常规临时表SELECT name INTO #Names FROM Employee 应该可以工作。

这里不需要表变量。

您还可以添加SET ANSI_WARNINGS OFF 以避免出现“NULL 值被聚合消除”之类的消息。

【讨论】:

这个答案是正确的,当我尝试从 Excel 运行 SP 时,我遇到了与 OP 相同的问题,它应该从嵌入式 SELECT 返回数据。它是由从服务器返回的 ... 行受影响 消息引起的。显然,Excel 无法正确处理此消息,返回的数据被忽略。在我的 SP 中使用 SET NOCOUNT ON 后,数据在 Excel 中正确显示。【参考方案2】:

以下似乎有效...

set nocount on
declare @t table(fid int)  -- I'm sure I could add the rest of the columns if I wanted to
insert @t select freq_id from compass3.dbo.freq
select * from @t where fid>2

所以只要我打开nocount并使用表变量而不是临时表,我就可以实现我所需要的。

【讨论】:

以上是关于从 Excel 运行的 SQL 不能使用临时表的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Excel 中的数据插入 Spark SQL 中的临时表中

SQL里怎么用UPDATE 更新大量SELECT 数据

SQL临时表使用

Spark sql注册的临时表不能在sqlContext.read()中使用?

SQL Server 表变量和临时表的区别

如何使用 ANSI SQL 创建临时表?