我已成功在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的数据表不会增长。
答案 0 :(得分:0)
根据我的经验,如果您在VBA中生成数据库连接((multiple previous questions有关),而不是依赖于现有的工作簿连接,您的存储过程将执行,无论它返回什么。
答案 1 :(得分:0)
我遇到的问题是,仅通过创建连接而不指定要返回数据的单元格,没有任何反应。
此外,如果我指定一个单元格来返回数据,除非我使用我的“修复”来在SP的末尾创建一个空表,否则什么都不会发生。