1.分割字串,處理某個字元第幾次出現獲取後面的值
use [ef]
go/****** object: userdefinedfunction [dbo].[f_substr] script date: 10/27/2014 20:36:10 ******/
set ansi_nulls on
goset quoted_identifier on
goalter function [dbo].[f_substr](
@s varchar(8000), --待分拆的字串
@split varchar(10), --資料分隔符
@fx varchar(10), --方向 left
@place int ---第幾個
)returns varchar(8000)
asbegin
declare @str varchar(8000)
declare @i int ---迴圈次數
declare @pp int ---位置
set @pp=0
set @i=@place
set @str=@s
while(@i>0)
begin
declare @p int
set @p=charindex(@split,@str)
if(@p>0)
begin
set @str = substring(@str,@p+1,len(@str)-@p+1)
endelse
begin
return ''
endset @pp = @pp+@p
set @i = @i-1
endif(@fx='left')
begin
set @str=left(@s,@pp-1)
endreturn @str
end
2. 獲取某天是當月第幾周
use [ef]
go/****** object: userdefinedfunction [dbo].[weekofmonth] script date: 10/27/2014 20:51:17 ******/
set ansi_nulls on
goset quoted_identifier on
goalter function [dbo].[weekofmonth](@day datetime)
returns int
asbegin
declare @num int
declare @start datetime
declare @dd int
declare @dayofweek char(8)
declare @dayofweek_num char(8)
declare @startweekdays int
if datepart(dd,@day)=1
return 1
else
set @start= (select dateadd(mm, datediff(mm,0,@day), 0)) --乙個月第一天的
set @dayofweek= (datename(weekday,@start)) ---得到本月第一天是週幾
set @dayofweek_num=(select (case @dayofweek when '星期一' then 7
when '星期二' then 6
when '星期三' then 5
when '星期四' then 4
when '星期五' then 3
when '星期六' then 2
when '星期日' then 1
end)) ---得到本月的第一周一共有幾天
set @dd=datepart(dd,@day) ----得到今天是這個月的第幾天
if @dd <= @dayofweek_num --小於前一周的天數
return 1
else
set @dd=@dd-@dayofweek_num
if @dd % 7=0
begin
set @num=@dd / 7
return @num+1
endelse --if @dd % 7<>0
set @num=@dd / 7
set @num=@num+1+1
return @num
end
3. 獲取客戶端ip
/****** object: userdefinedfunction [dbo].[getcurrentip] script date: 10/27/2014 20:53:49 ******/
set ansi_nulls on
goset quoted_identifier on
goalter function [dbo].[getcurrentip] ()
returns varchar(255)
asbegin
declare @ip_address varchar(255);
select @ip_address = client_net_address
from sys.dm_exec_connections
where session_id = @@spid;
return @ip_address;
end
4.輸入乙個日期獲取下個月是幾月
use [ef]
go/****** object: userdefinedfunction [dbo].[f_getnextperiod] script date: 10/27/2014 20:55:55 ******/
set ansi_nulls on
goset quoted_identifier on
goalter function [dbo].[f_getnextperiod]
(@qj varchar(30)
)returns varchar(20)
asbegin
declare @day varchar(12)
declare @year varchar(4)
declare @month varchar(2)
set @day = dbo.get_strarraystrofindex(@qj,'.',1)+'-'+dbo.get_strarraystrofindex(@qj,'.',2)+'-01'
set @month =convert(varchar(2),month(dateadd(month,+1,@day)))
set @year = convert(varchar(4),year(dateadd(month,+1,@day)))
-- return the result of the function
return @year+'.'+@month
end
select dbo.f_getnextperiod('2014.10.27')
/*結果
2014.11
*/
SQL 標量值函式的呼叫
呼叫 ms sql 標量值函式,應該在函式前面加上 dbo.否則會報 不是可以識別的 內建函式名稱 錯誤。例如 declare whichdb tinyint select whichdb dbo.user getwhichdb 1 看看是哪個資料庫的 另外,標量值函式就相當於乙個變數,而不是乙個表...
標量值函式的用法
昨天做乙個前台顯示,就是資料庫有4個字段都是int型,需要前台把它們合成乙個字段輸出。本來想著在資料庫在加一列,後來有人提議用標量值函式,發現這樣挺好的。拿來分享一下。首先新建查詢複製下面 code set ansi nulls on go set quoted identifier on go c...
SQL錶值函式和標量值函式的區別
原文 sql錶值函式和標量值函式的區別 寫sql儲存過程經常需要呼叫一些函式來使處理過程更加合理,也可以使函式復用性更強,不過在寫sql函式的時候可能會發現,有些函式是在錶值函式下寫的有些是在標量值下寫的,區別是錶值函式只能返回乙個表,標量值函式可以返回基型別。舉個例子,當使用者刪除乙個節點的時候,...