2015年6月23日 星期二

TSQL 簡易教學

 SQL仍是目前關聯式資料庫的主流之一,可以簡化網頁程式碼的複雜度,例如增加一個欄位存放某計算過後的欄位值,就能減輕程式每次重複計算的演算過程,以下只是簡單示範如何使用CURSORFEACH

步驟1: 宣告變數
DECLARE @FileName char(30), @OrgFileName char(30),@FileSubName varchar(4),
@FilePath nchar(150//預計要跑cursor的暫存變數值
DECLARE @realFileName char(30) //暫存結果欄位的值


步驟2: 宣告cursor的模式
DECLARE my_cursor CURSOR FOR
SELECT 檔名,原檔名,副檔名,檔案路徑 from servfile   //說明: my_cursor會逐筆從servfile 取值
OPEN my_cursor   

FETCH NEXT FROM my_cursor
INTO @FileName,@OrgFileName, @FileSubName,@FilePath   
//說明:servfile 的資料開始取值,依序從檔名、原檔名、副檔名、檔案路徑 逐一填值到變數中

WHILE @@FETCH_STATUS =
BEGIN
//在此段落中敘述SQL的判斷或演算

FETCH NEXT FROM my_cursor
INTO @FileName,@OrgFileName, @FileSubName,@FilePath   
//繼續往下取值
END
CLOSE my_cursor;
DEALLOCATE my_cursor;


步驟3: 寫相關的SQL判斷式


    為了取得A資料表的『檔名』和『路徑』存入B資料表中,但A資料表的檔名有分『原檔名』和『檔名』,如果原檔名不為空時,檔名就依『原檔名』為主,反之就依『檔名』為主。

l   A資料表 


















l   B資料表

















範例程式

IF(RTRIM(@OrgFileName) <> ''
        set @realFileName = RTRIM(@OrgFileName)
ELSE
         set @realFileName = RTRIM(@FileName)
update servfile_notice set 顯示檔名= RTRIM(@realFileName)+'.' + RTRIM(@FileSubName),存放路徑= RTRIM(@FilePath) where 檔名=@FileName

全部的SQL語法
DECLARE @FileName char(30), @OrgFileName char(30),@FileSubName varchar(4), @FilePath nchar(150)
DECLARE @realFileName char(30)
DECLARE my_cursor CURSOR FOR
SELECT 檔名,原檔名,副檔名,檔案路徑 from servfile

OPEN my_cursor   
 
FETCH NEXT FROM my_cursor
INTO @FileName,@OrgFileName, @FileSubName,@FilePath     

WHILE @@FETCH_STATUS = 0
BEGIN
      
     IF(RTRIM(@OrgFileName) <> '')
        set @realFileName = RTRIM(@OrgFileName)
     ELSE
         set @realFileName = RTRIM(@FileName)

     update servfile_notice set 顯示檔名= RTRIM(@realFileName)+'.' + RTRIM(@FileSubName),存放路徑= RTRIM(@FilePath) where 檔名=@FileName
          
     FETCH NEXT FROM my_cursor
     INTO @FileName,@OrgFileName, @FileSubName,@FilePath       
END

CLOSE my_cursor;
DEALLOCATE my_cursor;

    感謝各位的到訪,希望大家喜歡我的文章

補充說明:

        在很多的情況下會用到SubQuery,會影響效能要謹慎使用,以下範例是用於一對多的資料表情況下,A資料表只想JOIN 另一個資料表中合約日期最大的一筆,以下僅供參考~

select  p.產品代碼,p.產品名稱,c.合約迄日 from product  p
                            left join (
                            select
                                     b.產品代碼,
                                     max(b.合約迄日) as 合約迄日
                           from asuser A LEFT JOIN contract B
                           on (a.索引編號=b.索引編號) where a.索引編號=@index group by b.產品代碼 ) as c
                           on(p.產品代碼=c.產品代碼)

沒有留言:

張貼留言