لماذا يقوم الإجراء المخزن بإبطال تبعية ذاكرة التخزين المؤقت SQL؟

StackOverflow https://stackoverflow.com/questions/1553735

سؤال

بعد عدة ساعات ، أدركت أخيرًا أنني أعمل بشكل صحيح مع كائن ذاكرة التخزين المؤقت في تطبيق ASP.NET الخاص بي ، لكن إجراءاتي المخزنة تمنعها من العمل بشكل صحيح.

يعمل هذا الإجراء المخزن بشكل صحيح:

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 ، يتم استرداد النتائج بشكل صحيح ، فقط ذاكرة التخزين المؤقت غير قادر على العمل بطريقة ما!

يمكنك الرجاء المساعدة؟

ربما تلميح

أعتقد أن السبب في أن خاصية التبعية ترتبط بحقيقة أن صف العمود الذي تم إنشاؤه من Row_number مؤقت فقط ، وبالتالي ، فإن خادم SQL غير قادر على تحديد ما إذا كانت النتائج قد تم تغييرها أم لا. لهذا السبب يتم ضبط Haschanged دائمًا على True.

هل يعرف أي شخص كيفية تراجع النتائج من SQL Server دون استخدام وظائف العد أو ROW_Number؟

هل كانت مفيدة؟

المحلول 2

SQL Cache التبعية لـ .NET 3.5 يعمل فقط للاستعلامات البسيطة. ربما .net 4 سوف يفاجئني.

نصائح أخرى

لا يكفي حجم ذاكرة التخزين المؤقت.

1 - هل يمكنك نسخ ولصق الرمز الذي تستخدمه بالفعل لتخزين نتائج تلك الأنفاس؟ 2 - هل جربت Sproc حيث تستخدم استعلامًا مستقيمًا بدلاً من exec -ing سلسلة؟

نعم رقم 2 يعني أنه لا يمكنك تغيير بنية الاستعلام أثناء الطيران :-) ولكن ما لم تكن تحسب معايير التخزين المؤقت الخاصة بك في رقم 1 ، فهذه هي قاعدة التخزين المؤقت التي يجب عليك الالتزام بها بشكل عام. لا توجد آلية للتخزين المؤقت على الإطلاق لتحليل سلسلة من Exec منك.

إن exec-exping سلسلة في sproc تجعل هذا التواء إجمالي عملة معدنية على كل تشغيل حتى بالنسبة لخادم SQL نفسه. كما أنه يتركك مفتوحًا لهجمات حقن البرامج النصية نظرًا لأن استعلامك لا يزال يتألف من الأوتار في وقت التشغيل - لا يختلف الأمر عن تأليف السلسلة بأكملها في C# وتمريرها إلى "مجرد تنفيذ كل ما في الداخل".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top