我面临一个问题,我需要根据现有数据计算一些数据,然后插入该数据,最后使用VBA将其返回到Excel文件。
我已经成功地创建了一个存储过程,在插入后返回一个值表:
[...]
INSERT INTO [ExcelRGA] (RM_prefix, RM_suffix, editing, createdBy, editedBy) values (@RM_prefix, @RM_suffix, 1, @user, @user);
DECLARE @tab table (RM varchar(20))
INSERT @tab SELECT (@RM_prefix +'-' + right('00' + @RM_suffix, 3)) as 'RM';
SELECT * FROM @tab
END
这有效!但是,我无法获取使用VBA返回的值
Set oRS = New ADODB.Recordset
Set cmd = New ADODB.Command
Dim objRec As Object
cmd.ActiveConnection = oCon
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "dbo.newRM"
cmd.Parameters.Refresh
cmd.Parameters("@user").Value = "john"
Set oRS = cmd.Execute()
但我尝试做类似
的事情while not oRS.eof
....
wend
收到一条错误消息,指出记录集已关闭,我无法做到。
我要做的就是保护我计算的信息(RM_prefix和RM_suffix),将它们插入我的表格并将它们返回到我的Excel文件。
如果有一种方法可以在不使用存储过程(例如函数)的情况下执行此操作,那也很棒!
请记住,这是一个多用户环境,因此在Excel中生成值,将它们发送到SQL服务器以进行插入并不能保证100%保证所述数据的唯一性。
感谢大家的宝贵帮助和投入!
彼得
答案 0 :(得分:0)
你需要这样的东西 -
Private Function GetIDENTITY() As Long
oRS.Open "SELECT @@identity AS NewID", oCon
If Not IsNull(oRS.Fields("NewID")) Then
GetIDENTITY = oRS.Fields("NewID"): oRS.Close
Else
MsgBox "Error: Identity value not returned.", vbCritical
End
End If
End Function
答案 1 :(得分:0)
实际上,问题来自SQL存储过程。我已经添加
SET NOCOUNT ON;
就在之前
INSERT INTO [ExcelRGA] (RM_prefix, RM_suffix, editing, createdBy, editedBy) values (@RM_prefix, @RM_suffix, 1, @user, @user);
它解决了我的问题!我现在可以在VBA中浏览记录集。
感谢大家的帮助和投入!