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 ;

私のシステムの1つで、出力は2.

代わりにこれを試してください:

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

ずっといい:

2012/03/01

これは、クエリの 2 つの予期しない部分のうちの 1 つです。もう 1 つは、値を>=<=の両方にする必要があることです。つまり、クエリを満たす唯一の方法は、パラメーターが格納されたデータと正確に一致する場合です。列がすべて有効な日付である場合、それは決して行われません。2

于 2012-07-21T01:45:37.190 に答える
1

nvarchar はデフォルトで長さ 1 を使用します。この場合、長さを 10 と指定します。

于 2012-07-21T06:04:26.143 に答える