SQL處理中英文字串長度的範例
-- 計算中英文字串長度
DECLARE @string varchar(50)
set @string='一二三456七八9十'
select @string '字串', len(@string) '中英字數', datalength(@string) '資料長度', datalength(@string)-len(@string) '中文字數'
-- 截取中英文字串長度
DECLARE @string varchar(50), @l int
set @string='一二三456七八9十'
set @l=8
select substring(@string,1,@l) '取字數', case when datalength(@string)>8 then convert(varchar(8),@string)+'...' else convert(varchar(8),@string) end '取資料數'
select substring(@string,1,@l)
-- 無法使用下列寫法,主要在「convert(varchar(@l),@string)」內的『varchar(@l)』括號內只可使用數值,無法使用變數 >"<。
select substring(@string,1,@l), case when datalength(@string) > @l then convert(varchar(@l),@string)+'...' else convert(varchar(@l),@string) end
2009年10月15日星期四
2009年10月14日星期三
EXCEL的資料轉置(橫轉直)
2009年10月9日星期五
暫存表判斷 / 產生日期暫存表
參考網址:http://www.blueshop.com.tw/board/show.asp?subcde=BRD20050616212814W4M&fumcde=FUM20041006152735ZFS
-- #暫存表判斷並刪除
IF OBJECT_ID('tempdb..#tmpDate') IS NOT NULL
DROP TABLE #tmpDate
go
DECLARE @sd datetime --開始日期
DECLARE @ed datetime --結束日期
DECLARE @d1 datetime --處理日期
DECLARE @d2 varchar --處理民國日期
set @sd='2008-09-11'
set @ed='2009-01-14'
set @d1=@sd
-- 先轉一筆資料入 #tmpDate 暫存表 drop table #tmpDate
select D_date '西元日期', weeknum '星期別', convert(varchar(4),DATEPART ("year", @d1)-1911)+right(replace(D_date,'-','/'),6) '民國日期' into #tmpDate
from(select convert(varchar(10),@d1,121) D_date, DATEPART ( "weekday" , @d1 )-1 weeknum ) a
select @d1=DATEADD("day" , 1, @d1 ) --加一天
WHILE (@d1 <= @ed) BEGIN insert into #tmpDate select *, convert(varchar(4),DATEPART ("year", @d1)-1911)+right(replace(D_date,'-','/'),6) C_date from(select convert(varchar(10),@d1,121) D_date, DATEPART ( "weekday" , @d1 )-1 weeknum ) a select @d1=DATEADD("day" , 1, @d1 ) END -- 顯示暫存表
select * from #tmpDate
order by [西元日期]
-- #暫存表判斷並刪除
IF OBJECT_ID('tempdb..#tmpDate') IS NOT NULL
DROP TABLE #tmpDate
go
DECLARE @sd datetime --開始日期
DECLARE @ed datetime --結束日期
DECLARE @d1 datetime --處理日期
DECLARE @d2 varchar --處理民國日期
set @sd='2008-09-11'
set @ed='2009-01-14'
set @d1=@sd
-- 先轉一筆資料入 #tmpDate 暫存表 drop table #tmpDate
select D_date '西元日期', weeknum '星期別', convert(varchar(4),DATEPART ("year", @d1)-1911)+right(replace(D_date,'-','/'),6) '民國日期' into #tmpDate
from(select convert(varchar(10),@d1,121) D_date, DATEPART ( "weekday" , @d1 )-1 weeknum ) a
select @d1=DATEADD("day" , 1, @d1 ) --加一天
WHILE (@d1 <= @ed) BEGIN insert into #tmpDate select *, convert(varchar(4),DATEPART ("year", @d1)-1911)+right(replace(D_date,'-','/'),6) C_date from(select convert(varchar(10),@d1,121) D_date, DATEPART ( "weekday" , @d1 )-1 weeknum ) a select @d1=DATEADD("day" , 1, @d1 ) END -- 顯示暫存表
select * from #tmpDate
order by [西元日期]
2009年7月14日星期二
SQL定序衝突問題處理
SQL語法查詢,發生「定序衝突問題」時,訊息如下:
「無法解析 equal to 作業中 "Chinese_Taiwan_Stroke_CI_AS" 與 "Chinese_Taiwan_Stroke_CI_AS_WS" 之間的定序衝突。」
這時必須將相關的資料定序調整,使用的方式如下:
原條件為
a=b
修改後為
cast(a as varchar)COLLATE Chinese_Taiwan_Stroke_CI_AS =cast(b as varchar)COLLATE Chinese_Taiwan_Stroke_CI_AS
將定序調整一致後,就不會有問題了。
「無法解析 equal to 作業中 "Chinese_Taiwan_Stroke_CI_AS" 與 "Chinese_Taiwan_Stroke_CI_AS_WS" 之間的定序衝突。」
這時必須將相關的資料定序調整,使用的方式如下:
原條件為
a=b
修改後為
cast(a as varchar)COLLATE Chinese_Taiwan_Stroke_CI_AS =cast(b as varchar)COLLATE Chinese_Taiwan_Stroke_CI_AS
將定序調整一致後,就不會有問題了。
2009年7月2日星期四
SQL小數四捨五入範例
-- 四捨五入範例
-- 使用「numeric 型態」做小數四捨五入進位處理
--------------------------------------------------------------------------------------------
declare @a1 float, @b1 float, @c1 float, @d1 float, @e1 float
declare @a2 float, @b2 float, @c2 float, @d2 float, @e2 float
/*設定變數初值*/
select @a1 = 0.334, @a2 = 0.335
select @b1 = 0.444, @b2 = 0.445
select @c1 = 0.554, @c2 = 0.455
select @d1 = 0.664, @d2 = 0.465
select @e1 = 0.774, @e2 = 0.475
select @a1 a, @b1 b, @c1 c, @d1 d, @e1 e
select @a2, @b2, @c2, @d2, @e2
print '使用 numeric 型態做小數四捨五入進位處理'
select convert(numeric(5,2),@a1), convert(numeric(5,2),@b1), convert(numeric(5,2),@c1), convert(numeric(5,2),@d1), convert(numeric(5,2),@e1)
select convert(numeric(5,2),@a2), convert(numeric(5,2),@b2), convert(numeric(5,2),@c2), convert(numeric(5,2),@d2), convert(numeric(5,2),@e2)
--------------------------------------------------------------------------------------------
-- 整數相除的小數處理範例
--------------------------------------------------------------------------------------------
declare @a int
declare @b int
declare @c int, @d int, @e int
/*設定變數初值*/
select @a = 1000
select @b = 3
select @c = 43
select @d = 6
select @e = 7
select @a/@b t1, @a/@c t2, @a/@b*1.0 t3, 1.0*@a/@b b, 1.0*@a/@c c, 1.0*@a/@d d, 1.0*@a/@e e
, convert(numeric(5,2),(1.0*@a/@b)) b1
, convert(numeric(5,2),(1.0*@a/@c)) c1
, convert(numeric(5,2),(1.0*@a/@d)) d1
, convert(numeric(5,2),(1.0*@a/@e)) e1
-- 使用「numeric 型態」做小數四捨五入進位處理
--------------------------------------------------------------------------------------------
declare @a1 float, @b1 float, @c1 float, @d1 float, @e1 float
declare @a2 float, @b2 float, @c2 float, @d2 float, @e2 float
/*設定變數初值*/
select @a1 = 0.334, @a2 = 0.335
select @b1 = 0.444, @b2 = 0.445
select @c1 = 0.554, @c2 = 0.455
select @d1 = 0.664, @d2 = 0.465
select @e1 = 0.774, @e2 = 0.475
select @a1 a, @b1 b, @c1 c, @d1 d, @e1 e
select @a2, @b2, @c2, @d2, @e2
print '使用 numeric 型態做小數四捨五入進位處理'
select convert(numeric(5,2),@a1), convert(numeric(5,2),@b1), convert(numeric(5,2),@c1), convert(numeric(5,2),@d1), convert(numeric(5,2),@e1)
select convert(numeric(5,2),@a2), convert(numeric(5,2),@b2), convert(numeric(5,2),@c2), convert(numeric(5,2),@d2), convert(numeric(5,2),@e2)
--------------------------------------------------------------------------------------------
-- 整數相除的小數處理範例
--------------------------------------------------------------------------------------------
declare @a int
declare @b int
declare @c int, @d int, @e int
/*設定變數初值*/
select @a = 1000
select @b = 3
select @c = 43
select @d = 6
select @e = 7
select @a/@b t1, @a/@c t2, @a/@b*1.0 t3, 1.0*@a/@b b, 1.0*@a/@c c, 1.0*@a/@d d, 1.0*@a/@e e
, convert(numeric(5,2),(1.0*@a/@b)) b1
, convert(numeric(5,2),(1.0*@a/@c)) c1
, convert(numeric(5,2),(1.0*@a/@d)) d1
, convert(numeric(5,2),(1.0*@a/@e)) e1
2009年3月19日星期四
輸入法由注音改為倉頡先出來
輸入法由注音改為倉頡先出來
緣起:
我是一個倉頡打字的人,或許你也跟我一樣偶而會有拆不出字碼,只好改注音輸入,然後,眼,盯著鍵盤、口中不斷的發著要拆的字音,最後,好不容易打出要拆的注音符號。這是時而發生的事,所以,我們也會增加一個「注音」輸入法,但,問題來了,「注音」每次都在我「英數」和「倉頡」輸入法中間擋住,就一定還要再切換一下才會跳到我可愛的「倉頡」輸入法上來。天呀!!死微軟幾時才能讓Windows可以聰明一點,我要「倉頡」先出來啦!! >"<
遍巡google都找不到可以解決我問題的方法,最後,也不可考了,下列是我目剈前找到可以改善我問題的解決方法。直接改 regedit 系統設定,總算ok了。在這分享給跟我有一樣困擾的人。 ^^
Windows98 登錄編輯器
機碼名稱:
HKEY_LOCAL_MACHINE\
System\
CurrentControlSet\
Control\
Keyboard Layouts\
E0010404
==>E0010404
名稱 資料
-------------------------------------
IME file PHON.IME
layout file kbdus.kbd
layout text 注音
==>E0020404
名稱 資料
-------------------------------------
IME file CHAJEI.IME
layout file kbdus.kbd
layout text 倉頡
將上列的 E0010404 和 E0020404 內的資料互換;
重開機後 倉頡輸入法 將在 注音輸入法 之前
==============================================
WinXP SP3 20090127
==============================================
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Keyboard Layouts\
==>E0010404
名稱 資料
-------------------------------------
IME file phon.ime
Layout Display Name @%SystemRoot%\system32\input.dll,-5066
layout file KBDUS.DLL
layout text 中文 (繁體) - 注音
==>E0020404
名稱 資料
-------------------------------------
IME file chajei.ime
Layout Display Name @%SystemRoot%\system32\input.dll,-5067
layout file KBDUS.DLL
layout text 中文 (繁體) - 倉頡
將上列的 E0010404 和 E0020404 內的資料互換;
重開機後 倉頡輸入法 將在 注音輸入法 之前
緣起:
我是一個倉頡打字的人,或許你也跟我一樣偶而會有拆不出字碼,只好改注音輸入,然後,眼,盯著鍵盤、口中不斷的發著要拆的字音,最後,好不容易打出要拆的注音符號。這是時而發生的事,所以,我們也會增加一個「注音」輸入法,但,問題來了,「注音」每次都在我「英數」和「倉頡」輸入法中間擋住,就一定還要再切換一下才會跳到我可愛的「倉頡」輸入法上來。天呀!!死微軟幾時才能讓Windows可以聰明一點,我要「倉頡」先出來啦!! >"<
遍巡google都找不到可以解決我問題的方法,最後,也不可考了,下列是我目剈前找到可以改善我問題的解決方法。直接改 regedit 系統設定,總算ok了。在這分享給跟我有一樣困擾的人。 ^^
Windows98 登錄編輯器
機碼名稱:
HKEY_LOCAL_MACHINE\
System\
CurrentControlSet\
Control\
Keyboard Layouts\
E0010404
==>E0010404
名稱 資料
-------------------------------------
IME file PHON.IME
layout file kbdus.kbd
layout text 注音
==>E0020404
名稱 資料
-------------------------------------
IME file CHAJEI.IME
layout file kbdus.kbd
layout text 倉頡
將上列的 E0010404 和 E0020404 內的資料互換;
重開機後 倉頡輸入法 將在 注音輸入法 之前
==============================================
WinXP SP3 20090127
==============================================
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Keyboard Layouts\
==>E0010404
名稱 資料
-------------------------------------
IME file phon.ime
Layout Display Name @%SystemRoot%\system32\input.dll,-5066
layout file KBDUS.DLL
layout text 中文 (繁體) - 注音
==>E0020404
名稱 資料
-------------------------------------
IME file chajei.ime
Layout Display Name @%SystemRoot%\system32\input.dll,-5067
layout file KBDUS.DLL
layout text 中文 (繁體) - 倉頡
將上列的 E0010404 和 E0020404 內的資料互換;
重開機後 倉頡輸入法 將在 注音輸入法 之前
2009年3月18日星期三
MS SQL 資料表迴圈範例
print '資料表迴圈處理'
--產生暫存資料表 #score
if exists(select * from tempdb.dbo.sysobjects where id = object_id('tempdb.dbo.#score') )
drop table #score
create table #score (
sno varchar(10), --學號
class varchar(10), --科目
num int --分數
)
insert into #score
select '001', '國', 80
union select '001', '英', 90
union select '001', '數', 55
union select '002', '國', 50
union select '002', '英', 60
union select '002', '數', 75
union select '003', '英', 98
union select '003', '數', 59
union select '004', '國', 88
union select '004', '英', 98
union select '005', '國', 58
union select '005', '數', 69
union select '006', '國', 78
union select '006', '英', 84
union select '006', '數', 59
--select * from #score
print '資料表迴圈處理顯示'
DECLARE score_cursor CURSOR
FOR
SELECT distinct sno, class, num
FROM #score
order by sno, class
OPEN score_cursor
DECLARE @sno varchar(10) -- 學號變數
DECLARE @class varchar(10) -- 科目
DECLARE @num int -- 分數
FETCH NEXT FROM score_cursor INTO @sno, @class, @num
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
BEGIN
PRINT @sno+','+@class+','+convert(varchar(10),@num)
END
FETCH NEXT FROM score_cursor INTO @sno, @class, @num
END
CLOSE score_cursor
DEALLOCATE score_cursor
--產生暫存資料表 #score
if exists(select * from tempdb.dbo.sysobjects where id = object_id('tempdb.dbo.#score') )
drop table #score
create table #score (
sno varchar(10), --學號
class varchar(10), --科目
num int --分數
)
insert into #score
select '001', '國', 80
union select '001', '英', 90
union select '001', '數', 55
union select '002', '國', 50
union select '002', '英', 60
union select '002', '數', 75
union select '003', '英', 98
union select '003', '數', 59
union select '004', '國', 88
union select '004', '英', 98
union select '005', '國', 58
union select '005', '數', 69
union select '006', '國', 78
union select '006', '英', 84
union select '006', '數', 59
--select * from #score
print '資料表迴圈處理顯示'
DECLARE score_cursor CURSOR
FOR
SELECT distinct sno, class, num
FROM #score
order by sno, class
OPEN score_cursor
DECLARE @sno varchar(10) -- 學號變數
DECLARE @class varchar(10) -- 科目
DECLARE @num int -- 分數
FETCH NEXT FROM score_cursor INTO @sno, @class, @num
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
BEGIN
PRINT @sno+','+@class+','+convert(varchar(10),@num)
END
FETCH NEXT FROM score_cursor INTO @sno, @class, @num
END
CLOSE score_cursor
DEALLOCATE score_cursor
訂閱:
文章 (Atom)



