Ech*_*lon 5 .net sql sql-server ado.net sql-server-2008
我正在尝试使用SQL Server 2008R2从ADO.NET运行查询.我使用的是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)
Run Code Online (Sandbox Code Playgroud)
我正在使用一些类似的条款,这就是我的原因OPTION RECOMPILE
.如果我通过SSMS声明参数并运行如下:
declare @postcode varchar(10) = 'SW1 1AA';
declare @Offset int = 0;
declare @Limit int = 10;
Run Code Online (Sandbox Code Playgroud)
我的响应时间非常快(不到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
Run Code Online (Sandbox Code Playgroud)
如果只有第一个查询返回虽然几行,我把@Offset
和@Limit
过滤,我得到一个体面的响应时间.有没有办法可以加快速度并使用分页?
编辑:我传入@postcode
参数(这是.NET中的一个字符串:
cmd.Parameters.AddWithValue("@Postcode", normalizedPostcode)
Run Code Online (Sandbox Code Playgroud)
您的ADO.NET代码传入的参数与您在SSMS中测试的数据类型不同,并且您将收到隐式转换问题.
不要用
cmd.Parameters.AddWithValue("@postcode", normalizedPostcode)
Run Code Online (Sandbox Code Playgroud)
因为这将自动创建一个nvarchar
参数,您将在执行计划中获得隐式转换,这意味着无法使用索引.而是传递明确创建的varchar
类型参数.
cmd.Parameters.Add("@postcode", SqlDbType.Varchar, 10)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1122 次 |
最近记录: |