VBA ADO带插入和选择查询的单个命令
我试图在Excel宏中执行以下SQL语句,但它无法返回有效的记录集。我怀疑在同一个语句中同时包含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
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'