0

我正在为我的应用程序使用 SubSonic SimpleRepository 模板。我在 VS2010 中创建了一个指向 SQL 2000 数据库的 ASP .NET WebForms 项目。

我遇到了一个问题,即 SubSonic 在参数化查询中始终使用 nvarchar 而不是 varchar。这会导致 SQL 执行索引扫描而不是索引查找。我从 Profiler 中获取了 SQL 并对其进行了更改,以使参数 varchar 类似于表的字段,并且它执行得非常快(<1 秒对 8 秒)。

来自 Profiler 的 SubSonic 查询

exec sp_executesql N'SELECT [t0].[ADDRESS_L1], [t0].[ADDRESS_L2], [t0].[ADDRESS_L3], [t0].[CITY], [t0].[COUNTRY] FROM [aveadmin].[SAPADD] AS t0 WHERE (([t0].[SITE_ID] = @p0) AND ((([t0].[ADDRESS_TYPE] = @p1) AND 1 <> 0) OR (([t0].[ADDRESS_TYPE] = @p2) AND 0 <> 0)))', N'@p0 nvarchar(16),@p1 nvarchar(2),@p2 nvarchar(2)', @p0 = N'BCF8A0A27E543EE1', @p1 = N'00', @p2 = N'03'

手动修改查询

exec sp_executesql N'SELECT [t0].[ADDRESS_L1], [t0].[ADDRESS_L2], [t0].[ADDRESS_L3], [t0].[CITY], [t0].[COUNTRY] FROM [aveadmin].[SAPADD] AS t0 WHERE (([t0].[SITE_ID] = @p0) AND ((([t0].[ADDRESS_TYPE] = @p1) AND 1 <> 0) OR (([t0].[ADDRESS_TYPE] = @p2) AND 0 <> 0)))', N'@p0 varchar(16),@p1 varchar(2),@p2 varchar(2)', @p0 = N'BCF8A0A27E543EE1', @p1 = N'00', @p2 = N'03' 

SITE_IDADDRESS_TYPEvarchars。_ 有没有办法强制查询使用varchar而不是nvarchar

4

2 回答 2

2

有没有办法强制查询使用 varchar 而不是 nvarchar?

您必须修改 SubSonic 的源代码才能更改此行为。

于 2011-03-16T16:35:30.220 回答
0

[之前的答案是正确的——更多细节如下。]

nvarchar 的使用被硬编码在 Sql2005Schema.cs 中名为 GetNativeType() 的函数中。修补和重建很容易。嘿,这是OSS!这就是源代码的用途!

这是代码。

            case DbType.AnsiString:
            case DbType.AnsiStringFixedLength:
            case DbType.String:
            case DbType.StringFixedLength:
                return "nvarchar";

理论上,生成的代码(请参阅 SQLServer.ttinclude)实际上确实将 DbType.AnsiString 和 DbType.String 生成为单独的类型。应该可以拆分 switch 语句并为一个生成“varchar”,为另一个生成“nvarchar”。也许作者认为这无关紧要。我建议你试一试(但它可能会破坏单元测试)。

于 2012-01-14T09:39:03.907 回答