数時間後、ようやく ASP.NET アプリケーションで Cache オブジェクトを正しく操作していることに気付きましたが、ストアド プロシージャが正しく機能しません。
このストアド プロシージャは正しく動作します。
CREATE PROCEDURE [dbo].[ListLanguages]
@Page INT = 1,
@ItemsPerPage INT = 10,
@OrderBy NVARCHAR (100) = 'ID',
@OrderDirection NVARCHAR(4) = 'DESC'
AS
BEGIN
SELECT ID, [Name], Flag, IsDefault FROM dbo.Languages
END
しかし、これ(私が欲しかったもの)はそうではありません:
CREATE PROCEDURE [dbo].[ListLanguages]
@Page INT = 1,
@ItemsPerPage INT = 10,
@OrderBy NVARCHAR (100) = 'ID',
@OrderDirection NVARCHAR(4) = 'DESC',
@TotalRecords INT OUTPUT
AS
BEGIN
SET @TotalRecords = 10
EXEC('SELECT ID, Name, Flag, IsDefault FROM (
SELECT ROW_NUMBER() OVER (ORDER BY ' + @OrderBy + ' ' + @OrderDirection + ') as Row, ID, Name, Flag, IsDefault
FROM dbo.Languages) results
WHERE Row BETWEEN ((' + @Page + '-1)*' + @ItemsPerPage + '+1) AND (' + @Page + '*' + @ItemsPerPage + ')')
END
@TotalRecords パラメーターに値 10 を指定したので、サポートされていないことを私が知っている COUNT(*) 関数が問題ではないことを確認できます。
また、SQL Server Management Studio から実行すると、本来あるべきことを正確に実行します。ASP.NET アプリケーションでは、結果は正しく取得されますが、キャッシュだけがなぜか機能しません!
助けていただけますか?
たぶんヒント
依存関係の HasChanged プロパティの理由は、ROW_NUMBER から生成された列 Row が一時的なものにすぎないため、SQL SERVER は結果が変更されたかどうかを判断できないことに関連していると思います。そのため、HasChanged は常に true に設定されています。
COUNT または ROW_NUMBER 関数を使用せずに SQL SERVER からの結果をページ分割する方法を知っている人はいますか?