带有插入和选择查询的VBA ADO单个命令

时间:2014-08-28 07:12:52

标签: vba tsql sql-server-2012 adodb

我尝试在Excel宏中执行以下SQL语句,但无法返回有效的记录集。我怀疑在同一个陈述中同时拥有INSERTSELECT是罪魁祸首。

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条记录,因此我认为表变量会更有效。

2 个答案:

答案 0 :(得分: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个对象。

答案 1 :(得分: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 

然后作为存储过程执行

EXEC p_Stuff 1, 'PO0001968'