PHP PDO中的行组MSSQL查询

时间:2014-04-12 00:03:54

标签: php sql sql-server pdo

我一直试图让这个查询工作太久了,我觉得是时候寻求帮助了。我目前正在尝试使用PDO连接类型从PHP脚本查询MSSQL数据库。我试图从某些值之间的行中获取所有内容(这里是100和200)。这是我试图运行的查询。

SELECT TOP 100 Id, CreateDate, cast(XmlBody as varchar(max))
as XmlBody, ObjectType, Tag, Name
FROM Table WHERE ObjectType LIKE 'StaffPersonal' AND BETWEEN 100
AND 200

我通常使用MYSQL,因此我对MSSQL的正确语法有点遗失(LIKE关键字是一个残酷的教训)。此查询引发了一般语法错误。

  

例外' PDOException'消息' SQLSTATE [HY000]:常规错误:   156常规SQL Server错误:检查来自SQL Server的消息[156]   (严重程度15)

我不确定导致此错误的是什么,但它让我发疯。 在此先感谢您的帮助,我们非常感谢。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,并且您正试图从更大的记录集中获取100到200的记录。您可以使用以下声明。

SELECT * FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY Id ) AS RowNum, Id, CreateDate, cast(XmlBody as varchar(max)) as XmlBody, ObjectType, Tag, Name FROM Table WHERE ObjectType = 'StaffPersonal' ) AS RowConstrainedResult WHERE RowNum >= 100 AND RowNum < 201 ORDER BY RowNum

以上查询使用子查询并根据Id字段(按Id排序)分配行号,然后过滤行号100到200的结果集。

如果您想使用BETWEEN运算符

,也可以使用以下where语句
WHERE RowNum BETWEEN 100 AND 200 

之间需要一个字段。在这种情况下,您需要ROW_NUMBER()函数来为您提供。我还将LIKE更改为=以使其更有效率,因为您正在寻找完全匹配。

SQLFiddle

上试用简化版

表和数据创建

CREATE TABLE supportContacts 
(
 id int  primary key, 
 type varchar(20), 
 details varchar(30)
);

INSERT INTO supportContacts
(id, type, details)
VALUES
(1,'Email', 'admin@sqlfiddle.com'),
(2,'Twitter', '@sqlfiddle'),
(3,'Twitter2', '@sqlfiddle'),
(4,'Twitter3', '@sqlfiddle');

并选择查询

SELECT  *
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY Id ) AS RowNum, Id, type, details
      FROM      supportContacts
      WHERE     type = 'twitter'
    ) AS RowConstrainedResult
--WHERE   RowNum >= 1
--    AND RowNum < 2
WHERE RowNum BETWEEN 1 AND 2 
ORDER BY RowNum