【问题标题】:PHP sqlsrv Stored procedure with Table result AND variable output causes crash具有表结果和变量输出的 PHP sqlsrv 存储过程导致崩溃
【发布时间】:2022-11-03 18:33:33
【问题描述】:

我有一个巨大的遗留存储过程,它输出一个表和 2 个变量。 这样做的原因是有时 SP 必须嵌套,并且为了避免嵌套 SP 错误,输出会以两种格式返回。

PHP v8 SQL 服务器 2017

SP的输入参数为:

ALTER PROCEDURE [dbo].[usp_QueryMileageDataFromPostcodes]
    (
        @Postcode1 VARCHAR(12) = NULL,
        @Postcode2 VARCHAR(12) = NULL,
        @Latitude1 FLOAT  = NULL,
        @Longitude1 FLOAT = NULL,
        @Latitude2 FLOAT = NULL,
        @Longitude2 FLOAT = NULL,
        @OutputDistanceMiles Float = NULL OUTPUT,
        @OutputDistanceKilometers Float = NULL OUTPUT
    )
AS
    SET NOCOUNT ON;
    SET ANSI_WARNINGS OFF;

....

** processing within stored procedure **

....

SET @OutputDistanceMiles = 
    (
        SELECT
            MilesValue
        FROM 
            @PostcodeMileage
        WHERE 
            (Meters IS NOT NULL)
    )

SET @OutputDistanceKilometers = 
    (
        SELECT
            KilometersValue
        FROM 
            @PostcodeMileage
        WHERE 
            (Meters IS NOT NULL)
    )

SELECT
    *
FROM 
    @PostcodeMileage
WHERE 
    (Meters IS NOT NULL)

我的 PHP 代码是:

$SQLStmt = "EXEC Postcodetools.dbo.usp_QueryMileageDataFromPostcodes @Postcode1='BH21 2SR',@Postcode2='HP234AB';";
$RS_Result01 = sqlsrv_query($conn01,$SQLStmt);
$ROW_test01 = sqlsrv_fetch($RS_Result01,SQLSRV_FETCH_ASSOC);

返回错误

Fatal error: Uncaught TypeError: sqlsrv_fetch(): Argument #1 ($stmt) must be of type resource, bool given in...

我进一步测试了:

$SQLStmt = "EXEC Postcodetools.dbo.usp_QueryMileageDataFromPostcodes @Postcode1='BH21 5PD',@Postcode2='HP23 4PD';";
$RS_Result01 = sqlsrv_query($conn01,$SQLStmt);
var_dump($RS_Result01);

这给了我bool(false)的结果

以这种方式运行的 sqlsrv 驱动程序和存储过程是否存在任何基本问题?

有没有办法让我获得表格输出?

【问题讨论】:

  • 第一个参数缺少结束引号。
  • 发现和编辑。谢谢你。但是,这是编写问题时的拼写错误,不会影响问题。
  • 问题不在于sqlsrv_fetch()。再次阅读错误消息:sqlsrv_fetch(): Argument #1 ($stmt) must be of type resource, bool given in[stead]。这意味着$RS_Result01 是一个布尔值,通过阅读sqlsrv_query() documentation 可以解释:成功时返回语句资源,如果发生错误则返回 false。

标签: php sql-server


【解决方案1】:

我可以确认在带有 PHP 驱动程序的存储过程中输出表和变量是一个可行的解决方案。

这个问题原来是隐藏在存储过程中的PRINT 语句。存储过程大约有 1000 行代码,PRINT 可能是开发人员在测试期间(十年前?)不小心留下的。 当程序在 SSMS 中运行时,它没有输出任何内容,因此返回了一个空行;除非您正在寻找它,否则不容易发现。

更令人困惑的是,传统的经典 ASP 页面使用的驱动程序可以愉快地返回记录集而不会出现问题。就这样跑了好几年。当我们将调用网页移植到 PHP 时,PRINT 语句导致了上面显示的错误,这就是我质疑驱动程序的原因。

非常感谢所有为这个问题做出贡献的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    • 2019-12-24
    • 2023-04-03
    • 2012-01-11
    • 2014-12-02
    • 2019-11-08
    相关资源
    最近更新 更多