php - 操作数类型冲突 : text is incompatible with uniqueidentifier

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

我见过类似的错误消息,但大多数都与将 intfloatuniqueidenifier 进行比较有关,这让您明白为什么会出错。我的错误是这样的:

SQLSTATE[22018]: Invalid character value for cast specification: 206 [Microsoft][SQL Server Native Client 11.0][SQL Server]Operand type clash: text is incompatible with uniqueidentifier (SQLExecute[206] at /usr/src/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 绑定(bind)参数的。如果我将其更改为简单的 SELECT 查询(来自普通表),它就可以工作。或者,如果我将参数值直接放入查询中,那也可以。但是我需要调用这个 UDF,我更愿意使用参数化查询。

有没有办法准确地查看发送到 SQL Server 的内容(即完全组装的查询)?或者它是否有可能作为参数化查询传递给服务器并且是 SQL Server 正在组装它?

最佳答案

根据我从 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 会将它们隐式转换为 UNIQUEIDENTIFIER比特币

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

关于php - 操作数类型冲突 : text is incompatible with uniqueidentifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18720137/

相关文章:

php - mysql phpmyadmin,如何保存通过输入类型 "select"(下拉菜单)的表单获得的出生日期

php - Doctrine 获取扩展给定抽象类的所有模型的存储库

php - Mysql/PDO 完整性违规重复主项 - 尽管表中没有任何内容

c# - 我可以使用 ExecuteScalar 进行更新吗?

sql-server - 自动化 (DevOps) 部署具有大型数据集的 SQL Server 数据库

sql-server-2008 - 外键从位到整数

php - 如何在 Magento 列表产品页面上获取属性值的 ID 号?

c# - 在 Visual C# 中从数据库中检索数据

sql-server-2008 - SQL Server LEFT JOIN 无法匹配没有 JOIN 提示的行

mysql - 转换sql中的日期格式?