【T-SQL】 SQL語法排序後將結果塞入變數時,查詢變數資料發現資料不同?。

當查詢有多筆資料時,將資料值賦予給變數,會從最上面的第一筆資料,賦予到最後一筆資料。

系統環境 SQL 2008 R2

首先簡單的設定一張資料,塞入3筆資料。有時間欄位(TH004)格式為 YYYYMMDD

程式碼如下:

CREATE TABLE [dbo].[TB001](
	[TH001] [varchar](4) NOT NULL,
	[TH002] [varchar](11) NOT NULL,
	[TH003] [nchar](4) NOT NULL,
	[TH004] [varchar](10) NULL,
	[TH005] [nvarchar](20) NULL,
	[TH006] [nvarchar](50) NULL,
	[Th007] [int] NULL,
 CONSTRAINT [PK_TB001] PRIMARY KEY CLUSTERED 
(
	[TH001] ASC,
	[TH002] ASC,
	[TH003] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

INSERT INTO [TB001] VALUES
('PIA','201801018','0002','20180130','3010274-003','AAAAA','6000')
,('PIA','201802009','0001','20180228','3010274-003','AAAAA','3000')
,('PIA','201803018','0001','20180315','3010274-003','AAAAA','4500')

接下來查詢一下資料,按照時間排序

SELECT 
TH001,TH002,TH003,TH004,TH005,TH006,TH007
 FROM TB001
 ORDER BY TH004 DESC

可以看到結果如下:

確實有按照時間欄位(TH004)進行 DESC 排序(大到小)。

我需要查詢的資料值,來做為參數去查詢其他資料表,所以我設定了相關變數資料,讓查詢結果直接賦予給變數。範例如下

 DECLARE 
 @TH001 varchar(4),
 @TH002 varchar(11),
 @TH003 varchar(4),
 @TH004 varchar(10),
 @TH005 nvarchar(20),
 @TH006 nvarchar(50),
 @TH007 int

--依樣依照日期欄位資料進行 DESC 的排序。 
 SELECT 
 @TH001 = TH001, @TH002 = TH002, @TH003 = TH003, @TH004 = TH004,
 @TH005 = TH005, @TH006 = TH006, @TH007 = TH007  
 FROM   TB001
 ORDER BY TH004 DESC
 
--查詢結果
 SELECT 
 @TH001 AS TH001, @TH002 AS TH002, @TH003 AS TH003, @TH004 AS TH004,
 @TH005 AS TH005, @TH006 AS TH006, @TH007 AS TH007

查詢結果如下:

竟然是出現第一筆資料,沒有排序。難怪User會回報資料值是錯誤的。

是不是因為SQL語法的執行順序所造成的結果? (執行順序如下)

FROM --> ON --> JOIN --> WHERE --> GROUP BY --> HAVING --> SELECT --> DISTINCT --> ORDER BY --> TOP

感覺好像是耶??可是哪裡怪怪的,就算排序資料室最後才執行,但是結果也不會是整個顛倒阿??

我們新塞一筆資料到資料庫。這個日期是在中間的資料

INSERT INTO [TB001] VALUES
('PIA','201802003','0002','20180215','3010274-003','AAAAA','2000')

查詢結果如下:

再利用變數的資料進行查詢。(一樣使用上面的語法查詢,結果如下:)

沒有何改變......那我們在新增一筆資料。這次將會是最小的資料。

INSERT INTO [TB001] VALUES
('PIA','201801006','0001','20180108','3010274-003','AAAAA','1000')

讓我們看看結果??

再利用變數的資料進行查詢。(一樣使用上面的語法查詢,結果如下:)

這時候,出現了剛剛新增的最小一筆資料??

原來,因為賦予變數值是用查詢的結果,如果有多筆資料,他會從第一筆資料..塞...到最後一筆。

等到我們下查詢語法檢查變數時,就會查出最後一筆資料內容。所以才會變成前後不同導致錯誤。

要解決,就要在塞值給變數之前,就先把正確的排序給弄好。最好是直接就只查出單一筆資料。(避免耗用資源)

查詢範例如下

 DECLARE 
 @TH001 varchar(4),
 @TH002 varchar(11),
 @TH003 varchar(4),
 @TH004 varchar(10),
 @TH005 nvarchar(20),
 @TH006 nvarchar(50),
 @TH007 int
 
 --先將確定要取出的資料取出,再賦予給變數值
 SELECT 
 @TH001 = TH001, @TH002 = TH002, @TH003 = TH003, @TH004 = TH004,
 @TH005 = TH005, @TH006 = TH006, @TH007 = TH007  
 FROM( 
	SELECT TOP(1) TH001,TH002,TH003,TH004,TH005,TH006,TH007
	FROM TB001
	ORDER BY TH004 DESC ) AS A
 
 SELECT 
 @TH001 AS TH001, @TH002 AS TH002, @TH003 AS TH003, @TH004 AS TH004,
 @TH005 AS TH005, @TH006 AS TH006, @TH007 AS TH007

 

紀錄一下.....然後來去修正之前的錯誤語法了......>"<.......

 

 

 

 

 

水滴可成涓流,涓流可成湖泊大海。
汲取累積知識,將知識堆積成常識;將常識探究成學識;將學識簡化為知識;授人自省。