なぜ、ストアドプロシージャは、SQLキャッシュの依存関係を無効にしますか?
-
20-09-2019 - |
質問
多くの時間後、私は最終的に私は私の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はそう問題は、私はよくサポートされていません知っているCOUNT(*)関数からではないことを確認することができます値10をパラメータ与えます。
私はSQL Server Management Studioのから、それを実行したときにも、それはそれが何をすべきまさにありません。 ASP.NETアプリケーションでは結果が正しく取得され、キャッシュのみが動作するように何とかできない!
あなたが助けてくださいことはできますか?
たぶんヒント
私は、依存関係プロパティをHASCHANGED理由は、ROW_NUMBERから生成された列の行は一時的なものであり、したがって、SQL Serverは結果が変更されているかどうかを言うことができないという事実に関係していると信じています。 HASCHANGEDは常にtrueに設定されている理由です。
誰もがCOUNTまたはROW_NUMBER関数を使用せずにSQL Serverから結果をページ分割する方法を知っていますか?
解決 2
.NET 3.5のためのSQLキャッシュ依存関係は単純なクエリのために動作します。たぶん、.NET 4には、私を驚かせるでしょう。
他のヒント
十分ではありませんキャッシュサイズます。
1 - あなたは、あなたが実際にそのSPROCの結果をキャッシュするために使用するコードをコピー&ペーストすることができますか? 2 - あなたがあなたの代わりにEXEC-INGの文字列のまっすぐなクエリを使用SPROCを試してみました。
?はい#2はあなたが:-)場でクエリの構造を変更することはできませんことを意味しますが、あなたは、一般的に遵守する必要がキャッシングのルールの第1位で、独自のキャッシュ基準を計算している場合を除きます。いいえキャッシュメカニズムは、これまであなたからEXECから文字列を解析するつもりはありません。
EXEC-INGのSPROC内の文字列はそれぞれ、すべてのコインの合計トスは、SQL Serverの自身のためにも、SPROCを実行することになります。あなたのクエリがまだ実行時に文字列で構成されているので、それはまた、あなたがスクリプトインジェクション攻撃に開く葉 - それはSPROCするC#で文字列全体を構成し、それを渡してから、何が違うのではないのですが「ただ内部にあるものは何でもEXEC」