bestlong 怕失憶筆記

當健忘由隨機逐漸趨向常態時,作筆記是非常必要的

Entries for the ‘Database’ Category

如何在 Firebird 進行資料分頁?

在 MSSQL 有 Top n 並配合排序手法
在 MySQL 有 Limit n, m
在 PostgreSQL 有 Limit n offset m

而在 Firebird 進行資料分頁可以使用 FIREST n SKIP m 的 SQL 語法

FIRST n 表示提取 n 條記錄, SKIP m 表示從 m+1 條記錄開始提取(跳過 m 條記錄)。

1. 從資料表中取第 1 條記錄開始的 5 條記錄

1
SELECT FIRST 5 ID,F1,F2 FROM TBLNAME

2. 從資料表中取第 6 條記錄開始到結束的所有記錄

1
SELECT skip 5 ID,F1,F2 FROM TBLNAME

3. 從資料表中取第 10 條第 30 條記錄之間的記錄

1
SELECT FIRST 20 skip 9 ID,F1,F2 FROM TBLNAME

Leave a Comment

在 MSSQL 2005 停用或啟用資料表上定義的 DML 觸發程序

從 MSSQL 2005 版本開始,想停用或啟用 Trigger 就簡單多了,語法如下:

停用 Trigger ( 觸發程序 )

語法:

1
2
DISABLE TRIGGER { [ schema_name . ] trigger_name [ ,...n ] | ALL }
ON { object_name | DATABASE | ALL SERVER } [ ; ]

實作:

1
DISABLE TRIGGER dbo.trigName ON dbo.tableName

啟用 Trigger ( 觸發程序 )

語法:

1
2
ENABLE TRIGGER { [ schema_name . ] trigger_name [ ,...n ] | ALL }
ON { object_name | DATABASE | ALL SERVER } [ ; ]

實作:

1
ENABLE TRIGGER dbo.trigName ON dbo.tableName

Comments (1)

在 MSSQL 2000 停用或啟用資料表上定義的 DML 觸發程序

有些應用系統前端只負責資料的異動,而連動的部份就由被異動的資料表上所定義的觸發程序來處理。例如領料單會去扣庫存數的狀況。可是當我們在進行匯入或複製資料之時,就會希望不要執行觸發程序的時候,就需要自行手動管理了。

我們可以用下列 SQL 命令來達成:

1
2
--停用觸發程序
ALTER TABLE tableName DISABLE TRIGGER trigName
1
2
--重新啟用觸發程序
ALTER TABLE tableName ENABLE TRIGGER trigName

Leave a Comment

MySQL 編碼問題狀況分享

MySQL 的 Latin UTF8 編碼問題在網路上有很多人分享了詳細說明與轉換經驗就不再廢話

反正管理者在建置系統時,要做到的每個環節的編碼都親手檢查確認

因為碰到一個烏龍狀況就是環境設定與連線設定以及專案的程式碼都確認好了是 UTF8 沒錯
不過就是沒注意到在安裝流程的建立資料庫結構的 SQL Script 檔中
每個建立資料表卻都是這樣

create table xxx (xxx, ….) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

在 UTF8 作業環境中卻指定建立 Latin1 編碼的資料表
真是傻眼,只好先自行手工處理了。

Leave a Comment

無法解析 equal to 動作的定序衝突

這是在預儲程序後執行時所回應的錯誤訊息,程式碼節錄部份如下:

1
2
3
4
5
6
7
CREATE TABLE #tbMain(id INT IDENTITY(1,1), Line VARCHAR(20) NOT NULL, Part_num VARCHAR(9) NOT NULL, Lv INT)

INSERT INTO #tbMain(Line,Part_num,Lv)
SELECT Replicate('.',@L) + LTrim(str(@L)), B.Part_num, @L+1
FROM BOM B, #tbMain M
WHERE B.Asmb_num = M.Part_num
  AND M.Lv = @L

為什麼呢?
一般繁體中文版 MSSQL 建置時多數人都會用預設定序 Chinese_Taiwan_Stroke_CI_AS
但是其中一個資料庫是從別的環境附加進來的,該資料庫定序是用 Chinese_Taiwan_Stroke_BIN
一般來說,在同一個資料庫中的資料表的定序都會使用資料庫預設值
此問題常發生於處理兩個資料庫的資料表進行 JOIN 關聯之時
而建立臨時表 #tbMain 會使用 TempDB 資料庫的空間與定序
而 TempDB 資料庫的定序使用伺服器的定序設定
所以當 JOIN 這兩個不同定序的資料表時,字串欄位就無法進行比對而回應錯誤

可以將程式碼中的

1
WHERE B.Asmb_num = M.Part_num

改成

1
WHERE B.Asmb_num COLLATE Chinese_Taiwan_Stroke_BIN = M.Part_num COLLATE Chinese_Taiwan_Stroke_BIN

強制轉換成為相同定序後就可以正常執行了

另外因為本狀況是使用臨時表,所以也可以在建立時就指定欄位定序

1
2
3
4
5
CREATE TABLE #tbMain(
id INT IDENTITY(1,1),
Line VARCHAR(20) COLLATE Chinese_Taiwan_Stroke_BIN NOT NULL,
Part_num VARCHAR(9) COLLATE Chinese_Taiwan_Stroke_BIN NOT NULL,
Lv INT)

這樣就不必在每個 JOIN 指令中強制轉換定序
不過最好還是將資料庫轉換成與伺服器相同的定序

Leave a Comment

  • 工商服務

    廣告讀取中...
  • 近期留言

  • 標籤

  • 彙整