標籤:style blog http io color ar os sp div
原文:【SQL】靠譜的TRIM函數,附贈過程一枚
SQL中有LTRIM和RTRIM這兩個函數分別用於去除字串的首、尾空格,缺乏常見的能同時去除首尾的TRIM函數,另外,這倆函數都只對【空格】有效,所以如果首尾是定位字元、分行符號等等【空白】,它們是不處理的~起碼到sql 2k8 r2仍然如此。鑒於此,我寫了個靠譜的TRIM函數,上代碼:
/*---------------------函數:去除頭尾空白v0.01Author:AhDungUpdate:201311301716Rem:由於LEN不統計尾隨空格,所以做特別處理---------------------*/ALTER FUNCTION dbo.Trim(@s VARCHAR(7999))RETURNS VARCHAR(7999) ASBEGINWHILE ASCII(RIGHT(@s,1)) IN (9,10,13,32)BEGINSET @s=LEFT(@s, CASE ASCII(RIGHT(@s,1)) WHEN 32 THEN LEN(@s) ELSE LEN(@s)-1 END)ENDWHILE ASCII(@s) IN (9,10,13,32)BEGINSET @s=RIGHT(@s,LEN(@s)-1)ENDRETURN @sEND
一開始的思路是從字串的第一個字元開始遍曆判斷,若是【空格、定位字元、斷行符號、換行】,就去除,然後再從最右邊來一遍。但操蛋的LEN函數是不計尾隨空格的,所以改由從右邊開始遍曆,並將計就計利用LEN這個操蛋設定去除右邊空格,完了再來處理左邊。
另外附贈一枚基於該函數的一個過程,作用是去除指定表欄位的空白,可選去除中間空白(預設是不去除):
/*-----------------------------------過程:去除指定表欄位的頭尾空白v0.01Author:AhDungUpdate:201311301720-----------------------------------*/ALTER PROC PTrimField @TbName sysname, @ColName sysname, @RemoveAll BIT = 0 --是否移除中間的空白。預設=否ASSET NOCOUNT ONDECLARE @sql VARCHAR(1000) = ‘UPDATE [‘+@TbName+‘]SET [‘+@ColName+‘] = dbo.‘+CASE @RemoveAll WHEN 0 THEN ‘Trim‘ ELSE ‘RemoveAllWhiteSpace‘ END+‘([‘+@ColName+‘])WHERE PATINDEX(‘‘%[‘‘+CHAR(32)+CHAR(9)+CHAR(10)+CHAR(13)+‘‘]%‘‘,[‘+@ColName+‘])>0‘EXEC (@sql)
該過程對於一些允許使用者填寫,但寫入的時候又未在程式中做處理的欄位有修整作用。此外,該過程除了用到上面的TRIM函數,還用到另一個叫RemoveAllWhiteSpace的函數,用於去除字串中所有空白,該函數也一併附上:
/*---------------------函數:移除所有空白v0.01Author:AhDungUpdate:201311301716---------------------*/CREATE FUNCTION dbo.RemoveAllWhiteSpace(@s VARCHAR(7999))RETURNS VARCHAR(7999) ASBEGINRETURN REPLACE(REPLACE(REPLACE(REPLACE(@s,CHAR(32),‘‘),CHAR(9),‘‘),CHAR(10),‘‘),CHAR(13),‘‘)END
文畢。
【SQL】靠譜的TRIM函數,附贈過程一枚