PIXNET Logo登入

虎搞瞎搞

跳到主文

瞎搞攻城師經歷隨記~

部落格全站分類:數位生活

  • 相簿
  • 部落格
  • 留言
  • 名片
  • 2月 17 週四 201107:05
  • 判斷資料欄位是否有中文字


前幾天剛好有朋友問,怎麼下TSQL判斷,資料表中欄位含有中文的字, 
就先想到可以用先把字串分解成一個一個的字元,再來做 ASCII 的比對, 
建立的副程式如下


我的想法是因為最後一個英文 z 是122 ,所以比 122 大就判斷不是英文, 
而 A-Z,a-z 的範圍 ASCII 如下


-- a 97 
-- z 122 
-- A 65 
-- Z 90


 













01CREATE    FUNCTION [dbo].[udf_IsContainChinese]










02(@inString nvarchar(1000))










03RETURNS int 










04AS










05BEGIN










06 










07DECLARE @flag int










08  










09DECLARE @valueLength int










10SET @valueLength = LEN(@inString)










11DECLARE @i int










12SET @i = 1










13WHILE @valueLength >= @i










14BEGIN










15     DECLARE @ChcekValue int










16 










17     SELECT  @ChcekValue =  ASCII(SUBSTRING(@inString,@i,1))










18    --SELECT @ChcekValue










19     if(@ChcekValue > 122)










20     BEGIN     










21        -- 有中文










22        SET @flag = 1










23        -- 跳出










24        BREAK










25     END










26     ELSE










27     BEGIN










28        SET @flag = 0










29     END










30     SET @i = @i +1










31END










32  RETURN @flag










33END





而 Function 的使用如下,將 Function傳入欄位值,會傳回 1 ,0 用來判斷, 
也可以將 Function 拿來當 WHERE 的比對來使用 





view source

print?











1SELECT *,dbo.udf_IsContainChinese(value)










2 FROM dbo.TestTemp











3

WHERE dbo.udf_IsContainChinese(value) = 1


 





後來想一想,是不是還有別的方法也可以判斷資料欄位中是否還有中文的值, 
一直想到是不是有類似 Regular 的方式,後來查了一下 SQL 中有 PATINDEX 可以使用, 
就想說找出第一個中文字的起點,再找出最後一個中文字,就能下規則的方式來找出, 
後來有點懶惰,就用一個一個測試,猜數字的方式,來找出第一個中文, 
而找出第一個中文跟最後一個中文測試的TSQL如下: 













01--土法煉鋼的方式找到'一'是中文字的起點 19968










02SELECT UNICODE('一') 










03SELECT NCHAR(19968)










04--土法煉鋼的方式找到'龥'是中文字的終點 40869










05SELECT UNICODE('龥')










06SELECT NCHAR(40869)










07-- 但'龥' 在用UNICODE查出卻是 63










08-- 而在  40869 - 40861 龞,龟 .... 這幾個字查出來都是 63










09-- 只有 '龜' 查出來是 40860










10 










11SELECT UNICODE('龜')










12SELECT NCHAR(40860)





因為欄位都會存 nvarchar 的方式,所以我用 UNICODE 的方式來查出, 
但遇到了一個問題,最後一個中文字因該是 '龥' 40869 ,但NCHAR('龥') 
卻是 63 ,而 40861 - 40869 這幾個字 NCHAR(' ') 都會是63, 
這點到現在我也還沒搞懂,還望有高手能夠指點, 
而慢慢的往前推,就發現 '龜' 字 40860 是可以在 NCHAR 傳回正常的 40860 , 
所以我就先認定合格的中文字範圍是 一-龜 
而這個範例 TSQL使用 PATINDEX 程式碼如下: 

 


 













1SELECT patindex('%[一-龜]%',value),*










2FROM dbo.TestTemp










3WHERE patindex('%[一-龜]%',value) > 0





執行畫面如下,也可以將PATINDEX當WHERE條件來比對


 


 


第二個方法比較是鎖定中文字的範圍,來做比對的方式,但有發生前面提到的 
「而 40861 - 40869 這幾個字 NCHAR(' ') 都會是63」,這點還沒想通是什麼原因, 
一般的資料欄位中是否中文比對,用兩種方式都能夠可以比對的出來, 
或許還有更好的方法,還請大家多指點。


 


參考資源: 
http://msdn.microsoft.com/zh-tw/library/ms188395.aspx


http://www.dotblogs.com.tw/dotjum/archive/2008/07/19/4597.aspx





(繼續閱讀...)
文章標籤

Empty 發表在 痞客邦 留言(0) 人氣(1,504)

  • 個人分類:Microsoft SQL Server
▲top
  • 2月 16 週三 201118:26
  • 跨主機連線-查詢語法


長久-是指先註冊主機資訊,再用此資訊做查詢












1--註冊遠端伺服器名稱










2EXEC   sp_addlinkedserver     'otherDB','','SQLOLEDB','192.168.*.*'   -- 別名固定SQLServer










3EXEC   sp_addlinkedsrvlogin   'otherDB','false',null,'帳號','密碼'     --帳號密碼










4 










5select * from otherDB.資料庫名稱.dbo.表格










6 










7--將伺服器DROP掉










8EXEC   sp_dropserver   'otherDB','droplogins'




暫時-是只查一次,不需另外註冊主機












1SELECT *










2FROM   OPENDATASOURCE ('SQLOLEDB','Data Source=192.168.*.*;User ID=帳號;Password=密碼' ).資料庫.dbo.表格




(繼續閱讀...)
文章標籤

Empty 發表在 痞客邦 留言(0) 人氣(3,019)

  • 個人分類:Microsoft SQL Server
▲top
  • 1月 10 週一 201120:28
  • 15138删除对于用户失败,数据库主体在该数据库中拥有架构,无法删除


Microsoft SQL Server错误: 15138删除对于用户失败,数据库主体在该数据库中拥有架构,无法删除。解决方法
删除 对于 用户“*****”失败。  (Microsoft.SqlServer.Smo)
有关帮助信息,请单击: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=9.00.1523.00&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates.FailedOperationExceptionText&EvtID=删除+User&LinkId=20476
(繼續閱讀...)
文章標籤

Empty 發表在 痞客邦 留言(0) 人氣(29)

  • 個人分類:Microsoft SQL Server
▲top
  • 10月 27 週三 201001:33
  • [SQL]數字補零0


小豬頭寫了個補 0 的 SQL 問我怎麼跑不出來
主要當然是他沒把數字轉字串所以 SQL 很雞婆會自動轉回數字
其次是他的技巧是 先判斷數字的長度 然後再不斷用 case-when 補字串 '000...'
換句話說 如果最大可能補 10 個 0 他的 SQL 就要寫 10 組 case-when
隨手就弄個小 SQL 送那個小豬頭囉 只要以下這行就搞定了...


substring('0000000000', 1, 10 - len(a)) + convert(char(10), a)

所以啊... 沒有 java 想弄個補 0 其實也不難喔!!!
其他要補空白補血補鈣 請自行舉一反三 ^^


感謝 juevampire 大大補充,引用各資料庫之 function 語法如下:



-- SQL Server:  
select replicate('0', (10-len('123')))+'123' 
-- Oracle:  
SELECT LPad('123',10,'0') FROM dual 
-- DB2:  
values char(repeat('0',10-length('123'))||'123',10)

(繼續閱讀...)
文章標籤

Empty 發表在 痞客邦 留言(0) 人氣(1,104)

  • 個人分類:Microsoft SQL Server
▲top
  • 8月 02 週一 201019:37
  • SQL语句取相关日期(当月天数,当月第一天,当月最后一天,本年最后一天,当月第一个星期)

--当月天数
select day(dateadd(ms,-3,DATEADD(m, DATEDIFF(m,0,getdate())+1,0))) 
---当月第一天
select   dateadd(d,-day(getdate())+1,getdate())  
---当月最后一天
select   dateadd(d,-day(getdate()),dateadd(m,1,getdate()))
--本年最后一天
select   dateadd(d,-day(getdate()),dateadd(m,12,getdate()))
--当月第一个星期一
SELECT DATEADD(wk, DATEDIFF(wk, '', DATEADD(dd, 6 - DAY(getdate()), getdate())), '')
(繼續閱讀...)
文章標籤

Empty 發表在 痞客邦 留言(0) 人氣(180)

  • 個人分類:Microsoft SQL Server
▲top
1

工商

文章搜尋

個人資訊

Empty
暱稱:
Empty
分類:
數位生活
好友:
累積中
地區:

熱門文章

  • (5,898)[ubuntu]當tw.archive.ubuntu.com連不上時,解決方法。
  • (5,895)[ubuntu] 自動釋放cache 記憶體
  • (4,986)[C#]系統顏色表
  • (3,019)跨主機連線-查詢語法
  • (854)Round 真的是四捨五入嗎
  • (662)[VB] ASP.NET DataSet 判斷欄位是否存在、是否有值
  • (376)購買Visual Studio 2012 價格表
  • (132)WITH (NOLOCK) table hint equivalent for MySQL
  • (83)藤井樹【流浪的終點】 - 當冬夜漸暖
  • (31)拷貝後刪除批次檔

文章分類

toggle 瀏覽 (2)
  • Chrome (1)
  • FireFox (0)
toggle 虛擬 (3)
  • Hyper-V (0)
  • citrix XEN (0)
  • VMWARE (1)
toggle 程式 (14)
  • HTML (0)
  • JAVA (0)
  • VB.NET (2)
  • CSS (0)
  • C# (17)
  • PHP (1)
  • Perl (0)
  • ASP.NET (6)
  • xcode (1)
  • JavaScript (3)
  • ASP (2)
  • Arduino (0)
  • 批次檔語法 (3)
  • Visual Studio (5)
toggle DB (3)
  • MySQL (6)
  • Microsoft SQL Server (5)
  • Oracle (2)
toggle OS (3)
  • FreeBSD (0)
  • LINUX (9)
  • windows (14)
toggle 閱讀 (2)
  • 參考文章 (1)
  • 好書推薦 (0)
toggle 思考 (2)
  • 日記 (11)
  • 心情記事 (9)
  • WordPress (18)
  • JavaScript (0)
  • 未分類文章 (1)

最新文章

  • IIS 相關設定
  • 更新SSL
  • [C#]Entity Framework 5 增加TimeOut時間
  • [C#]當WebService 需要多載時的方法,需要注意MessageName
  • [C#] 如何讓Linq + entity framework 可以達到with(nolock)
  • [分享]網站分享,想要學程式的人有福了
  • [分享]GOLiFE Care-X HR 智慧悠遊心率手環慘狀
  • [分享]htaccess在Apach與Nginx寫法並不相同
  • [C#].NET最簡單PostgreSQL連線方式
  • [Windows]批次檔相關指令

最新留言

  • [21/03/22] 2e2 於文章「[windows] 刪除 PuTTY 的...」留言:
    請問一個笨問題 win10 ssh有兩個以前亂設定的公私鑰檔...
  • [11/04/27] 喵空 >^o^< 於文章「當網域內的電腦出現【此工作站與主要網域間...」留言:
    今天剛裝好的Win7Pro也發生相同狀況,重新加入網域也不...
  • [11/03/28] nat 於文章「變更 ChartFX 7.0 的輸出路徑...」留言:
    <p>請麻煩指出原始來源,不要只是全文複製。</p>...
  • [10/03/24] chunhsing 於文章「天使錯了~...」留言:
    <p>你好你好~</p> <p>我也是看到這篇很感人才轉貼的...
  • [10/02/06] 阿睿 於文章「家長控制軟體?...」留言:
    <p>是英文...我要中文.<img src="http:/...
  • [09/12/13] thundersha 於文章「Ubuntu - KVM基本套件安裝(G...」留言:
    <p>不好意思我是原著, 可以麻煩你加個原始文章引用連結嗎 ...
  • [09/05/11] chunhsing 於文章「你還好嗎?...」留言:
    <p><img src="http://s.blog.xui...
  • [09/04/07] Cherry 於文章「你還好嗎?...」留言:
    <p>我也會看MSN的對話ㄟ~特別是跟在乎的人的對話</p>...
  • [09/02/06] 新手駕駛 於文章「ASP.NET 網頁的基本組成 ...」留言:
    <p>親愛的大大 請教您一個問題:</p> <p>我安裝了I...
  • [07/06/19] 阿豪^_^ 於文章「asp join陣列轉換字串函數...」留言:
    好,有沒有php的,加油哦!︿_︿哈囉!我是阿豪,喜歡部落格...

誰來我家