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

50SQL Server クエリの は MySQLLIMIT値の合計であり、 30MySQL の はインデックスが 0であるため、カウンターのインデックスが 131である SQL Server になります。ROW_NUMBER以下のコメントでこれを指摘してくれた Kevin Thatlicki に感謝します。

また、MySQL クエリとは異なり、SQL Server クエリで行を並べ替える必要があることに注意してください。

最後に、関数SQL_CALC_FOUND_ROWSを有効にする MySQL キーワードです。ドキュメントFOUND_ROWS()で説明されています。SQL Server に相当するものはありません。コードで設定するには別の方法で行をカウントする必要がありますが、それを回避できるはずです。this.noOfRecords

于 2013-04-12T20:25:27.487 に答える
0

疑問符は、MySQL でパラメーターをステートメントにバインドするために使用されます。したがって、コードに基づいて、渡されるパラメーターは、LIMIT 関数で使用されるオフセットと数またはレコードです。結果をページングしているように思えます。MySQL の代わりとして、SQL Server ステートメントでこの SQL を試してください。

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 に答える