我需要将此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);
...
答案 0 :(得分:1)
如果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
是零索引的,因此它变为{{1}在SQL Server中,31
计数器是一个索引的。非常感谢Kevin Suchlicki在下面的评论中指出这一点。
另请注意,与MySQL查询不同,您必须使用SQL Server查询对行进行排序。
最后,ROW_NUMBER
是启用SQL_CALC_FOUND_ROWS
功能的MySQL关键字。它在documentation中有所解释。没有SQL Server等价物。您需要在代码中以其他方式计算行以设置FOUND_ROWS()
,但您应该能够解决这个问题。
答案 1 :(得分:0)
问号在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 0