从Excel运行SQL Server存储过程

4
我正在使用SQL Server 2008企业版。我在一个数据库中创建了一个存储过程,其中包含对不同数据库的多个查询,并显示最终合并的结果集。
我尝试通过Excel执行它,以便结果会自动显示在Excel工作表中,但是我收到了以下错误消息:
“查询没有运行,或者数据库表无法打开。请检查数据库服务器或联系您的DBA。确保外部数据库可用且未被移动或识别,然后再次尝试操作。”
我创建了一个更简单的存储过程,只查询了一个数据库,并且结果在Excel工作表中显示时没有任何问题。
因此,我怀疑原始存储过程失败的原因是在存储过程中查询了多个数据库,而“External Data Properties”的连接详细信息中仅提到了一个数据库。
我的问题是 - 可以解决吗?我可以在存储过程中使用多个数据库并在Excel中查看吗?
谢谢, Roni

这可能对你有所帮助。http://blogs.office.com/2010/06/07/running-a-sql-stored-procedure-from-excel-no-vba/ - Prabhat Srivastava
谢谢,但这正是我正在做的事情。如果该过程仅从一个数据库中查询数据 - 即在连接详细信息中提到的那个数据库,则没有问题。当存储过程内部的查询涉及多个数据库时,我会遇到错误。 - Roni Vered
所有数据库都在同一服务器上吗? Excel连接字符串中的SQL登录或用户是否可以访问每个数据库? 存储过程是否返回多个结果集? 如果您能够在SSMS中无问题地运行存储过程,请尝试使用您的凭据在Excel中设置连接。 - bsivel
  1. 所有的数据库都在同一台服务器上。
  2. 用户对数据库中的表具有访问权限。
  3. 只有一个结果集。
  4. 我已经在SSMS中成功运行了该过程,并获得了所需的结果集。
  5. 我尝试将用户更改为更强大的用户,但仍然出现错误。
- Roni Vered
2个回答

15

我将过程转换为表变量,而不是临时表,并在过程开头添加了"set nocount on"。

第二个操作解决了问题。

第一个操作提高了过程的响应时间。


非常感谢 @Roni Vered,这很有帮助。 - fapw
@Roni Vered,你找到为什么设置 NOCOUNT ON 解决了你的问题了吗? - sup4eli

2

(复制了@Roni答案的关键部分)

create procedure dbo.xxx
as

set nocount on
...

1
如果存储过程包含临时表,则应在“END”之前放置“SET NOCOUNT OFF”记录...否则可能会完全错过SET NOCOUNT。 - fapw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接