我需要将这个MySQL查询转换为SQL Server查询,其中语法'LIMIT ?, ?'是我的主要问题,因为它与SQL Server不兼容。
同时,我不知道SELECT FOUND_ROW()末尾的子句是什么意思。
我是数据库的初学者,所以我将感谢任何帮助。
SELECT SQL_CALC_FOUND_ROWS TITLE, URL FROM SITE WHERE CITY='Berlin' LIMIT ?, ?
...
stmt.setInt(1, offset);
stmt.setInt(2, numRecords);
...
rs = stmt.executeQuery("SELECT FOUND_ROWS()");
if (rs.next())
this.noOfRecords = rs.getInt(1);
...发布于 2013-04-13 04:25:27
如果MySQL为:
SELECT URL
FROM SITE
WHERE CITY='Berlin'
LIMIT 30, 20然后返回第31行到第50行。在SQL Server中,您可以执行以下操作:
WITH somerows AS (
SELECT TOP 50 URL, ROW_NUMBER() OVER (ORDER BY URL) AS SeqValue
FROM SITE
WHERE CITY='Berlin'
)
SELECT * FROM somerows
WHERE SeqValue BETWEEN 31 and 50请注意,SQL Server查询中的50是MySQL LIMIT值的总和,并且MySQL中的30是零索引的,因此在SQL Server中它变为31,而SQL Server中的ROW_NUMBER计数器是1索引的。非常感谢Kevin Suchlicki在下面的评论中指出这一点。
还要注意,与MySQL查询不同,您必须使用SQL Server查询对行进行排序。
最后,SQL_CALC_FOUND_ROWS是一个启用FOUND_ROWS()功能的MySQL关键字。documentation中对此进行了解释。没有SQL Server的等价物。在代码中设置this.noOfRecords时,您需要用其他方法来计算行数,但是您应该能够解决这个问题。
发布于 2013-04-13 04:26:47
在MySQL中使用问号将参数绑定到语句。因此,根据您的代码,传递的参数是LIMIT函数要使用的偏移量和数量或记录。在我看来,它是在对结果进行分页。在您的SQL Server语句上尝试使用此SQL作为MySQL的替代
DECLARE @offset INT
DECLARE @numRecords INT
SET @offset = 1
SET @numRecords = 2
SET ROWCOUNT @numRecords
WITH RowsResult AS
(
SELECT ROW_NUMBER() OVER (ORDER BY TITLE) AS RowNum,
TITLE,
URL
FROM [SITE]
WHERE CITY='Berlin'
ORDER BY TITLE
)
SELECT TITLE
FROM URL
WHERE RowNum > @offset
SET ROWCOUNT 0https://stackoverflow.com/questions/15979814
复制相似问题