gpt4 book ai didi

.net - ADO.NET 超时但在 SSMS 中工作正常

转载 作者:行者123 更新时间:2023-12-02 22:52:21 26 4
gpt4 key购买 nike

我正在尝试使用 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)

我使用了一些类似的子句,这就是为什么我有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)

最佳答案

您的 ADO.NET 代码正在传递参数 a different datatype与您在 SSMS 中测试的版本相比,您会遇到隐式转换问题。

不要使用

cmd.Parameters.AddWithValue("@postcode", normalizedPostcode)

因为这将自动创建一个 nvarchar 参数,并且您将在执行计划中获得隐式强制转换,这意味着无法使用索引。而是传入 varchar 类型的显式创建参数。

cmd.Parameters.Add("@postcode", SqlDbType.Varchar, 10)

关于.net - ADO.NET 超时但在 SSMS 中工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7875254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com