MS SQL在插入后获取值

MS SQL在插入后获取值,sql,sql-server,excel,vba,recordset,Sql,Sql Server,Excel,Vba,Recordset,我面临一个问题,需要根据现有数据计算一些数据,然后插入该数据,最后使用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(2

我面临一个问题,需要根据现有数据计算一些数据,然后插入该数据,最后使用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_前缀和RM_后缀),将它们插入我的表并返回到我的Excel文件中

如果有一种方法不使用存储过程(如函数)就可以做到这一点,那也太好了

请记住,这是一个多用户环境,因此在Excel中生成值并将其发送到SQL server进行插入并不能100%保证所述数据的唯一性

感谢大家宝贵的帮助和投入


彼得你需要这样的东西-

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

实际上,问题来自SQL存储过程。我补充说
设置不计数
就在
插入[ExcelRGA](RM_前缀,RM_后缀,编辑,createdBy,editedBy)值(@RM_前缀,@RM_后缀,1,@user,@user)

它解决了我的问题!我现在可以在VBA中浏览记录集


感谢大家的帮助和投入

在代码中,
oRS
是您为记录集指定的名称,但在
while
代码中,您指的是
rs
。那是个错误吗?对不起,是的。实际上,如果使用临时表而不是表变量,会发生什么?这可能是一个选项,但如何确保在Excel中获得插入的值?从Excel传递的唯一参数是用户名。但是,可能会有两个不同的人使用同一个帐户。添加
oRs。在while循环之前先移动
oRs。也可以使用
oRs。打开“SqlCommandHere”
而不是
。执行
谢谢!但是我应该把这个放在哪里呢?我试着在
cmd.Execute()
之后运行它,但我得到了关键的结果。