2014-04-12 39 views
0

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

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关键字是一个残酷的教训)。此查询引发一般性语法错误。

exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 156 General SQL Server error: Check messages from the SQL Server [156] (severity 15)

我不确定是什么原因导致了这个错误,但它让我发疯。 在此先感谢您的帮助,它是真正的赞赏。

回答

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

您也可以使用below where语句中是否要使用BETWEEN运算符

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', '[email protected]'), 
(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 
+0

@ user3525480 感谢您回应的简化版本,和你正确认识我。我试过这个查询,现在我得到了SQL错误207:RowNum上的列名无效。这绝对是一个MSSQL服务器,所以我不确定为什么ROW_NUMBER不能正常工作。 – hugmungus

+0

我不知道为什么你会得到这个错误。我在sqlfiddle上的查询的简化版本上试过我的查询,它工作正常,你确定没有拼写错误等?我在我的原始消息中添加了用于在sqlfiddle上测试它的代码 – poaca

+0

是的,我敢肯定没有输入错误,因为我可以运行查询,如果我离开BETWEEN和ROW_NUMBER的东西。我将尝试使用mssql_connect而不是PDO,并查看它是否与此相关。 – hugmungus