【问题标题】:PHP PDO MSSQL ROW_NUMBER() errorPHP PDO MSSQL ROW_NUMBER() 错误
【发布时间】:2014-05-18 02:15:16
【问题描述】:

我正在使用带有 SQL Server Native Client 11.0 的 php pdo 作为驱动程序。 显然我不能使用 LIMIT 子句,因为它是专有的,并且在尝试解决选择行范围时我一直遇到问题。

我的设置如下:

$statement = "SELECT ROW_NUMBER() OVER (ORDER BY USERS.name DESC) AS RowNum,  CASE.no, CASE.type, CASE.date,    CASE.ju, USERS.name, TBRLMF.rd_rl_description FROM dbo.CASE INNER JOIN dbo.USERS ON dbo.CASE.no = dbo.USERS.case_no INNER JOIN dbo.CMSTBRLMF ON dbo.USERS.relationship = dbo.TBRLMF.code ";

if($exact == 'checked'){
$exact = '=';
}else{
$exact = 'LIKE';
}
if($searchtype == 'users'){
$statement .= " WHERE USERS.name $exact '%$searchstring%'";
}else{
$statement .= " WHERE USERS.no $exac '%$searchstring%'";
}
$statement .= " AND RowNum BETWEEN :offset AND :max";

$statement  = $dbh->prepare($statement);
$statement->bindParam(':offset', $offset, PDO::PARAM_INT);
$statement->bindParam(':max', $max, PDO::PARAM_INT);

只要我不包含代码行:

$statement .= " AND RowNum BETWEEN :offset AND :max";

它工作正常,但给了我所有的数据。

当包含该行时,我收到以下错误:-

使用消息“SQLSTATE[42S22] 捕获异常“PDOException”:找不到列:207 [Microsoft][SQL Server Native Client 11.0][SQL Server]列名“RowNum”无效。 (SQLExecute[207] at ext\pdo_odbc\odbc_stmt.c:254)' 在 C:\pub\test\Classes\Core.php:44

我不知所措,MSSQL 对我来说是新的。

非常感谢您的帮助。

【问题讨论】:

    标签: php sql-server pdo


    【解决方案1】:

    该列上的谓词不能在 WHERE 子句中。 (WHERE 子句中的谓词在访问行时进行评估;该表达式(分析函数)的值在访问行之前不可用。

    您可以在 HAVING 子句中引用列别名:

    " HAVING RowNum BETWEEN ... ";
    

    【讨论】:

      【解决方案2】:

      您不能在 WHERE 子句中使用 COLUMN ALIAS(在您的情况下为 RowNum)。而是使用如下所示的派生表更改您的查询

      SELECT * FROM
      (
      SELECT ROW_NUMBER() OVER (ORDER BY USERS.name DESC) AS RowNum,  
      CASE.no, 
      CASE.type, 
      CASE.date,    
      CASE.ju, 
      USERS.name, 
      TBRLMF.rd_rl_description 
      FROM dbo.CASE 
      INNER JOIN dbo.USERS 
      ON dbo.CASE.no = dbo.USERS.case_no 
      INNER JOIN dbo.CMSTBRLMF 
      ON dbo.USERS.relationship = dbo.TBRLMF.code 
      WHERE USERS.name LIKE '%string%'
      AND USERS.no LIKE '%string%'
      ) X 
      WHERE RowNum BETWEEN 1 AND 10;
      

      编辑:

      您还可以使用 CTE(通用表表达式)来解决这个问题,如下所示

      创建 CTE

      WITH NEWCTE AS
      (
          SELECT ROW_NUMBER() OVER (ORDER BY USERS.name DESC) AS RowNum,  
          CASE.no, 
          CASE.type, 
          CASE.date,    
          CASE.ju, 
          USERS.name, 
          TBRLMF.rd_rl_description 
          FROM dbo.CASE 
          INNER JOIN dbo.USERS 
          ON dbo.CASE.no = dbo.USERS.case_no 
          INNER JOIN dbo.CMSTBRLMF 
          ON dbo.USERS.relationship = dbo.TBRLMF.code 
          WHERE USERS.name LIKE '%searchstring%'
          AND USERS.no LIKE '%searchstring%'
      )
      

      查询 CTE

      SELECT * 
      FROM NEWCTE
      WHERE RowNum BETWEEN 1 AND 10
      

      【讨论】:

      • 按照该方法返回另一个 pdo 错误未捕获异常 'PDOException' 并带有消息 'SQLSTATE[07002]: COUNT 字段不正确:0 [Microsoft][SQL Server Native Client 11.0]COUNT 字段不正确或语法错误( SQLExecute[0] at ext\pdo_odbc\odbc_stmt.c:254)' in C:\pub\test\Classes\Core.php:45 php45 就是执行 pdo 语句的地方
      • @BarryHamilton,我不知道 PHP PDO;已经回答了这个问题,只是因为问题出在您的查询上,如果您在 SQL Server 中按原样运行发布的查询,它将完美运行。您得到的错误可能与 PHP 相关。无论如何,尝试一次编辑过的查询。
      • 我尝试逐字执行您的代码,但 mssql 服务器拒绝了它。
      • @BarryHamilton, rejected it 不太清楚。你到底得到了什么错误?
      • @BarryHamilton,哦,伙计!您是否按原样运行查询?发布的查询是根据您发布的代码。在 SQL Server 中运行时,您应该替换那些 $searchstring$exact PHP 变量。无论如何,使用 CTE 提供了另一种选择。检查编辑的答案。
      猜你喜欢
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 2012-03-31
      • 2015-08-23
      • 2016-10-19
      • 2014-02-03
      • 2013-01-02
      • 2021-06-22
      相关资源
      最近更新 更多