2018年4月27日 星期五

MSSQL 常用範例

--字串重複擷取


DECLARE @strCount int
DECLARE @strs varchar(2000)
DECLARE @strField varchar(10)
set @strs = 'A,B,C,D'

while (@strs !='')
begin
--取的第一個元素位置
set @strCount = PATINDEX('%,%', @strs)
if (@strCount > 0)
begin
--依續取得元素的值
set @strField = LEFT(@strs,@strCount-1)

--取得剩下元素的值
set @strs = RIGHT(@strs,LEN(@strs)-@strCount)
end
else
begin
set @strField = ''
set @strs = ''
end
select '@strField=' + @strField
select '@strs=' + @strs
end
顯示結果:


--SQL SERVER-取得資料庫所有資料表,取得資料表所有欄位
SELECT * FROM INFORMATION_SCHEMA.Tables
PS:經測試有些非資料表,也要顯示出來


--字串查詢&取代

--讀取出title標題的第一個字為字母數據
select * from news where title like '[a-zA-Z]%' 

--讀取出title裡麵包含有空格數據
select * from news where title like '% %' 

--取代字串空白
UPDATE news SET title = REPLACE (title ,' ','')


--查詢空白字串注意事項:(來源)

在 MS SQL 中,空白字元在【某些的字串函數或比較式】執行結果會與預期的不一樣,例如

Sample 1:

    IF ( '  ' = ''  )  -- 一個是兩個空白,一個是空字串
        print '相等'
    else
        print '不相等';

    執行結果是]  ==>  相等


Sample 2:

    print Len('  ')   --  結果等於 0


Sample 3:

    print Len('123  ')   --  結果等於 3  Len 函數會自動將字尾的空白去掉


Sample 4:

    print Len('  123')   --  結果等於 5


Q: 那如果要真的求出字串 '123  ' ,長度為 5 ,指令該用什麼??  
==> A: 後面有空白的字元長度,要求出實際長度,不可以使用 Len ,要使用 DataLength  ==> 這是求出【位元組】的長度


※特別注意
DataLength 是求出位元組,所以

當碰上中文字時,每一個字的長度皆為 2
當型態為:nvarchar、nchar 時,不管英文、符號,長度皆為 2
當型態為:varchar、char  時,英文、符號的長度皆為 1


範例如下

Declare @sWideString nvarchar(20)  -- Unicode
Declare @sString  varchar(20)   -- 一般字元

Set @sWideString = '我是中文字加 ABC   '
Set @sString = '我是中文字加 ABC   '

print Len(@sWideString)  -- 長度 10  (因為 Len 指令會將尾端的空白去掉)
print Len(@sString)      -- 長度 10  (因為 Len 指令會將尾端的空白去掉)

print DataLength(@sWideString)  -- 長度 26
print DataLength(@sString)      -- 長度 19



沒有留言: