1

我需要将此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);

...
4

2 回答 2

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 查询中的 是 MySQL值50的总和,并且MySQL 中的 是零索引的,因此它在 SQL Server 中变成了计数器是一索引的。非常感谢 Kevin Suchlicki 在下面的评论中指出这一点。LIMIT3031ROW_NUMBER

另请注意,与 MySQL 查询不同,您必须使用 SQL Server 查询对行进行排序。

最后,SQL_CALC_FOUND_ROWS是启用该FOUND_ROWS()功能的 MySQL 关键字。它在文档中进行了解释。没有等效的 SQL Server。您需要以其他方式this.noOfRecords在代码中设置行数,但您应该能够解决这个问题。

于 2013-04-12T20:25:27.487 回答
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
于 2013-04-12T20:26:47.017 回答