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

VBA ADO带插入和选择查询的单个命令,vba,tsql,sql-server-2012,adodb,Vba,Tsql,Sql Server 2012,Adodb,我试图在Excel宏中执行以下SQL语句,但它无法返回有效的记录集。我怀疑在同一个语句中同时包含INSERT和SELECT是罪魁祸首 strSQL: VBA代码 有什么帮助吗 提前谢谢 注1: 我可以确认此错误是因为我试图在同一命令字符串中执行Insert查询和SELECT查询 如果使用临时表而不是上面的表变量并拆分命令执行(首先执行创建和插入,然后执行选择),则不会出现错误。 但是,由于我的临时表不会保存超过20条记录,因此我认为表变量的性能会更有效。尝试以下方法: Set ADOrs

我试图在Excel宏中执行以下SQL语句,但它无法返回有效的记录集。我怀疑在同一个语句中同时包含
INSERT
SELECT
是罪魁祸首

strSQL:


VBA代码


有什么帮助吗

提前谢谢

注1:
我可以确认此错误是因为我试图在同一命令字符串中执行
Insert
查询和
SELECT
查询

如果使用临时表而不是上面的表变量并拆分命令执行(首先执行
创建
插入
,然后执行
选择
),则不会出现错误。
但是,由于我的临时表不会保存超过20条记录,因此我认为表变量的性能会更有效。

尝试以下方法:

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

在这种情况下,不需要
命令
对象;您只需要
记录集
对象。

是否可以将此SQL转换为存储过程?这样您可能会更幸运,因为您可以隐藏其他记录集(这可能就是它关闭的原因)

这也是整个SQL代码吗?为什么不直接从表中选择?如果您想为一组SrNo/PONum运行该程序,那么就更有理由作为存储过程运行,因为您可以传递表值参数

下面是一个用于一个集合的示例存储过程。有关使用多个集合的信息,请参见上面的链接

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'

啊。。这里的问题是table变量将有多条记录(在1到20之间变化,不是硬限制)。为了简洁起见,我只展示了一个(原来的问题现在已经修改)。是否可以向存储过程发送多个值?是的,这些是我提到的表值参数。检查帖子中的链接。
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'