我正在尝试使用ADO.NET从SQL Server 2008R2运行查询。我正在使用CTE提供分页,并添加参数@Offset
和@Limit
,两者都是整数。
我根据用户输入构建参数化查询。最终输出如下:
;WITH Results_CTE AS (
SELECT ld.* , ROW_NUMBER() OVER (ORDER BY Key_Field) AS RowNum
FROM list..List_Data ld
WHERE VALUE_2010 IS NOT NULL
AND Postcode LIKE @Postcode + '%'
) SELECT * FROM Results_CTE
WHERE RowNum > @Offset AND RowNum < @Offset + @Limit
OPTION (RECOMPILE)
我正在使用一些like子句,这就是为什么我有OPTION RECOMPILE
。如果我通过SSMS声明参数并这样运行:
declare @postcode varchar(10) = 'SW1 1AA';
declare @Offset int = 0;
declare @Limit int = 10;
我得到了非常快的响应时间(小于1秒)。然而,如果我尝试使用ADO.NET,它会花费很长时间。我已经尝试使用以下两种方式添加参数:
cmd.Parameters.AddWithValue("@Offset", startRowIndex) // times out
cmd.Parameters.AddWithValue("@Limit", limit)
cmd.Parameters.Add(New SqlParameter("@Offset", SqlDbType.BigInt)) // also times out
cmd.Parameters.Item("@Offset").Value = startRowIndex
cmd.Parameters.Add(New SqlParameter("@Limit", SqlDbType.BigInt))
cmd.Parameters.Item("@Limit").Value = limit
如果第一个查询返回的行数很少,并且我删除了@Offset和@Limit过滤器,我可以获得相当不错的响应时间。有没有办法加快速度并使用分页呢?
编辑:我正在通过以下方式将@postcode参数(.NET中的字符串)传递进去:
cmd.Parameters.AddWithValue("@Postcode", normalizedPostcode)
@postcode
参数的代码吗? - Martin Smith