SELECT T1.ID, T21.b, T22,b
FROM Table1 AS T1
INNER JOIN Table2 AS T21 ON T1.ID = T21.ID
INNER JOIN Table2 AS T22 ON T1.ID = T22.ID
WHERE T21.a = 1
AND T22.a = 2
Excel VBA + ADO ストアドからレコードセット取得,シートへ貼付
Dim Cn As ADODB.Connection
Dim rst As New ADODB.Recordset
1.ストアドからレコードセットを取得して返す
Sub Test1(ByRef rst As ADODB.Recordset)
Cn.stTest1 rst ‘ストアド実行
End Sub
2.ストアドからレコードセットを取得して返す(パラメーターあり)
Sub Test2(a1 AS Long, Date1 As Date, Str1 As String, ByRef rst As ADODB.Recordset)
Dim cmd As ADODB.Command
Dim par0 As ADODB.Parameter, par1 As ADODB.Parameter, par2 As ADODB.Parameter
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = Cn
cmd.CommandText = “stTest2”
cmd.CommandType = adCmdStoredProc
cmd.CommandTimeout = 30 ‘タイムアウト時間
‘パラメーター設定
Set par0 = cmd.CreateParameter(“@a1”, adInteger, adParamInput) ‘int
cmd.Parameters.Append par0
par0.Value = a1
Set par1 = cmd.CreateParameter(“@Date1”, adDBDate, adParamInput) ‘datetime
cmd.Parameters.Append par1
par1.Value = Date1
Set par2 = cmd.CreateParameter(“@Str1”, adVarWChar, adParamInput, 50) ‘nvarchar(50)
cmd.Parameters.Append par2
par2.Value = Str1
‘実行
rst.Open cmd, , adOpenForwardOnly, adLockReadOnly
Set cmd = Nothing
End Sub
3.シートへの貼付
レコードセットの内容をそのままシートに貼り付けるにはCopyFromRecordsetメソッド
Sheet1.Cells(1, 1).CopyFromRecordset rst
普通は↑のようにそのまま貼り付けても役に立たないので配列に加工してから貼付
Dim DataArray() As Variant ‘2次元配列にする
‘レコードセットを配列に代入して加工するコード
・・・
‘配列をシートに貼付
Sheet1.Range(Sheet1.Cells(1, 1), Sheet1.Cells(UBound(DataArray, 1) + 1, UBound(DataArray, 2) + 1)).Value = DataArray
注意: VBAではレコードセットをReadOnlyで開いてもなぜかロックがかかってしまうことがあるので,レコードセットはできるだけ早く閉じた方がいい.
SQL Server タイムアウト関連の設定
1. 接続のタイムアウト ADO
SqlConnection.ConnectionTimeout プロパティー (ADO.Net)
規定値15秒
0は制限無し.
このプロパティーはReadOnlyなので設定はできない.
設定はConnectionStringで接続時におこなう.
例:
ConnectionString = “Data Source=(local);Database=test;Integrated Security=SSPI;Connection Timeout=30;”
参考:
SqlConnection.ConnectionString プロパティ (MSDN)
このConnectionTimeoutは接続のタイムアウトなので,コマンド実行のタイムアウトとは関係ない.
コマンド実行のタイムアウトは↓.
2. クエリー(コマンド実行)のタイムアウト ADO
SqlCommand.CommandTimeout プロパティー (ADO.Net)
規定値30秒
0は制限無し.
例:
cmd.CommandTimeout = 60
Excel VBAでは,ADODB.CommandのCommandTimeoutプロパティー
3. SQL Server Management Studio でテーブルのデザインを変更したときのタイムアウト
[ツール]-[オプション]-[デザイナ]-[テーブルおよびデーターベースデザイナ]-[トランザクションがタイムアウトするまでの時間] で設定する.
規定値30秒

