bug

CREATE TABLE [t2](
[TableItemID] [int] NOT NULL,
[FileID] [int] NOT NULL,
[UniqueId] [uniqueidentifier] NOT NULL,
CONSTRAINT [PK_TranslationRecord] PRIMARY KEY CLUSTERED
(
[TableItemID] ASC,
[FileID] ASC
))
–新增紀錄
DECLARE @i INT=1
WHILE @i<300
BEGIN
INSERT t2 VALUES(@i,@i,NEWID())
SET @i+=1
END
 
–以下查詢會有 Bug,每次執行的結果會不同
SELECT UniqueId,TableItemID FROM t2
WHERE  UniqueId<>NEWID() AND TableItemID<5
 
例如第一次執行得到如下的結果
UniqueId                             TableItemID
———————————— ———–
76047B41-4B2F-4E23-BC9D-B830E2F8E13A 1
140BD20D-7F4C-40C4-999E-C56DAEDBF09E 2
E429ACE3-C940-4DF5-991C-9FFD3E91BF33 4
 
第二次卻變成
UniqueId                             TableItemID
———————————— ———–
76047B41-4B2F-4E23-BC9D-B830E2F8E13A 1
E429ACE3-C940-4DF5-991C-9FFD3E91BF33 4
 
每次執行的結果居然會不同
該語法的執行計畫如下
應是 NewID() 被呼叫兩次,而每次形成的範圍都不同,這執行計畫有問題…
若資料表結構非如此、查詢條件沒有 and…,造成執行計畫不同,都不會有問題
 
或是改以變數查詢
declare @u uniqueidentifier=newid()
SELECT UniqueId,TableItemID FROM t2
WHERE  UniqueId<>@u AND TableItemID<5
 
答案即為正確的
UniqueId                             TableItemID
———————————— ———–
76047B41-4B2F-4E23-BC9D-B830E2F8E13A 1
140BD20D-7F4C-40C4-999E-C56DAEDBF09E 2
554C585F-778A-4981-A86E-40D254EB6B26 3
E429ACE3-C940-4DF5-991C-9FFD3E91BF33 4

感謝文陽和宛君提供這個 Bug

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s

%d 位部落客按了讚: