SQL仍是目前關聯式資料庫的主流之一,可以簡化網頁程式碼的複雜度,例如增加一個欄位存放某計算過後的欄位值,就能減輕程式每次重複計算的演算過程,以下只是簡單示範如何使用CURSOR和FEACH
步驟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 = 0
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 另一個資料表中合約日期最大的一筆,以下僅供參考~
補充說明:
在很多的情況下會用到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.產品代碼)
|
沒有留言:
張貼留言