【问题标题】:No results when calling UDF within select statement在 select 语句中调用 UDF 时没有结果
【发布时间】:2019-09-26 13:27:29
【问题描述】:

使用 PHP 7.1,PDO,我正在尝试对远程 SQL Server 数据库运行查询,该数据库连接良好并且能够运行查询,在使用用户定义函数时接受。

当直接在 SQL Server 数据库上运行时,语句运行良好,只是通过 PHP 是一个问题。

我已经通过没有用户定义函数的 PHP 运行了它,并且工作正常,我得到了结果。

任何帮助都会很棒。

谢谢

$pdo = new \PDO(
            sprintf(
                "dblib:host=%s;dbname=%s",
                $server,
                $database
            ),
            $user,
            $pass
        );


$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$query = "
    select 
        acCode AS 'Ac Code', 
        acCompany AS 'Company Name',
        myDBName.myFunctionName(2020, 0, acCode) AS 'Balance'
    from 
        myDBName.CUSTSUPP
    where 
        acCustSupp = 'C' 
    and
        myDBName.myFunctionName(2020, 0, acCode) > 0
    order by 
        acCode";

$statement = $pdo->prepare($query);

$statement->execute();

$results = $statement->fetchAll(PDO::FETCH_ASSOC);

【问题讨论】:

  • 请发布您的 PHP 代码。可能myDBName.myFunctionName(2020, 0, acCode) > 0 应该是dbo.myFunctionName(2020, 0, acCode) > 0myDBName..myFunctionName(2020, 0, acCode) > 0。使用PHP,您可以轻松选择myDBName 数据库。谢谢。
  • 在 WHERE 子句中使用标量 UDF 会导致代码非常慢。它每次都必须读取整个表,避免任何并行处理,并收到简单使用标量 UDF 的性能影响。
  • 我已经用更新的代码更改了原始帖子。谢谢
  • 使用字符串文字作为列别名已经被弃用了很长时间。 sqlblog.org/2012/01/23/…

标签: php sql-server pdo


【解决方案1】:

UDF 通过指定所有者、名称和参数在 SELECT 语句中执行。在您的情况下,如果 myDBName 不是所有者名称,则需要将其更改为 dbo 或实际所有者。此外,您需要包含异常处理以获取实际的错误消息。

您可以根据问题中的代码尝试使用以下代码:

<?php

// PDO object
$server = "myserver";
$database = "myDBName";
$user = "myuser":
$pass = "mypassword";
try
    $pdo = new \PDO(
            sprintf(
                "dblib:host=%s;dbname=%s",
                $server,
                $database
            ),
            $user,
            $pass
        );
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die ("Error connecting. ".$e->getMessage());
}

// Statement
try
    $query = "
        select 
            acCode AS [Ac Code], 
            acCompany AS [Company Name],
            dbo.myFunctionName(2020, 0, acCode) AS [Balance]
        from 
            CUSTSUPP
        where 
            acCustSupp = 'C' 
        and
            dbo.myFunctionName(2020, 0, acCode) > 0
        order by 
            acCode";
    $statement = $pdo->prepare($query);
    $statement->execute();
    $results = $statement->fetchAll(PDO::FETCH_ASSOC);
    // ... Additional code here
} catch (PDOException $e) {
    die ("Error executing query. ".$e->getMessage());
}

// End
$statement = null;
$pdo = null;
?>

【讨论】:

  • 您好,我已经尝试了您的建议,但仍然没有成功。通过更改 myDBName,我收到以下错误 SQLSTATE[HY000]:一般错误:4121 找不到列“用户名”或用户定义的函数或聚合“xxxxUser.EntCustBalance”,或者名称不明确。 [4121](严重性 16)[(null)]26/09/2019 15:17:35 - 例外
  • 如果是所有者的问题,那么会不会抛出 PDO 异常来暗示这一点?奇怪的是我没有得到原始代码的错误。
  • @Kal 如果可能,请检查错误并发布它们。谢谢。
  • 我已经检查了所有可用区域,我认为可能存在 apache、php 错误并且什么都没有。使用 SQL Server 的经验有限,我在那里看到的日志文件没有显示任何内容。
  • @Kal 您需要确定用户$user 对该函数具有执行权限,并且该函数存在于$database 数据库中。您正在使用 SQL 身份验证连接到 SQL Server,这也是这种意外行为的可能原因。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
  • 1970-01-01
相关资源
最近更新 更多