从 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 中的临时表中