2013-12-11 40 views
0

我面臨的一個問題是,我需要根據現有數據計算一些數據,然後插入該數據,最後使用VBA將其返回到Excel文件。MS SQL在INSERT後獲取值

我已經成功已經能夠創建一個存儲過程,插入後返回值表:

[...] 
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

在你的代碼中,'oRS'是你給Recordset的名字,但是在'while'代碼中,你引用'rs'。這是一個錯誤嗎? – SchmitzIT

+0

對不起,是的。它實際上是oRS – pbocsak

+0

如果使用臨時表而不是表變量會發生什麼? – SchmitzIT

回答

0

其實,這個問題是從SQL存儲過程的到來。我已經添加 SET NOCOUNT ON;INSERT INTO [ExcelRGA] (RM_prefix, RM_suffix, editing, createdBy, editedBy) values (@RM_prefix, @RM_suffix, 1, @user, @user);

前面,並已解決了我的問題!我現在可以瀏覽VBA中的記錄集。

謝謝大家的幫助和投入!

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 
+0

謝謝!但我應該在哪裏插入這個?我嘗試過'cmd.Execute()'之後運行它,但我得到了Critical。 – pbocsak