なぜこのようなことが起こっているのかについてもう一つの理由があるのかどうか知りたいですが、私はそれを疑うようになっています。私はあなたがどこかでエラーを捕まえているか、または抑制していることをかなり確信しています。
は、次のことを考えてみましょう:
CREATE TABLE [Person]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[MemberID] [nchar](200) NULL,
[Data] [varchar](50) NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
)
INSERT Person([MemberID],[Data]) VALUES ('1111111111', 'Test1');
INSERT Person([MemberID],[Data]) VALUES ('2222222222', 'Test2');
INSERT Person([MemberID],[Data]) VALUES ('3333333333', 'Test3');
INSERT Person([MemberID],[Data]) VALUES ('NON-NUMERIC', 'Test4');
SELECT * FROM Person WHERE MemberID = 2222222222
上記のクエリは、(1)とエラーが発生返されます。だから、あれば、あなたのコードは、次のように見えた:あなたが得るでしょう
command = new SqlCommand(
@"SELECT * FROM Person WHERE MemberID = 2222222222", connection);
try
{
reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine("MemberID = " + reader["MemberID"]);
}
// We'll never get here.
reader.Close();
}
catch { }
結果はMemberID = 2222222222
だろう。これは、SQL TRY...CATCH
ブロックを使用している場合にも発生します。しかし、私たちはオーダーレコードの変更する場合:例外がスローされる前に
TRUNCATE TABLE [Person]
INSERT Person([MemberID],[Data]) VALUES ('NON-NUMERIC', 'Test1');
INSERT Person([MemberID],[Data]) VALUES ('1111111111', 'Test2');
INSERT Person([MemberID],[Data]) VALUES ('2222222222', 'Test3');
INSERT Person([MemberID],[Data]) VALUES ('3333333333', 'Test4');
をあなたは基本的に(0)の結果を取得します。最後に、クエリを次のように変更した場合:
SELECT T.* FROM
(
SELECT TOP 100 *
FROM Person
ORDER BY MemberID
) T
WHERE T.MemberID = 2222222222
...(1)レコードとエラーが発生します。
私の助言は、エラーを抑止する理由とその理由を調べることです。私の全体的なアドバイスは、文字フィールドと整数を比較せず、暗黙の変換に依存することです。
1.クラスタ化インデックスは、ローオーダーではありません。このテストではほぼ確実になりますが、指摘する価値がありました。
ご迷惑をおかけして申し訳ございませんが、明らかな質問と思われる場合があります。両方のテーブルのスキーマが同じであることをダブルチェックしましたか? – GrandMasterFlush
面白い質問ですが、なぜあなたは整数を格納するために固定幅200バイトの列 'nchar(100)'を使用していますか? –
これらのSQL Serverのバージョンはどれですか(どちらになりますか)。また、フィールドmemberIdの照合順序も同じですか? –