通过Excel连接运行存储过程 - 在SSMS中工作,但不能通过VBA宏工作

时间:2016-12-14 15:24:16

标签: sql sql-server excel vba stored-procedures

我已成功在Excel文件中创建了许多连接到数据库,因此问题只与此特定方案直接相关。服务器是2012年,Excel是2013年。

我有以下SP:

IF OBJECT_ID('usp_LockUnlockCustomer', 'P') IS NOT NULL
    DROP PROCEDURE usp_LockUnlockCustomer
GO
CREATE PROCEDURE usp_LockUnlockCustomer 
    @Lock AS CHAR(10), @Id AS nvarchar(50), @LockedBy AS nvarchar(50)=null
AS BEGIN
SET NOCOUNT ON;
IF @Lock = 'Lock'
    INSERT INTO IO_Call_DB..IdLock (Id, LockedBy, LockedDtTm)
    VALUES(@Id,@LockedBy,GETDATE())
;
IF @Lock = 'Unlock'
    DELETE FROM IO_Call_DB..IdLock
    WHERE Id = @Id
;
END;
--EXEC usp_LockUnlockCustomer 'Lock','123456789', 'Test User'

上述SP通过一些VBA调用如下:

With ActiveWorkbook.Connections("usp_LockUnlockCustomer").OLEDBConnection
    .CommandText = "EXECUTE dbo.usp_LockUnlockCustomer '" & bLock & "','" & Id & "','" & LockedBy & "'"
End With

我测试了字符串,字符串格式正确&包含所有必需的数据。

Excel和SQL之间的连接是通过" Data>创建的。来自其他来源>从SQL Server"开始,它是一个相当标准的过程,适用于所有其他SP和一般查询。

我认为,因为此连接不会将数据返回到Excel(我只设置连接而不是指定Excel应该将数据返回到单元格),这可能是问题所在。

之前有没有人遇到过这个问题?

EDIT1:我已经解决了这个问题,但这并不是一个特别好的结果。一些帮助将不胜感激。 要解决此问题,您必须包含" select * from"处理存储过程的末尾,并告诉Excel将数据输出到工作簿中的范围。这允许VBA的.Refresh部分做它做的任何事情&将SP提交给SQL。

基本上,您被迫创建数据表 - 但我不想要任何数据,我只想提交命令。

那么,你如何提交一个命令而不是让Excel要求你1)明确说明应该放置数据的位置2)当我不需要任何数据时,在存储过程中包含一个SELECT语句返回。

我的修复是"选择前0"从表中,至少这样输出到Excel的数据表不会增长。

2 个答案:

答案 0 :(得分:0)

根据我的经验,如果您在VBA中生成数据库连接((multiple previous questions有关),而不是依赖于现有的工作簿连接,您的存储过程将执行,无论它返回什么。

答案 1 :(得分:0)

我遇到的问题是,仅通过创建连接而不指定要返回数据的单元格,没有任何反应。

此外,如果我指定一个单元格来返回数据,除非我使用我的“修复”来在SP的末尾创建一个空表,否则什么都不会发生。