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
的形式传递,这就是问题所在(请参阅下面的答案)。