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