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

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 

는 다음 '이 아닌 경우 (AND .BOF .EOF)'에 저장된 프로 시저

EXEC p_Stuff 1, 'PO0001968' 
+0

Ahh .. 여기서 catch는 테이블 변수가 하나 이상의 레코드를 가질 것입니다 (하드 제한이 아닌 1에서 20까지 다양합니다). 간결함을 위해, 나는 단지 하나만을 보았습니다 (원래의 질문은 지금 수정되었습니다). 저장 프로 시저에 여러 값을 보낼 수 있습니까? – 147

+0

예, 제가 언급 한 테이블 값 매개 변수입니다. 게시물의 링크를 확인하십시오. –