第10章 可程式設計物件 3

2021-06-09 04:27:51 字數 3845 閱讀 2876

--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轉化為邏輯電源組成的電路網表 布局佈線後產生如下重要檔案 晶元資源耗用情況報告 產生延時網表結構,以便於...