2014-08-28 76 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