4

同様のエラー メッセージを見たことがありますが、ほとんどはintまたはfloatuniqueidenifierの比較に関するものであり、エラーが発生する理由は理にかなっています。私のエラーはこれです:

SQLSTATE [22018]: キャスト仕様の無効な文字値: 206 [Microsoft] [SQL Server Native Client 11.0] [SQL Server] オペランド型の衝突: テキストは uniqueidentifier と互換性がありません (/usr/src/php-5.4 の SQLExecute[206] .8/ext/pdo_odbc/odbc_stmt.c:254)

PHP ZF2 アプリケーションを構築しており、パラメーターを使用してユーザー定義関数を呼び出そうとしています。最初の 4 つのパラメーターはUNIQUEIDENTIFIER値です。最後の 4 つはBIT値です。これが私のコードです:

public function getCustomerInspectionDocuments($fkCustomer) {
    /** @var \Zend\Db\ResultSet\ResultSet $result */
    $result = $adapter->query("
        SELECT
            createUser.FullName AS CreateUser,
            udf.CreateTime,
            udf.CompleteTime,
            modifyUser.FullName AS ModifyUser,
            udf.ModifyTime,
            udf.Source,
            udf.id AS InstanceID
        FROM
            udfDocumentInstances(
                :fkCustomer,
                :fkDocumentQueue,
                :fkDocumentType,
                :fkADUser,
                :Completed,
                :Deleted,
                :LinkByXXX,
                :LinkByOwnership
            ) udf
            LEFT JOIN ADUser createUser
                ON udf.fkCreateUser = createUser.pkid
            LEFT JOIN ADUser deleteUser
                ON udf.fkDeleteUser = deleteUser.pkid
            LEFT JOIN ADUser modifyUser
                ON udf.fkModifyUser = modifyUser.pkid
        ORDER BY
            ModifyTime DESC
    ", array(
        ':fkCustomer' => $fkCustomer,
        ':fkDocumentQueue' => '57B5829B-3EAE-46FF-8130-8A432176DE2A',
        ':fkDocumentType' => '7E5D5187-B38A-E211-B52D-0F1256A21434',
        ':fkADUser' => null,
        ':Completed' => null,
        ':Deleted' => 0,
        ':LinkByXXX' => 0,
        ':LinkByOwnership' => 0,
    ));

    // do some other stuff and return the records
}

このコードは、SQL Server 2012 に対して実行すると問題なく動作しますが、2008 に戻すと、そのエラー メッセージで停止します。私は同じドライバーを使用しているので、変わるのはサーバーだけです。

問題は、UDF に対して実行されているという事実と、PDO を介してパラメーターをバインドしているという事実の組み合わせのようです。SELECT(通常のテーブルから)単純なクエリに変更すると、機能します。または、パラメーター値をクエリに直接入れても機能します。しかし、この UDF を呼び出す必要があり、パラメーター化されたクエリを使用したいと考えています。

SQL Server に送信されているもの (つまり、完全に組み立てられたクエリ) を正確に確認する方法はありますか? または、パラメーター化されたクエリとしてサーバーに渡され、それを組み立てているのは SQL Server である可能性はありますか?

4

1 に答える 1