創(chuàng)建自定義函數(shù):
創(chuàng)新互聯(lián)公司不只是一家網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司;我們對營銷、技術(shù)、服務(wù)都有自己獨特見解,公司采取“創(chuàng)意+綜合+營銷”一體化的方式為您提供更專業(yè)的服務(wù)!我們經(jīng)歷的每一步也許不一定是最完美的,但每一步都有值得深思的意義。我們珍視每一份信任,關(guān)注我們的成都網(wǎng)站設(shè)計、做網(wǎng)站質(zhì)量和服務(wù)品質(zhì),在得到用戶滿意的同時,也能得到同行業(yè)的專業(yè)認可,能夠為行業(yè)創(chuàng)新發(fā)展助力。未來將繼續(xù)專注于技術(shù)創(chuàng)新,服務(wù)升級,滿足企業(yè)一站式全網(wǎng)整合營銷推廣需求,讓再小的品牌網(wǎng)站設(shè)計也能產(chǎn)生價值!
use 數(shù)據(jù)庫名
go
create function 函數(shù)名
(@pno int)
returns int
as
begin
declare @a int
if not exists(select * from person where pno=@pno)
set @a=-1
else
set @a=1
return @a
end
調(diào)用函數(shù):
use 數(shù)據(jù)庫名
go
select dbo.函數(shù)名(13250)
sql server 自定義函數(shù)的使用
自定義函數(shù)
用戶定義自定義函數(shù)像內(nèi)置函數(shù)一樣返回標量值,也可以將結(jié)果集用表格變量返回
用戶自定義函數(shù)的類型:
標量函數(shù):返回一個標量值
表格值函數(shù){內(nèi)聯(lián)表格值函數(shù)、多表格值函數(shù)}:返回行集(即返回多個值)
1、標量函數(shù)
Create function 函數(shù)名(參數(shù))
Returns 返回值數(shù)據(jù)類型
[with {Encryption | Schemabinding }]
[as]
begin
SQL語句(必須有return 變量或值)
End
Schemabinding :將函數(shù)綁定到它引用的對象上(注:函數(shù)一旦綁定,則不能刪除、修改,除非刪除綁定)
Create function AvgResult(@scode varchar(10))
Returns real
As
Begin
Declare @avg real
Declare @code varchar(11)
Set @code=@scode + ‘%’
Select @avg=avg(result) from LearnResult_baijiali
Where scode like @code
Return @avg
End
執(zhí)行用戶自定義函數(shù)
select 用戶名。函數(shù)名 as 字段別名
select dbo.AvgResult(‘s0002’) as result
用戶自定義函數(shù)返回值可放到局部變量中,用set ,select,exec賦值
declare @avg1 real ,@avg2 real ,@avg3 real
select @avg1= dbo.AvgResult(‘s0002’)
set @avg2= dbo.AvgResult(‘s0002’)
exec @avg3= dbo.AvgResult ‘s0002’
select @avg1 as avg1 ,@avg2 as avg2 ,@avg3 as avg3
函數(shù)引用
create function code(@scode varchar(10))
returns varchar(10)
as
begin
declare @ccode varchar(10)
set @scode = @scode + ‘%’
select @ccode=ccode from cmessage
where ccode like @scode
return @ccode
end
select name from class where ccode = dbo.code(‘c001’)
2、表格值函數(shù)
a、 內(nèi)聯(lián)表格值函數(shù)
格式:
create function 函數(shù)名(參數(shù))
returns table
[with {Encryption | Schemabinding }]
as
return(一條SQL語句)
create function tabcmess(@code varchar(10))
returns table
as
return(select ccode,scode from cmessage where ccode like @ccode)
b、 多句表格值函數(shù)
create function 函數(shù)名(參數(shù))
returns 表格變量名table (表格變量定義)
[with {Encryption | Schemabinding }]
as
begin
SQL語句
end
多句表格值函數(shù)包含多條SQL語句,至少有一條在表格變量中填上數(shù)據(jù)值
表格變量格式
returns @變量名 table (column 定義| 約束定義 [,…])
對表格變量中的行可執(zhí)行select,insert,update,delete , 但select into 和 insert 語句的結(jié)果集是從存儲過程插入。
Create function tabcmessalot (@code varchar(10))
Returns @ctable table(code varchar(10) null,cname varchar(100) null)
As
Begin
Insert @ctable
Select ccode,explain from cmessage
Where scode like @code
return
End
Select * from tabcmessalot(‘s0003’)
來自:
C#調(diào)用SQL自定義函數(shù)返回值
代碼
1 --SQL自定義函數(shù):
2
3 CREATE FUNCTION [GetProjectID] (@headStr nvarchar(10),@date datetime)
4 )
5
6 RETURNS NVARCHAR(200)
7
8 AS
9
10 BEGIN
11
12 --不能在自定義函數(shù)中用INSERT INTO
13
14 --insert into emos_cust(cust_name,dates)values(
15
16 --@headStr,@date
17
18 --)
19
20 return 'TEST BY HANSHU'
21 END
代碼
1 /// summary
2 /// 獲取項目文件編號 涂聚文
3 /// /summary
4 private void FileNo()
5 {
6
7 SqlConnection conn = new SqlConnection(connectionString);
8 string strSql = "GetProjectID"; //自定SQL函數(shù)
9 SqlCommand cmd = new SqlCommand(strSql, conn);
10 cmd.CommandType = CommandType.StoredProcedure;
11 cmd.Parameters.Add("@headStr", SqlDbType.NVarChar).Value = "ZQ3"; //輸入?yún)?shù)
12 cmd.Parameters.Add("@date", SqlDbType.DateTime).Value = System.DateTime.Now.ToShortDateString(); //輸入?yún)?shù)
13 cmd.Parameters.Add("@returnString", SqlDbType.NVarChar);
14 cmd.Parameters["@returnString"].Direction = ParameterDirection.ReturnValue; //返回參數(shù)
15 try
16 {
17 conn.Open();
18 object o= cmd.ExecuteScalar();
19
20 this.txtAFileNO.Text = cmd.Parameters["@returnString"].Value.ToString();
21
22 //Response.Write("");
23
24 }
25 catch (Exception ex)
26 {
27
28 this.txtAFileNO.Text = ex.Message;
29
30 }
31 finally
32 {
33
34 if (!(conn.State == ConnectionState.Closed))
35 {
36
37 conn.Close();
38
39
40 }
41
42 }
43
44
45 }
returns @RowSet table(
ID int identity(1,1) ,
score float,
lastScore float
)
你這里已經(jīng)聲明了一個表格類型變量作為函數(shù)的返回值.
那么只要在函數(shù)里對這個表進行賦值,就可以直接return
insert into @RowSet values(...)
return
--------
declare @ScoreList table (YScore float)
declare @ScoreList1 table (lastScore float)
-------------------------------------------
怎么我看你又聲明了兩個表格類型的變量?你函數(shù)聲明里的返回類型是表,那么單行返回的話就只能往里裝簡單類型的值.
如果你要union拼接兩個table一起返回的話,兩個內(nèi)部table和聲明的返回table定義又不一致.
很奇怪的寫法...能看出來你想干什么...但這種寫法很怪異.
========================================補充
insert into @ScoreList SELECT...
insert into @ScoreList1 SELECT ...
你這不是把兩個查詢的結(jié)果賦給兩個內(nèi)部變量了么,且這個表與你聲明的返回表都是一個float列.
你完全可以再把這兩個變量表insert 到@RowSet啊,或者不用這倆變量表,直接在兩個查詢里向@RowSet寫入值.
最后直接
return
end
不就行了?
======
這有個返回值為talble的函數(shù),你參看一下吧.你這個函數(shù)的完成度已經(jīng)相當高了.
有好幾個函數(shù)可以達到你的要求
其中一個是concat函數(shù)
oracle:
sql@kokooaselect concat(concat('a','bcd'),'e') from dual;
CONCA
-----
abcde
原來是bcd,首尾都加了個字符
newid 無參數(shù)
返回一個GUID(全局唯一表示符)值
例如:select newid()
返回:2E6861EF-F4DB-4FFE-86EB-637482FE982J2
isnumeric (任意表達式)
判斷表達式是否為數(shù)值類型或者是否可以轉(zhuǎn)換成數(shù)值。
是:返回1,不是:返回0
例如:select isnumeric(1111) 返回 1
select isnumeric('123rr') 返回 0
select isnumeric('123') 返回 1
isnull (任意表達式1,任意表達式2)
如果任意表達式1不為NULL,則返回它的值;否則,在將任意表達式2的類型轉(zhuǎn)換為任意表達式1的類型(如果這兩個類型不同)后,返回任意表達式2的值。
例如:select isnull(null,N'沒有值') 返回 沒有值
select isnull(N'具體的值',N'沒有值') 返回 具體的值
isdate (任意表達式)
確定輸入表達式是否為有效日期或可轉(zhuǎn)成有效的日期;
是:返回1,不是:返回0
例如:select isdate(getdate()) 返回1
select isdate('2013-01-02') 返回1
select isdate('198') 返回0