2014-08-28 69 views
1

我試圖在Excel宏中執行下面的SQL語句,但它無法返回有效的記錄集。我懷疑在同一陳述中同時使用INSERTSELECT是罪魁禍首。帶插入和選擇查詢的VBA ADO單個命令

STRSQL:

DECLARE @PurchOrdersTmpXl_A147 Table(SrNo INT, PONum VARCHAR(255)); 

INSERT INTO @PurchOrdersTmpXl_A147 (SrNo, PONum) 
    VALUES (1, 'PO0001968'), 
      (2, 'PO0000260'); 

SELECT 
    XLPO.SrNo [PO Order], 
    POOrigLine.PURCHID [Orig PO], 
    POOrigLine.ITEMID [Orig Item], 
    POOrigLine.Name  [Orig Txt] 
FROM 
    dbo.PURCHLINE POOrigLine 
     INNER JOIN @PurchOrdersTmpXl_A147 [XLPO] 
      ON POOrigLine.PurchID = XLPO.PONum 
WHERE 
    POOrigLine.PurchStatus != 4 


VBA代碼

Set ADOConn = New ADODB.Connection 
ADOConn.connectionString = strConnect 
ADOConn.Open 

Set ADOcmd = New ADODB.Command 
ADOcmd.ActiveConnection = ADOConn 
ADOcmd.CommandText = strSQL 

Set ADOrs = ADOcmd.Execute 
Debug.Print ADOrs.RecordCount // Gives error "Operation Not Allowed when object is closed" 


任何幫助嗎?

在此先感謝。

注1:
我可以證實,這個錯誤是因爲我試圖執行一個Insert查詢,並在同一個命令字符串SELECT查詢。

如果我使用臨時表而不是上述表變量並拆分命令執行(首先執行CREATEINSERT,然後再執行SELECT),則沒有錯誤。 但是,由於我的臨時表永遠不會保存超過20條記錄,所以我認爲表變量會更有效。

回答

0

嘗試這種情況:

Set ADOrs = New ADODB.Recordset 
With ADOrs 
    .CursorLocation = adUseClient 
    Call .Open(strSQL, ADOConn, , , adCmdText) 
    If Not (.BOF And .EOF) Then Debug.Print .RecordCount 
End With 

在這種情況下,不需要Command對象;你只需要Recordset對象。

+0

同樣的錯誤。 – 147 2014-08-31 07:43:18

0

是否可以將此SQL轉換爲存儲過程?你可能有更多的運氣,因爲你可以隱藏其他記錄集(這可能是爲什麼它關閉)

也是這整個SQL代碼?爲什麼不直接從表中選擇?如果您想爲一組SrNo/PONum運行此操作,則可以通過傳遞表值參數來更好地運行存儲過程。

http://msdn.microsoft.com/en-us/library/bb675163(v=vs.110).aspx

下面是一個例子存儲的過程,對於一組的工作原理。請參閱上面的鏈接以使用多套。

CREATE PROC p_Stuff 
@SrNo INt, @PONum VARCHAR(255) 
AS 

SET NOCOUNT ON 

DECLARE @PurchOrdersTmpXl_A147 Table(SrNo INT, PONum VARCHAR(255)); 

INSERT INTO @PurchOrdersTmpXl_A147 (SrNo, PONum) 
    VALUES (@SrNo, @PONum); 

SELECT 
    XLPO.SrNo [PO Order], 
    POOrigLine.PURCHID [Orig PO], 
    POOrigLine.ITEMID [Orig Item], 
    POOrigLine.Name  [Orig Txt] 
FROM 
    dbo.PURCHLINE POOrigLine 
     INNER JOIN @PurchOrdersTmpXl_A147 [XLPO] 
      ON POOrigLine.PurchID = XLPO.PONum 
WHERE 
    POOrigLine.PurchStatus != 4 

,然後在`如果不是(.BOF AND .EOF)`執行作爲存儲過程

EXEC p_Stuff 1, 'PO0001968' 
+0

Ahh ..這裏的問題是表變量將有多個記錄(在1到20之間變化,而不是硬性限制)。爲簡潔起見,我只展示了一個(現在修改的原始問題)。是否可以將多個值發送到存儲過程? – 147 2014-09-04 07:04:20

+0

是的那些是我提到的表值參數。檢查帖子中的鏈接。 – 2014-09-04 12:46:44