サブクエリでCreateParamer


ADODBのCreateParameterは基本的には上から順に処理されるが、
サブクエリ内でParameterを使用すると、処理される順番が異なることがあるので注意。


サブクエリがなければ上から順にParamerが適用される適用される

    strSql = ""
    strSql = strSql & " SELECT     @Param1 AS 項目1"
    strSql = strSql & "           ,@Param2 AS 項目2"
    strSql = strSql & "           ,@Param3 AS 項目3"
    strSql = strSql & " FROM      T_HOGE"
    
    
    Set adoCmd = New ADODB.Command
    With adoCmd
            .ActiveConnection = adoCn
            .CommandText = strSql
            .CommandType = adCmdText
            .Parameters.Append .CreateParameter("@Param1", adChar, adParamInput, 6, "111111")
            .Parameters.Append .CreateParameter("@param2", adChar, adParamInput, 6, "222222")
            .Parameters.Append .CreateParameter("@param3", adChar, adParamInput, 6, "333333")
    End With
    
    Set adoRS = adoCmd.Execute

上記の実行結果
項目1→"111111"
項目2→"222222"
項目3→"333333"



サブクエリがある場合、そちらを優先してパラメタが適用される

    strSql = ""
    strSql = strSql & " SELECT     @Param1 AS 項目1"
    strSql = strSql & "           ,(SELECT CStr(@Param2) FROM T_HOGE) AS 項目2"
    strSql = strSql & "           ,@Param3 AS 項目3"
    strSql = strSql & " FROM      T_HOGE"
    

    Set adoCmd = New ADODB.Command
    With adoCmd
            .ActiveConnection = adoCn
            .CommandText = strSql
            .CommandType = adCmdText
            .Parameters.Append .CreateParameter("@Param1", adChar, adParamInput, 6, "111111")
            .Parameters.Append .CreateParameter("@param2", adChar, adParamInput, 6, "222222")
            .Parameters.Append .CreateParameter("@param3", adChar, adParamInput, 6, "333333")
    End With
    
    Set adoRS = adoCmd.Execute

上記の実行結果
項目1→"222222"
項目2→"111111"
項目3→"333333"


と、Parameterはサブクエリのものが優先される模様。




原因はOLE DBのバグ。ADO.NETでも同様な現象が出るようなので注意。

OLE DB Provider for Jet 4.0 または Office 12.0 Access Database Engine OLE DB Provider を
使用時にサブ クエリを持つパラメータ クエリを実行すると、予期しない結果を返す場合がある
http://support.microsoft.com/kb/969850/ja


回避方法はとしては

・OLE DBではなく、ODBCを使用する、
・パラメータステートメントを用いてSQLを生成する

がある。



動作確認環境:Access2003