我一直试图让这个查询工作太久了,我觉得是时候寻求帮助了。我目前正在尝试使用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)
我不确定导致此错误的是什么,但它让我发疯。 在此先感谢您的帮助,我们非常感谢。
答案 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更改为=以使其更有效率,因为您正在寻找完全匹配。
上试用简化版表和数据创建
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