悟心

          成功不是將來才有的,而是從決定去做的那一刻起,持續累積而成。 上人生的旅途罷。前途很遠,也很暗。然而不要怕。不怕的人的面前才有路。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            93 隨筆 :: 1 文章 :: 103 評論 :: 0 Trackbacks
          由于工作的需要,了解下SQL Server 2005 函數的寫法,現在總結一下:

          對于SQL Server 
          2005 數據庫而言,函數與存儲過程在語法方面是有很大的相同點,

          最大的不同就是函數有返回值,直接使用returns ,而存儲過程則使用output來聲明輸出變量

          一、下面先說明下,如何創建函數

          1、創建沒有返回值與沒有參數的函數

          CREATE FUNCTION my_function()

          AS

          BEGIN

              
          DECLARE @variable varchar(255--聲明字符型變量

              
          DECLARE @variable int --聲明整形型變量

              (do something)

          SET @variable = '12345' --對變量variable賦值

          END

          2、創建沒有返回值有參數的函數

          CREATE FUNCTION my_function(@user_Name varchar(128),@password int(6))

          AS

          BEGIN

              
          DECLARE @variable_1 varchar(255--聲明字符型變量

              (do something)

          SET @variable_1 = @user_Name + convert(varchar(255),@password--將變量@user_Name與@password連接賦給@variable_1,其中convert()函數是將int型轉為varchar型

          END

          3、創建有返回值與有參數的函數

          CREATE FUNCTION my_function(@user_Name varchar(128),@password int(6))

          returns varchar(255)--設置返回值,記住是returns 而不是return

          AS

          BEGIN

              
          DECLARE @result varchar(5)

              
          DECLARE @fagle varchar(5)

          SET @result = select users.user_Name from USERS as users where users.user_Name = @user_Name and users.password = @password

          IF @result = ''

              
          BEGIN

                 
          SET @fagle = 'NO'

              
          END

          ELSE

              
          BEGIN

                 
          SET @falge = 'YES'

              
          END

          return @result --返回結果

          END

          二、刪除一個函數語法

          DROP FUNCTION my_function

          三、執行一個函數語法

          select dbo.my_function(--根據有沒參數來處理

          go

          --注:在SQL Server 2005 中,有內部函數與外部函數,數據庫系統自帶函數,如sum(),count()等等,這些稱為內部函數,而我們自定義的函數稱為外部函數。

          --在執行函數語法中,也有些區別,如執行內部函數:select sum(total) from ,那么執行外部函數則需要在函數名前加dbo. + 自定義函數名,如

          --select dbo.my_function()

          --go

          四、下面提供二個例子

          1、日期判斷,判斷傳進來的日期是否在上個月日到本月日之間

          --請注意convert()函數的用法

          create function isNewContract(@date varchar(32))

          returns varchar(32)

          AS

          begin

              
          declare @begin_time varchar(32)

              
          declare @end_time varchar(32)

              
          declare @temp varchar(4)

              
          declare @result varchar(32)

              
          declare @month varchar(2)

          set @begin_time=convert(varchar,DATEPART(yeargetdate())) + '-'

          set @end_time=convert(varchar,DATEPART(yeargetdate())) + convert(varcharDATEPART(monthgetdate())) + convert(varchar'14')

          set @temp=convert(varchar(2),(month(getDate())-1 ))

          if(@temp < 10 )

          begin

              
          set @begin_time = @begin_time + convert(varchar(1),'0'+ @temp + '-' + convert(varchar'15')

          end

          if(@date >= @begin_time and @date <= @end_time)

          begin

          set @result = ''

          end

          else

          begin

          set @result = @begin_time

          end

          return @result

          end

          2、查詢多條記錄合并成一條記錄返回,并寫入EXECL表中,進行分行換行顯示,其中使用游標進行循環處理

          --在數據庫中,EXECL默認換行符ACSII碼為'10',在合并字符串之前,需要先轉為EXECL識別的換行符,具體使用chat()內部函數處理

          create function getExportReportCollect(@projectId int ,@month varchar(64))

          returns varchar(4096--設置返回值

          AS

          begin

              
          declare @num varchar(2)

              
          declare @end varchar(10)

              
          declare @Result varchar(4096--用于返回查詢結果

              
          declare city_cursor cursor for --聲明游標變量

              
          select reported.id

              
          from dbo.Investment_Budget_Reported as reported

              
          left join dbo.Investment_Budget_Contract as con

              
          on reported.contractId = con.id

              
          where reported.[month] = @month and reported.projectId = @projectId

          set @Result=''

          set @num = '1'

          set @end = '10' --導入EXECL表中,換行符的ACSII碼

          declare @Field int --聲明臨時存放CityID的變量

          open city_cursor --打開游標

          fetch next from city_cursor into @Field --將實際ID賦給變量

          while(@@fetch_status = 0--循環開始

          begin

              
          if((select [content] from dbo.Investment_Budget_Reported where id = @Field )is not null)

              
          BEGIN

               

                 
          if(@Result = '')

                     
          select @Result = @Result + @num + '' + [content] from dbo.Investment_Budget_Reported where id = @Field

                 
          else

                     
          select @Result = @Result + @num + '' + [content] from dbo.Investment_Budget_Reported where id = @Field

              
          set @Result = @Result + char(@end--讓換行符轉為EXECL認識的換行符

          set @num = @num + 1

              
          END

                 
          fetch next from city_cursor into @Field --下一個reportId

          end

          close city_cursor --關閉游標

          deallocate city_cursor --釋放游標引用

          return @Result

          end


          本文來自CSDN博客,轉載請標明出處:http:
          //blog.csdn.net/zhdd1234/archive/2009/10/27/4734789.aspx
          posted on 2010-12-16 19:38 艾波 閱讀(2948) 評論(1)  編輯  收藏 所屬分類: SQL

          評論

          # re: SQL Server 2005 自定義函數語匯小結 2010-12-30 17:09 路過
          最大的不同就是函數有返回值,直接使用returns ,而存儲過程則使用output來聲明輸出變量..你確定?
            回復  更多評論
            

          主站蜘蛛池模板: 通江县| 衡阳县| 修武县| 汾西县| 晋江市| 东乌珠穆沁旗| 玉环县| 上高县| 呼玛县| 昭通市| 平罗县| 太原市| 出国| 盘锦市| 长治县| 万全县| 吴堡县| 岳阳市| 嘉祥县| 锡林郭勒盟| 延安市| 横峰县| 黑河市| 瓮安县| 文登市| 镇巴县| 安福县| 油尖旺区| 禄丰县| 乌兰察布市| 阿克苏市| 太仓市| 全州县| 油尖旺区| 二连浩特市| 赤壁市| 衡南县| 安丘市| 亳州市| 洮南市| 文化|