使用 PDO 驱动程序 PHP 在 sql-server 查询中循环

Posted

技术标签:

【中文标题】使用 PDO 驱动程序 PHP 在 sql-server 查询中循环【英文标题】:While loop in a sql-server query using PDO driver PHP 【发布时间】:2019-07-23 13:29:31 【问题描述】:

我正在尝试查询 sql-server 数据库,通过 Microsoft for php 的 PDO 驱动程序进行 while 循环,但它没有循环,它只返回一行。

我尝试在 Microsoft SQL Server Managment Studio 中进行相同的查询,并确实得到了结果,我的意思是,它迭代并获取了所有行。

Declare @startDate Datetime
Declare @finishDate Datetime
set @startDate = '2019-07-01 06:00:00.000'
set @finishDate = '2019-07-23 06:00:00.000'

Declare @date01 Datetime
Declare @date02 Datetime
set @date01 = @startDate 
set @date02 = @date01 + 1

WHILE @date01 < @finishDate 
BEGIN
    SELECT
        SUM ([col1] * [col2]) as 'val'
    FROM table
    Where [colDateTime] >= @date01 
            and [colDateTime] <= @date02 

    SET @date01 = @date01 + 1;
    SET @date02 = @date02 + 1;
END;

当通过 PDO 进行查询时,我只得到一行,但我应该得到 23 行。

【问题讨论】:

你的sql有错误,comma就在FROM table之前 您是否复制过此代码?我想不会,因为有这个错误 @GuidoG ye 我在示例中提供了该代码,这不是我正在使用的,而是主要结构 那么这段代码的结果将是一行一行,因为即使你循环很多次,结果每次都不会保存在任何地方,所以你只能得到最后一个的结果在循环中执行查询 一开始为什么要循环播放?众所周知,RDBMS 中的循环速度很慢。 【参考方案1】:

就像我在 cmets 中提到的那样,使用 WHILE 在这里似乎是错误的想法。 SQL Server 中的循环非常慢,当数据集方法要提供更高性能的结果时,应避免循环。

如果我正确理解您的目标,您可以使用 Tally Table(我在这里使用 Inline)来创建所有日期,然后像这样一次性完成所有操作:

DECLARE @startDate datetime;
DECLARE @finishDate datetime;
SET @startDate = '2019-07-01T06:00:00.000';
SET @finishDate = '2019-07-23T06:00:00.000';

DECLARE @D int = DATEDIFF(DAY, @startDate, @finishDate)+1;

WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
    SELECT TOP (@D) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 AS I
    FROM N N1, N N2, N N3), --1,000 days max
Dates AS(
    SELECT DATEADD(DAY, T.I, @startDate) AS StartDate,
           DATEADD(DAY, T.I+1, @startDate) AS FinishDate
    FROM Tally T)
SELECT D.StartDate,
       SUM(T.[col1] * T.[col2]) AS Val
FROM Dates D
     JOIN [table] t ON t.colDateTime >= D.StartDate
                   AND t.colDateTime < D.FinishDate
GROUP BY D.StartDate;

如果您想要一行,无论该日期是否有值,然后将JOIN 更改为LEFT JOIN(并将SUM 包装在ISNULL 中)。

【讨论】:

让我调查一下 Tally Table,看看这是否是我需要的。但我不太确定,因为我应该创建一个表,这也不是想法。 我没有在上面创建表格,@mathiasminacapilli 我想了解您的查询,表 S 在哪里定义?因为您选择了SELECT S.StartDate,但我找不到那张桌子在哪里。谢谢您的帮助! 一定是错过了按键,应该是D,已更正,@mathiasminacapilli。如果没有样本数据,我没有测试 SQL 本身。

以上是关于使用 PDO 驱动程序 PHP 在 sql-server 查询中循环的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中通过 ODBC(使用 PDO)查询雪花返回不正确的数据

如何在不使用 PDO 或 PHP 应用程序绑定的情况下解决二阶 SQL 注入

在 PHP 中设置 SQLite3 PDO 驱动程序

php中Oracle的程序与PDO

如何在 Eclipse PHP 上使用 PDO MySQL 并在 PHP CLI 应用程序中运行?

如何在 php 中启用 sqlite3 的 PDO 驱动程序?