문제

몇 시간이 지난 후 마침내 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로 설정됩니다.

Count 또는 Row_number 함수를 사용하지 않고 SQL Server의 결과를 이례하는 방법을 아는 사람이 있습니까?

도움이 되었습니까?

해결책 2

.NET 3.5의 SQL 캐시 종속성은 간단한 쿼리에만 작동합니다. 아마 .net 4가 나를 놀라게 할 것입니다.

다른 팁

캐시 크기가 충분하지 않습니다.

1- 스프로크 결과를 캐시하는 데 실제로 사용하는 코드를 복사하여 붙여 넣을 수 있습니까? 2- 문자열을 실행하는 대신 직선 쿼리를 사용하는 스프로크를 사용해 보셨습니까?

예 #2는 쿼리 구조를 즉석에서 변경할 수 없다는 것을 의미하지만 :-) #1에서 자신의 캐싱 기준을 계산하지 않는 한 일반적으로 캐싱의 규칙입니다. 캐싱 메커니즘은 결코 당신의 exec의 문자열을 구문 분석하지 않습니다.

Sproc에서 문자열을 실행하면 SPROC가 SQL Server 자체에 대해서도 각 실행에 동전을 완전히 던지게합니다. 또한 쿼리가 여전히 실행 시간에 문자열로 구성되고 있기 때문에 스크립트 분사 공격에 열려 있습니다. C#의 전체 문자열을 구성하고 "내부에 무엇이든간에 모든 것을 실행하기 위해"스프로로 전달하는 것과 다르지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top