将MySQL查询转换为Microsoft SQL Server

时间:2013-04-12 19:54:25

标签: mysql sql-server database

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

...

2 个答案:

答案 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