0

我在 SQL Server 2008 中,我一直在努力让一些旧代码使用参数,而不是使用字符串连接构建查询。我还在努力通过向表中添加索引等事情来加快工作速度。

我正在使用的表有很多列(它是星型模式报告数据库的核心)并且有超过 4M 行。表的创建如下所示:

CREATE TABLE [dbo].[rptTransaction](
    ...
    [Date] [nvarchar](10) NULL,
...
) ON [PRIMARY]

是的,日期列的名称很差,因为它与关键字冲突。他们使用字符串日期[记住它是一个报告数据库]。

当我在 MS SQL Server Management Studio 中执行以下代码时:

DECLARE @testDate NVARCHAR  = N'2012/03/01';

SELECT COUNT(*)
  FROM rptTransaction AS t 
 WHERE t.Date >= @testDate
       AND t.Date <= @testDate
OPTION (RECOMPILE);
GO

结果如下:

(No column name)
0

另一方面,当我执行以下代码时:

DECLARE @testDate NVARCHAR  = N'2012/03/01';

SELECT COUNT(*)
  FROM rptTransaction AS t 
 WHERE t.Date >= N'2012/03/01'
       AND t.Date <= N'2012/03/01'
OPTION (RECOMPILE);
GO

结果如下:

(No column name)
124888

(我使用的是 OPTION (RECOMPILE),否则参数化版本会执行全表扫描,这需要很长时间。)

4

2 回答 2

4

运行此代码:

declare @testDate nvarchar = N'2012/03/01';
select @testDate ;

我的一个系统,输出只是2.

试试这个:

declare @testDate nvarchar(10) = N'2012/03/01';
select @testDate ;

好多了:

2012/03/01

这是您查询的两个意想不到的部分之一。另一个是你要求你的值是> =<=。换句话说,满足查询的唯一方法是参数是否与您存储的数据完全匹配。2如果该列都是有效日期,则永远不会这样做。

于 2012-07-21T01:45:37.190 回答
1

nvarchar 默认使用长度 1。在这种情况下指定长度为 10

于 2012-07-21T06:04:26.143 回答