0

SQL Server プロシージャがあり、mysql で動作するように変換する必要があります。

以下は、私が試したMysql変換手順ですが、完全ではありません...

DELIMITER $$

DROP PROCEDURE IF EXISTS `SelectjqGridUsers` $$
CREATE PROCEDURE `SelectjqGridUsers` (IN PageIndex INT,IN SortColumnName VARCHAR(50),IN SortOrderBy VARCHAR(4) ,IN NumberOfRows INT ,OUT TotalRecords INT)

BEGIN

 DECLARE StartRow INT;
 DECLARE CTE VARCHAR(100);

 SELECT  TotalRecords = ( SELECT COUNT(1) FROM  Users );

 SET StartRow = (PageIndex * NumberOfRows ) + 1 ;


END $$

DELIMITER ;

これが私の元のSQL Serverプロシージャです。

CREATE PROC [SelectjqGridUsers]
@PageIndex INT ,
@SortColumnName VARCHAR(50) ,
@SortOrderBy VARCHAR(4) ,
@NumberOfRows INT ,
@TotalRecords INT OUTPUT
AS 
BEGIN

    SET NOCOUNT ON 

    SELECT  @TotalRecords = ( SELECT    COUNT(1)
                              FROM      [Users]
                            )

    DECLARE @StartRow INT
    SET @StartRow = ( @PageIndex * @NumberOfRows ) + 1 ;


    WITH    CTE
              AS ( SELECT   ROW_NUMBER() OVER ( ORDER BY CASE
                                                          WHEN @SortColumnName = 'UserID'
                                                          AND @SortOrderBy = 'asc'
                                                          THEN UserID
                                                         END ASC, CASE
                                                          WHEN @SortColumnName = 'UserID'
                                                          AND @SortOrderBy = 'desc'
                                                          THEN UserID
                                                          END DESC, CASE
                                                          WHEN @SortColumnName = 'UserName'
                                                          AND @SortOrderBy = 'asc'
                                                          THEN UserName
                                                          END ASC, CASE
                                                          WHEN @SortColumnName = 'UserName'
                                                          AND @SortOrderBy = 'desc'
                                                          THEN UserName
                                                          END DESC, CASE
                                                          WHEN @SortColumnName = 'FirstName'
                                                          AND @SortOrderBy = 'asc'
                                                          THEN FirstName
                                                          END ASC, CASE
                                                          WHEN @SortColumnName = 'FirstName'
                                                          AND @SortOrderBy = 'desc'
                                                          THEN FirstName
                                                          END DESC , CASE
                                                          WHEN @SortColumnName = 'MiddleName'
                                                          AND @SortOrderBy = 'asc'
                                                          THEN MiddleName
                                                          END ASC, CASE
                                                          WHEN @SortColumnName = 'MiddleName'
                                                          AND @SortOrderBy = 'desc'
                                                          THEN MiddleName
                                                          END DESC , CASE
                                                          WHEN @SortColumnName = 'LastName'
                                                          AND @SortOrderBy = 'asc'
                                                          THEN LastName
                                                          END ASC, CASE
                                                          WHEN @SortColumnName = 'LastName'
                                                          AND @SortOrderBy = 'desc'
                                                          THEN LastName
                                                          END DESC, CASE
                                                          WHEN @SortColumnName = 'EmailID'
                                                          AND @SortOrderBy = 'asc'
                                                          THEN EmailID
                                                          END ASC, CASE
                                                          WHEN @SortColumnName = 'EmailID'
                                                          AND @SortOrderBy = 'desc'
                                                          THEN EmailID
                                                          END DESC ) AS RN ,
                            UserID ,
                            UserName ,
                            FirstName ,
                            MiddleName ,
                            LastName ,
                            EmailID
                   FROM     [Users]
                 )
        SELECT  UserID ,
                UserName ,
                FirstName ,
                LastName ,
                MiddleName ,
                EmailID
        FROM    CTE
        WHERE   RN BETWEEN @StartRow - @NumberOfRows
                   AND     @StartRow - 1

    SET NOCOUNT OFF


END

誰か私がこれを終わらせるのを手伝ってくれませんか?

4

1 に答える 1

1

まず、MySQLには CTE (WITHステートメントの先頭にある句) に直接相当するものはありません。の正確な代替品もありませんROW_NUMBER()

ただし、人間の言語で書かれた文が、必ずしも単語ごとに別の言語に翻訳されるとは限らないという事実を理解し、(できれば) 受け入れることができます。同様に、ある種類の SQL で記述された SQL クエリは、別のさまざまな句 for 句に変換されない場合があり、変換する必要もありません。クエリを変換するには、同じように重要な 2 つのことが必要です。それは、クエリの機能を理解すること、対象となるさまざまな SQL に対応できることです。

変換中のストアド プロシージャは、特定のテーブルの動的に並べ替えられた行の動的ページングを実装します。

ページングに関しては、MySQL がそのLIMIT ... OFFSET ...機能で行うように、SQL Server にはネイティブ構文がありません。そのためのおそらく最も典型的な回避策は、ここでも確認できるように、ROW_NUMBER()関数とサブセレクトを使用することです (この場合、サブセレクトはたまたま CTE の形式をとっています)。それはどのように機能しますか?ROW_NUMBER()特定の並べ替え基準に基づいて、サブクエリのすべての行に番号を割り当てます。メイン クエリは、それらの番号をフィルタリングして一連の行をフェッチするだけで、効果的にページを提供します。

LIMIT ...ストアド プロシージャのコンテキストで使用するとOFFSET ...、整数型のパラメーターまたはローカルの整数型の変数を引数として受け入れることができるため、MySQL ではそのようなものは何も必要ありません。MySQL 5.5.6+ を使用している場合)。

動的並べ替えに関しては、SQL Server ではROW_NUMBER()動的ページングと組み合わせて使用​​されるため、並べ替えを関数に適用する必要がありました。しかし、MySQL では、ROW_NUMBER()'sORDER BY節を (メイン) クエリに直接移動するだけです。

SELECTしたがって、最終的には、ストアド プロシージャのクエリに代わるものとして、次のように思いつきました。

SELECT  UserID ,
        UserName ,
        FirstName ,
        LastName ,
        MiddleName ,
        EmailID

FROM    Users

ORDER BY
        CASE WHEN @SortColumnName = 'UserID'     AND @SortOrderBy = 'asc'  THEN UserID     END ASC,
        CASE WHEN @SortColumnName = 'UserID'     AND @SortOrderBy = 'desc' THEN UserID     END DESC,
        CASE WHEN @SortColumnName = 'UserName'   AND @SortOrderBy = 'asc'  THEN UserName   END ASC,
        CASE WHEN @SortColumnName = 'UserName'   AND @SortOrderBy = 'desc' THEN UserName   END DESC,
        CASE WHEN @SortColumnName = 'FirstName'  AND @SortOrderBy = 'asc'  THEN FirstName  END ASC,
        CASE WHEN @SortColumnName = 'FirstName'  AND @SortOrderBy = 'desc' THEN FirstName  END DESC,
        CASE WHEN @SortColumnName = 'MiddleName' AND @SortOrderBy = 'asc'  THEN MiddleName END ASC,
        CASE WHEN @SortColumnName = 'MiddleName' AND @SortOrderBy = 'desc' THEN MiddleName END DESC,
        CASE WHEN @SortColumnName = 'LastName'   AND @SortOrderBy = 'asc'  THEN LastName   END ASC,
        CASE WHEN @SortColumnName = 'LastName'   AND @SortOrderBy = 'desc' THEN LastName   END DESC,
        CASE WHEN @SortColumnName = 'EmailID'    AND @SortOrderBy = 'asc'  THEN EmailID    END ASC,
        CASE WHEN @SortColumnName = 'EmailID'    AND @SortOrderBy = 'desc' THEN EmailID    END DESC

LIMIT   NumberOfRows
OFFSET  StartRow
;

ただし、問題が 1 つあります。LIMITandのパラメータ化は、(パラメータまたは変数への)単一OFFSET参照の形式でのみ行うことができます。つまり、そこでを使用することはできません。そのため、単純に上記を使用する必要がありました。ただし、次のようにステートメントを変更しない限り、SQL Server バージョンによって返されるページとは異なるページが表示されます。OFFSET StartRowSET StartRow

SET StartRow = (PageIndex - 1) * NumberOfRows + 1 ;
于 2013-01-23T09:55:26.807 に答える