【Access VBA】SQL Serverのテンポラリテーブルからデータを取得する

SQL Serverのテンポラリテーブルからデータを取得する

SQL Serverのテンポラリテーブルからデータを取得し、Accessのテーブルに取り込みます。
テンポラリテーブル名の末尾にセッションIDを付与して他のセッションが作成するテンポラリテーブルと重複しないようにします。

テーブルを準備する

SQL Serverで「sample」という名前のデータベースの中に「T売上明細」という名前のテーブルを用意しました。

Accessには「WT売上明細」という名前のテーブルを用意しました。テーブルにはデータが入力されていません。

SQL Serverにストアドプロシージャを準備する

SQL Serverに「export売上明細」という名前のストアドプロシージャを用意しました。
これによりテンポラリテーブルを作成し、入力パラメーターの@slip_noで受け取った伝票番号のレコードをテンポラリテーブルに書き込みます。

CREATE PROCEDURE export売上明細 	
	@slip_no int,@ID int OUTPUT
AS
BEGIN	
	SET NOCOUNT ON;

    BEGIN TRY			
		DECLARE @table_name VARCHAR(50);
		DECLARE @sql VARCHAR(1000);
		SET @ID=@@spid	   
		SET @table_name='';
		SET @table_name=@table_name+'##TEMP売上明細'+CONVERT(VARCHAR,@@spid);
		SET @sql='';
		SET @sql=@sql+'IF EXISTS(SELECT * FROM tempdb.sys.tables WHERE name='''+@table_name+''')';
		SET @sql=@sql+'DROP TABLE '+@table_name+';';   
		SET @sql=@sql+'CREATE TABLE '+@table_name;
		SET @sql=@sql+'(';
		SET @sql=@sql+'明細ID int';
		SET @sql=@sql+',伝票番号 int';
		SET @sql=@sql+',商品コード VARCHAR(4)';
		SET @sql=@sql+',数量 int';
		SET @sql=@sql+');';
		SET @sql=@sql+'INSERT INTO '+@table_name;
		SET @sql=@sql+' SELECT * FROM T売上明細 WHERE 伝票番号=';
		SET @sql=@sql+ CONVERT(VARCHAR,@slip_no)
                EXECUTE(@sql);	 
		RETURN -1 
	END TRY

	BEGIN CATCH				
		RETURN 0
	END CATCH
END

SQL ServerのテンポラリテーブルのデータをAccessのテーブルに取得するコードの記述

Accessの標準モジュールに以下のコードを記述しました。

Public Sub ExecuteStoredProcedure()
    On Error GoTo ErrhA
    Dim strCN_sample As String
    strCN_sample = "DRIVER={ODBC Driver 17 for SQL Server};SERVER=LAPTOP-114315\SQLEXPRESS;DATABASE=sample;UID=admin;PWD=1111"
    Dim cn As New ADODB.Connection
    cn.Open strCN_sample
    Dim sid As Integer 'SQL Serverが割り当てるセッションIDを格納する変数
    Dim slip_no As Integer 'Accessに書き出したい伝票番号を格納する変数
    slip_no = 522
    Dim cmd As New ADODB.Command
    cmd.ActiveConnection = cn
    cmd.CommandType = adCmdStoredProc
    cmd.CommandText = "export売上明細"
    cmd.CommandTimeout = 3
    cmd.Parameters.Append cmd.CreateParameter("@return_value", adInteger, adParamReturnValue, , Null)
    cmd.Parameters.Append cmd.CreateParameter("@slip_no", adInteger, adParamInput, , slip_no)
    cmd.Parameters.Append cmd.CreateParameter("@ID", adInteger, adParamOutput, , Null)
    cmd.Execute
    On Error GoTo 0
    
    If CBool(cmd.Parameters("@return_value").Value) Then
        On Error GoTo ErrhB
        sid = cmd.Parameters("@ID").Value
        Dim w_cn As New ADODB.Connection
        Set w_cn = CurrentProject.AccessConnection
        Dim w_cmd As New ADODB.Command
        w_cmd.ActiveConnection = w_cn
        w_cmd.CommandType = adCmdText
        Dim strCN_temp As String
        strCN_temp = "DRIVER={ODBC Driver 17 for SQL Server};SERVER=LAPTOP-114315\SQLEXPRESS;DATABASE=tempdb;UID=admin;PWD=1111"
        w_cmd.CommandText = "INSERT INTO WT売上明細 SELECT * FROM [##TEMP売上明細" & CStr(sid) & "] IN ''[ODBC;" & strCN_temp & "]"
        w_cmd.Execute
        On Error GoTo 0
        Set w_cmd = Nothing
        w_cn.Close: Set w_cn = Nothing
    Else
        MsgBox "エラーが発生しました。", vbExclamation, "確認"
    End If
    Set cmd = Nothing
    cn.Close: Set cn = Nothing
    Exit Sub
ErrhA:
    MsgBox "エラーが発生しました。", vbExclamation, "確認"
    Set cmd = Nothing
    cn.Close: Set cn = Nothing
    Exit Sub
ErrhB:
    MsgBox "エラーが発生しました。", vbExclamation, "確認"
    Set w_cmd = Nothing
    w_cn.Close: Set w_cn = Nothing
End Sub

動作確認

AccessのExecuteStoredProcedureプロシージャの中のslip_noに指定した伝票番号のレコードがAccessのテーブルに抽出されました。