Friday, December 15, 2006

SQL6.5 升級至 SQL2000 的小技巧

目前在對一個舊程式改版。原程式使用SQL 6.5,欄位型態若是 char 的話,最大長度只能到 255。因此原程式需將資料拆成兩個長度小於256的資料,再將他寫入資料庫中,而拆解時還須考量到中文字的問題。現在升級到 SQL 2000,欄位長度已可大於256,因此不需要再用兩個欄位存資料。然而為了能相容於其他系統,因此希望能在資料庫中處理到原先拆成兩部份的問題。後來發現 SQL 2000 中雖然有 nvarchar 可以存放Unicode字串,但是 substring 及 len 等 function 都是以 Unicode 來處理,即中文與英文都是一個字,因此無法取得字串真正 char 的長度。但是嘗試找出了一個方法,可以於Stored Procedure 中處理之前所將字串拆成兩部分的方法:

CREATE TABLE [dbo].[t1] (
[c1] [char] (11) COLLATE Chinese_Taiwan_Stroke_BIN NULL ,
[c2] [char] (11) COLLATE Chinese_Taiwan_Stroke_BIN NULL
) ON [PRIMARY]

declare @tx_data nvarchar(20)
declare @msg_recv1 nvarchar(11)
declare @msg_recv2 nvarchar(11)
declare @lentest int

set @tx_data = '李李23456李119654321'
--set @tx_data = '李李234561李19654321'
--下面的式子,可以得到 char 長度最大為 10 的 Unicode 的長度
set @lentest = len(convert(varchar(10), @tx_data))
set @msg_recv1 = substring(@tx_data, 1, @lentest)
set @msg_recv2 = substring(@tx_data, @lentest+1, 10)
insert into t1 values(@msg_recv1, @msg_recv2)
select * from t1