我尝试在Excel宏中执行以下SQL语句,但无法返回有效的记录集。我怀疑在同一个陈述中同时拥有INSERT
和SELECT
是罪魁祸首。
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
查询。
如果我使用临时表而不是上面的表变量并且拆分命令执行(首先执行CREATE
和INSERT
然后执行SELECT
),则没有错误。
但是,由于我的临时表永远不会超过20条记录,因此我认为表变量会更有效。
答案 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'