Excel VBA + ADO 複数のクエリーの結果をレコードセットに取得

Dim Cn As ADODB.Connection

Sub Test()

    Dim rst As New ADODb.Recordset
    Dim cmd As ADODb.Command
    Set cmd = New ADODb.Command
    cmd.ActiveConnection = Cn
    cmd.CommandTimeout = 30

    ‘複数のSELECT文
    cmd.CommandText = “SELECT * FROM TableA; SELECT * FROM TableB
    cmd.CommandType = adCmdText

    ‘実行
    rst.Open cmd, , adOpenForwardOnly, adLockReadOnly
    Set cmd = Nothing

    ‘最初のSELECT文の結果
    Sheet1.Cells(1, 1).CopyFromRecordset rst

    ‘次のレコードセットへ
    Set rst = rst.NextRecordset()

     ‘2番目のSELECT文の結果
    Sheet2.Cells(1, 1).CopyFromRecordset rst

    rst.Close
    Set rst = Nothing

End Sub

SQL Server トランザクション分離レベル(読込時のロック回避)

トランザクション分離レベルの制御

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
他のトランザクションでデーター更新中でも読み込みできる.
更新の途中で読み込んでしまう可能性があるので,例えば半分だけ更新されていて半分は更新されていないデーターを取得してしまうなど一貫性がないデーターになる場合がある(ダーティ リード).

SET TRANSACTION ISOLATION LEVEL READ COMMITTED
データー更新か終わるまで待ってから読み込む.
読み込み中に他でデーター更新することは可能.
SQL Serverの規定値.

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
データー更新か終わるまで待ってから読み込む.
読み込み中に他でデーター更新することはできない.
他で行を挿入することは可能.
必要なときだけ使う.

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
データー更新か終わるまで待ってから読み込む.
読み込み中に他でデーター更新することはできない.
他で行を挿入することもできない.
どうしても必要なときだけ使う.

SQL Server 2005以降は以下のSNAPSHOTも使える.
これらは更新中も読み込みでき一貫性も保たれるが,
行サイズが大きく、更新の多いデータベースの場合は、
tempdb「Version Store」 の利用頻度増大や肥大化の悪影響がある.

(1)
READ_COMMITTED_SNAPSHOT ON
SELECTステートメント発行時点での正しいデーターを読み込む.
(ステートメント レベル)

(2)
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
トランザクション開始時点に存在したデーターを読み込む.
(トランザクション レベル)
ALLOW_SNAPSHOT_ISOLATION を ON に設定しておく必要がある.


参考:
SET TRANSACTION ISOLATION LEVEL (MSDN)
排他ロックにブロックされない読み取りの実現 (MS)
SQL Server でのスナップショット分離 (MSDN)

SQL Server クエリーを文字列で動的に作成 (2方法)

1. EXECUTE ステートメントで文字列を実行する方法

DECLARE
   @SQLString NVARCHAR(MAX)
, @IDList nvarchar(MAX)

SET @IDList = ‘1,2,3’

SET @SQLString = N’SELECT a1 ‘
                    + ‘FROM Table1 ‘
                    + ‘WHERE ID IN ‘
                    + ‘(‘ + @IDList + ‘) ‘

Exec (@SQLString)


2. sp_executesql を使用する方法

DECLARE
   @SQLString nvarchar(MAX) –SQL文字列
, @ParaString nvarchar(MAX) –パラメーター定義文字列
, @a1 int –出力パラメーター
, @ID int

SET @SQLString =
    N’SELECT @OutValue = a1
    FROM Table1
    WHERE ID = @ID1′

SET @ParaString =
    N’@ID1 int
    , @OutValue int OUTPUT’

SET @ID = 1

EXECUTE sp_executesql @SQLString, @ParaString
                    , @ID1 = @ID
                    , @OutValue = @a1 OUTPUT

SELECT @a1


参考:
sp_executesql の使用 (MSDN)