经过几个小时,我终于意识到我在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的结果进行分页?
答案 0 :(得分:1)
缓存大小不足。
答案 1 :(得分:1)
.NET 3.5的SQL缓存依赖项仅适用于简单查询。也许.NET 4会让我感到惊讶。
答案 2 :(得分:0)
1 - 你可以复制&粘贴您实际使用的代码来缓存该sproc的结果? 2 - 您是否尝试使用直接查询而不是执行字符串的sproc?
是#2意味着您无法动态更改查询的结构:-)但除非您在#1中计算自己的缓存条件,否则您必须遵守缓存规则。没有缓存机制可以解析来自您的EXEC字符串。
在sproc中执行一个字符串,即使对于SQL Server本身,每次运行也会使该sproc总共抛出一个硬币。它还让您对脚本注入攻击持开放态度,因为您的查询在运行时仍由字符串组成 - 它与在C#中编写整个字符串并将其传递给sproc以“只是EXEC内部的任何内容”没有任何不同