使用 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 注入