百敬's profile偶有所得PhotosBlogLists Tools Help

百敬 胡

Occupation
Interests
寓形宇內復幾時!曷不委心任去留,胡為乎惶惶欲何之?
Photo 1 of 72
July 03

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

July 02

關渡憶往

無意間發現一篇自己4年前的文章,留在此,讓未來老年的我有甜美故事可以緬懷,讓白頭老翁可以話當年,免得消失在硬碟海中。

 

15 年?好像切換幻燈片一般,昨日背上爬的孩子們今日並肩談笑風生。還記得背著他們在天主堂滿場跑的日子,再見面已各自擁有一片天。

印象中福利會的中途之家是大女孩(寶瑩、憶菁與榕榕)與小男孩的園地,義工環境裏男性奇貨可居。因此在寶瑩的邀請下,隨著她從光鹽愛盲轉戰到中途之家當義工。我去過一兩次新店中途,只記得是個小小孩和大小孩一起哭鬧的環境,而後就幫忙寶瑩、憶菁與一群大小孩搬家到關渡中途,在一片混亂中整理出家園。

那是一段奇特的日子,從輔大騎機車到關渡,陪小男孩玩大地遊戲,聽大女孩們訴說生活中的點滴。印象中,自己憑著過人的體力可以同時追逐五六個小朋友,或是背負三四個小朋友笑鬧嬉戲,替小男生們的日常生活裡增添一點男性的陽剛野蠻。

雖然衣食無虞,但七天 24 小時全年無休的陪伴,在小男孩們闖禍不斷的情境下,我可以感受到寶瑩與憶菁的無力。每個小男孩背後都有著破碎的家庭,與一段令人同情的故事,或許是不捨,抑或是熱情;還是堅持?她們努力了三年。

愛心讓這個故事綿延,在當時,她們沒有任何專業背景,只有在挫折中成長。依稀記得有專業背景相關科系畢業的輔導員都做不久,或許專業讓工作是工作吧。而中途之家需要的是共同生活,是孩子們人生的一步,需要的是真心對待,而不是朝九晚五的工作人員。

就自己而言,記憶中,那是一段無力與不知道未來的日子,因為專業與社會資源不足。而每個年齡層的孩子都需不同的教養方式,隨著孩子們一天天成長,從幼稚園的中途、國小的中途、到國、高中的中途。在當時,我們期待有前瞻性的規劃,而不是摸石子過河,然而環境卻是讓人沮喪的。

還記得最後見到全部小朋友是在花蓮,他們一起過簡樸生活。原本就經不起繁華誘惑的小朋友們,如何能在匱乏的生活中甘之如飴。離開花蓮之前,正巧碰到上國中的帶著一群國小的孩子們在偷吃外邊買來的食物,我只能疾言厲色地告誡一頓,就返回台北。而後再見面,居然是 15 年後。

有緣能見證一段用愛心播種的故事已是福份。15 年後大夥兒的聚首,讓自己在忙與盲的心中泛起了一片暖意。

HDMI

在整合電視、擴大機、DVD Player和電腦時,才發現 HDMI 規格真好用,直接串起所有影音,且全是 Full 1080P HD。由於藍光的DVD不普及,也不想讓小朋友繼續沉溺電視遊樂器,我不想整合藍光 DVD 和 PS3 或 XBox360。

聽從 Derrick 的建議,利用 Acer 的 1L PC http://shopping.pchome.com.tw/?mod=item&func=exhibit&IT_NO=DGAH05-A41206944&SR_NO=DGAH2L&ROWNO=1(另有 Linux 規格,便宜 3400,但除掉贈品和硬碟規格差異後,大概要付給 MS 1~2 千的 Vista OS 費用,畢竟自己受惠於 MS 太多,還是買 Vista 版)加上數位電視棒後,當作一般無線電視訊號的來源。我決定停掉有線電視,以避免小朋友終日念念不忘電視。而這台PC就當作其他影音的整合處,我的數位相機、DV和各種電腦影音資料可以匯流了,透過無線網路 802.11N 應該有不錯的傳輸。PC 一旦 Plug And Play HDMI 後,會自動將影音訊號轉給擴大機,很方便。

Yamaha RX-V 665 擴大機有 4 HDMI IN,1 HDMI OUT,在整合 DVD 和 PC 等影音源時真好用,它會留下聲音,把影像輸給電視。

電視有 4 個 HDMI 輸入,讓我有更多的選擇。

有趣的是這些影音家電會透過 HDMI 彼此交換資訊,還一起開關機。

以往,等一個規格,從謠傳到正式有產品,急急去買後,總是整合不良,效率不佳。而今 HDMI 已經出來好久了,自己都視而不見。等要整合家電時,才發現它已經到處都是。這是個有趣的經驗。

猶如在組 IT Solution 時,以往規格不多,選擇貧乏,拼拼湊湊。現今各種技術繁盛,第一次接觸,就可選擇容易組裝的產品,讓不是玩家的我很滿意。淺嘗了一個領域的規格,進入到另一個領域時,又是劉姥姥進大觀園。

在現今科技社會,若醉心於資訊,及其衍生技術,驚喜將連綿不絕。自己成長的過程僵固了創意,無緣發明的樂趣,感謝有組 solution 的機遇,這讓我高興不已。微笑

 

PS. 感謝巧玫提供了 HDMI 規格解說的 Link:

http://www.oc.com.tw/article/0607/readgoodarticle.asp?id=5341

http://www.oc.com.tw/article/0607/readgoodarticle.asp?id=5342

June 25

多個前端應用程式需同時取到唯一編號後,新增到另一個資料表

以往需包在交易內,先更新一筆記錄後,再以 Select 查詢傳回,以兩句語法加上交易取得唯一序號,現在可以透過 Output 子句一句話完成

改自 TechEd 2009 US DAT313 的 Slide

--建立測試用資料表

USE tempdb
GO

--產生唯一編號的資料表
CREATE TABLE tbSequence(ID INT)
INSERT tbSequence VALUES(1)
GO

--存放唯一序號的資料表
CREATE TABLE tbNeedUniqueSequence(ID INT,BatchNo TINYINT,InsTime TIME(7) DEFAULT(SYSDATETIME()))
GO

--透過預存程序新增資料
CREATE PROC spAdd @i INT,@BatchNo TINYINT
AS
UPDATE dbo.tbSequence
  SET ID += @i
OUTPUT inserted.ID, @BatchNo
  INTO dbo.tbNeedUniqueSequence(ID, BatchNo);

GO


SELECT * FROM tbNeedUniqueSequence ORDER BY ID
TRUNCATE TABLE tbNeedUniqueSequence
UPDATE tbSequence SET ID=0
Go

--另一種解法
ALTER PROC spAdd @i INT,@BatchNo TINYINT
AS
INSERT INTO dbo.tbNeedUniqueSequence(ID, BatchNo)
  SELECT ID, @BatchNo
  FROM (UPDATE dbo.tbSequence
          SET  ID += @i
        OUTPUT inserted.ID) AS D;

 

--測試用的 Batch,存檔成 TestBatch.sql

USE tempdb
DECLARE @i INT=0
WHILE @i<10000
BEGIN
    EXEC spAdd 1,$(BatchNo)
    SET @i+=1
END

 

最後以命令提示列的批次檔測試,批次檔內容如下:

start sqlcmd -E -i TestBatch.sql -vBatchNo=1
start sqlcmd -E -i TestBatch.sql -vBatchNo=2
start sqlcmd -E -i TestBatch.sql -vBatchNo=3
start sqlcmd -E -i TestBatch.sql -vBatchNo=4

執行結果如下

image

 

偶有所得