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

Php 操作数类型冲突:文本与uniqueidentifier不兼容,php,sql-server,sql-server-2008,pdo,zend-framework2,Php,Sql Server,Sql Server 2008,Pdo,Zend Framework2,我看到过类似的错误消息,但大多数都与将int或float与uniqueidenifier进行比较有关,这就解释了为什么会出现错误。我的错误是: SQLSTATE[22018]:强制转换规范的无效字符值:206[Microsoft][SQL Server Native Client 11.0][SQL Server]操作数类型冲突:文本与uniqueidentifier不兼容(SQLExecute[206]at/usr/src/php-5.4.8/ext/pdo_odbc/odbc_stmt.c:

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

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

我正在构建一个PHPZF2应用程序,并尝试使用参数调用用户定义的函数。前四个参数是
UNIQUEIDENTIFIER
值。最后四个是
值。这是我的密码:

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
}
这段代码在针对SQLServer2012执行时工作得非常好,但当我将其切换回2008时,它会被错误消息阻塞。我使用的是同一个驱动程序,所以唯一改变的是服务器

问题似乎是它是针对UDF执行的,而我是通过PDO绑定参数的。如果我将其更改为一个简单的
SELECT
query(从普通表中),它就可以工作。或者,如果我将参数值直接放入查询中,也可以这样做。但是我需要调用这个UDF,我更喜欢使用参数化查询


是否有一种方法可以准确地查看发送到SQL Server的内容(即完全组装的查询)?或者它可能是以参数化查询的形式传递给服务器的,是SQL server在组装它吗?

根据我从SQL Profiler(感谢@davek)中发现的,看起来查询是在SQL server端组装的,PDO是以
文本的形式传递所有参数的,不能隐式转换为
唯一标识符
。我不确定如何让它在默认情况下作为
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将隐式地将它们转换为
UNIQUEIDENTIFIER
BIT


如果有人能想出一种方法将它们作为
CHAR
而不是
TEXT
传递,而不必显式地强制转换每一个,请发布您的回复。

您应该能够使用SQL Profiler查看到达数据库的内容。@davek:谢谢。这帮助我发现查询不是在web服务器上组装的,而是作为参数化查询传递给SQL server的。看起来所有参数都以
TEXT
的形式传递,这就是问题所在(请参阅下面的答案)。