--10.3 游標
--可以用游標來處理查詢返回的結果集中的各行,以指定的順序一次只處理一行.
--游標的缺陷:
--使用游標嚴重違背了關係模型,關係模型要求按照集合來考慮問題.
--游標逐行對記錄進行操作會帶來一定的開銷.
--使用游標需要為解決方案的物理操作編寫很多**,換句話說,得寫很多**來描述如何處理資料.
set nocount on;
use tsqlfundamentals2008;
declare @result as table
(custid int,
ordermonth datetime,
qty int,
runqty int,
primary key(custid, ordermonth))
declare
@custid as int,
@prvcustid as int,
@ordermonth as datetime,
@qty as int,
@runqty as int;
declare c cursor fast_forward /*read only, forward only*/ for
select custid, ordermonth, qty
from sales.custorders
order by custid, ordermonth;
open c
fetch next from c into @custid, @ordermonth, @qty;
set @prvcustid=@custid;
set @runqty=0;
while @@fetch_status=0
begin
if @custid<>@prvcustid
begin
set @prvcustid=@custid;
set @runqty=0;
endset @runqty=@runqty+@qty;
insert into @result values(@custid, @ordermonth, @qty, @runqty);
fetch next from c into @custid, @ordermonth, @qty;
endclose c;
select custid, convert(varchar(7), ordermonth, 121) as ordermonth,
qty, runqty
from @result
order by custid, ordermonth;
--10.5 臨時表
--10.5.1 區域性臨時表
--要建立區域性臨時表,只須要在命名時以單個數字符號(#)作為字首。
--所有三種型別的臨時表都是在tempdb資料庫中建立的。
select year(o.orderdate) as orderyear, sum(od.qty) as qty
into dbo.#myordertotalsbyyear
from sales.orders as o
join sales.orderdetails as od
on od.orderid = o.orderid
group by year(o.orderdate);
select cur.orderyear, cur.qty as curyearqty, prv.qty as prvyearqty
from dbo.#myordertotalsbyyear as cur
left outer join dbo.#myordertotalsbyyear as prv
on cur.orderyear=prv.orderyear+1;
--10.5.2 全域性臨時表
--要建立全域性臨時表,只需要在命名時用兩個數字符號(##)作為字首。
--訪問全域性臨時表不需要任何特殊的許可權,所有人都可以獲取完整的ddl和dml訪問。
create table dbo.##globals
(id sysname not null primary key,
val sql_variant not null);
insert into dbo.##globals(id, val) values(n'i', cast(10 as int));
select val from dbo.##globals where id = n'i';
--只要建立全域性臨時表的會話斷開了資料庫的聯接,而且也沒有其他活動引用全域性臨時表時,sql servr就會自動刪除它.
--10.5.3 表變數
--宣告表變數的方式和生命其他變數類似,使用的都是declare語句.
--和區域性臨時表類似,表變數也只對建立它的會話可見,但允許訪問的範圍更有限,它只對當前批處理可見.
--從效能上考慮,對於少量的資料(只有幾行),使用表變數更有意義,否則,應該使用臨時表。
declare @myordertotalsyear as table
(orderyear int not null primary key,
qty int not null);
insert into @myordertotalsyear(orderyear, qty)
select year(o.orderdate) as orderyear,
sum(od.qty) as qty
from sales.orders as o
join sales.orderdetails as od
on od.orderid = o.orderid
group by year(o.orderdate);
select cur.orderyear, cur.qty as curyearqty, prv.qty as prvyearqty
from @myordertotalsyear as cur
left outer join @myordertotalsyear as prv
on cur.orderyear=prv.orderyear+1
order by cur.orderyear;
--10.5.4 表型別
--通過建立表型別,可以把錶的定義儲存到資料庫中,以後在定義表變數,
--儲存過程和使用者自定義函式的輸入引數時,可以將表型別作為表的定義而重用.
use tsqlfundamentals2008;
if type_id('dbo.ordertotalsbyyear') is not null
drop type dbo.ordertotalsbyyear;
create type dbo.ordertotalsbyyear as table
(orderyear int not null primary key,
qty int not null);
godeclare @myordertotalsbyyear as dbo.ordertotalsbyyear;
insert into @myordertotalsyear(orderyear, qty)
select year(o.orderdate) as orderyear,
sum(od.qty) as qty
from sales.orders as o
join sales.orderdetails as od
on od.orderid = o.orderid
group by year(o.orderdate);
select orderyear, qty from @myordertotalsyear;
第10章 可程式設計物件 1
第10章 可程式設計物件 10.1 變數 變數用於臨時儲存資料值,以供在宣告它們的同一批處理語句中引用。declare i as int set i 10 set i i select i as i declare j as int 10 use tsqlfundamentals2008 decla...
第10章 可程式設計物件 5
10.7 例程 10.7.1 使用者定義函式 使用者定義函式 udf,user defined function 的目的是要封裝計算的邏輯處理,有可能需要基於輸入的引數,並返回結果。sql server支援兩種使用者定義函式 標量udf和錶值udf。標量udf只返回單個資料值,而表值udf則返回乙個...
第2章 可程式設計邏輯器件與Verilog HDL
fpga是可程式設計邏輯器件 pld 的一種,多種工藝,不同原理的pld如下 基於乘積項結構的pld器件 基於查詢表結構的pld器件 原理圖輸入 hdl文字 hdl硬體描述語言 將原理圖或者hdl轉化為邏輯電源組成的電路網表 布局佈線後產生如下重要檔案 晶元資源耗用情況報告 產生延時網表結構,以便於...