同様のエラー メッセージを見たことがありますが、ほとんどはint
またはfloat
とuniqueidenifier
の比較に関するものであり、エラーが発生する理由は理にかなっています。私のエラーはこれです:
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 である可能性はありますか?