操作数类型冲突:文本与uniqueidentifier不兼容

时间:2013-09-10 13:22:04

标签: php sql-server sql-server-2008 pdo zend-framework2

我看到过类似的错误消息,但大多数都与将intfloatuniqueidenifier进行比较有关,这就是为什么会出现错误。我的错误是:

  

SQLSTATE [22018]:强制转换规范的字符值无效:206 [Microsoft] [SQL Server Native Client 11.0] [SQL Server]操作数类型冲突:text与uniqueidentifier不兼容(/ usr / src /中的SQLExecute [206] PHP-5.4.8 / EXT / PDO_ODBC / odbc_stmt.c:254)

我正在构建一个PHP ZF2应用程序并尝试使用参数调用用户定义的函数。前四个参数是UNIQUEIDENTIFIER值。最后四个是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?

1 个答案:

答案 0 :(得分:4)

基于我从SQL Profiler中发现的内容(感谢@davek),看起来查询是在SQL Server端组装的,PDO将所有参数传递为TEXT,这不能隐式地转换为UNIQUEIDENTIFIERBIT。我不确定如何将它作为CHAR默认传递给它。我也不确定为什么在将参数化查询与普通表一起使用时不会导致问题。

这是我提出的临时解决方法。这很难看,但它现在有效。希望其他人可以提出更好的答案。

'...
FROM
    dbo.udfDocumentInstances(
        CAST(:fkCustomer AS CHAR(36)),
        CAST(:fkDocumentQueue AS CHAR(36)),
        CAST(:fkDocumentType AS CHAR(36)),
        CAST(:fkADUser AS CHAR(36)),
        CAST(:Completed AS CHAR(1)),
        CAST(:Deleted AS CHAR(1)),
        CAST(:LinkByDEA AS CHAR(1)),
        CAST(:LinkByOwnership AS CHAR(1))
    ) udf
...'

所以我将值从TEXT转换为CHAR,然后SQL Server将隐式地将它们转换为UNIQUEIDENTIFIERBIT

如果有人想出办法将CHAR代替TEXT而不是{{1}}传递,请发布您的回复。