首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将MySQL查询转换为Microsoft SQL Server

问将MySQL查询转换为Microsoft SQL Server
EN

Stack Overflow用户
提问于 2013-04-13 03:54:25
回答 2查看 2.6K关注 0票数 1

我需要将这个MySQL查询转换为SQL Server查询,其中语法'LIMIT ?, ?'是我的主要问题,因为它与SQL Server不兼容。

同时,我不知道SELECT FOUND_ROW()末尾的子句是什么意思。

我是数据库的初学者,所以我将感谢任何帮助。

代码语言:javascript
复制
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);

...
EN

回答 2

Stack Overflow用户

发布于 2013-04-13 04:25:27

如果MySQL为:

代码语言:javascript
复制
SELECT URL
  FROM SITE
  WHERE CITY='Berlin'
  LIMIT 30, 20

然后返回第31行到第50行。在SQL Server中,您可以执行以下操作:

代码语言:javascript
复制
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时,您需要用其他方法来计算行数,但是您应该能够解决这个问题。

票数 1
EN

Stack Overflow用户

发布于 2013-04-13 04:26:47

在MySQL中使用问号将参数绑定到语句。因此,根据您的代码,传递的参数是LIMIT函数要使用的偏移量和数量或记录。在我看来,它是在对结果进行分页。在您的SQL Server语句上尝试使用此SQL作为MySQL的替代

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15979814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档