我會很感興趣知道你是否想出了爲什麼會發生這種情況的另一個原因,但我開始懷疑它。我相當肯定你在捕捉或壓制某處的錯誤。
考慮以下幾點:
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)導致AND錯誤。所以,如果你的代碼看起來像下面這樣:
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)'來存儲一個int? –
哪些SQL Server版本是這些(哪個是哪個)?另外,字段memberId的排序順序是否相同? –