国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

談SQL Server 2005中的T-SQL增強

2024-08-31 00:49:57
字體:
供稿:網(wǎng)友

  豐富的數(shù)據(jù)類型 richer data types

  1、varchar(max)、nvarchar(max)和varbinary(max)數(shù)據(jù)類型最多可以保存2gb的數(shù)據(jù),可以取代text、ntext或image數(shù)據(jù)類型。

create table mytable
(
id int,
content varchar(max)
)

  2、xml數(shù)據(jù)類型

  xml數(shù)據(jù)類型允許用戶在sql server數(shù)據(jù)庫中保存xml片段或文檔。

  錯誤處理 error handling

  1、新的異常處理結(jié)構(gòu)

  2、可以捕獲和處理過去會導(dǎo)致批處理終止的錯誤。前提是這些錯誤不會導(dǎo)致連接中斷(通常是嚴重程度為21以上的錯誤,例如,表或數(shù)據(jù)庫完整性可疑、硬件錯誤等等。)。

  3、try/catch 構(gòu)造

set xact_abort on
begin try
<core logic>
end try
begin catch tran_abort
<exception handling logic>
end try
@@error may be quired as first statement in catch block

  4、演示代碼

use demo
go
--創(chuàng)建工作表
create table student
(
stuid int not null primary key,
stuname varchar(50)
)
create table score
(
stuid int not null references student(stuid),
score int
)
go
insert into student values (101,'zhangsan')
insert into student values (102,'wangwu')
insert into student values (103,'lishi')
insert into student values (104,'maliu')
--調(diào)用一個運行時錯誤
set xact_abort off
begin tran
insert into score values (101,90)
insert into score values (102,78)
insert into score values (107, 76) /* 外鍵錯誤 */
insert into score values (103,81)
insert into score values (104,65)
commit tran
go
select * from student
select * from score
--使用try...catch構(gòu)造,并調(diào)用一個運行時錯誤
set xact_abort off
begin try
begin tran
insert into score values (101,90)
insert into score values (102,78)
insert into score values (107, 76) /* 外鍵錯誤 */
insert into score values (103,81)
insert into score values (104,65)
commit tran
print '事務(wù)提交'
end try
begin catch
rollback
print '事務(wù)回滾'
select error_number() as errornumber,
error_severity() as errorseverity,
error_state() as errorstate,
error_message() as errormessage;
end catch
go
select * from score
go

商業(yè)源碼熱門下載www.html.org.cn

|||

  快照隔離 snapshot isolation

  1、寫入程序不會阻礙讀取程序

  2、新的隔離級別提供了以下優(yōu)點:

  1) 提高了只讀應(yīng)用程序的數(shù)據(jù)可用性

  2) 允許在oltp環(huán)境中執(zhí)行非阻止讀取操作

  3) 可對寫入事務(wù)進行自動的強制沖突檢測

  3、演示代碼

create database demo2
go
use demo2
alter database demo2 set allow_snapshot_isolation on
create table test
(
tid int not null primary key,
tname varchar(50) not null
)
insert into test values(1,'version1')
insert into test values(2,'version2')
--連接一
use demo2
begin tran
update test set tname='version3' where tid=2
select * from test
--連接二
use demo2
set transaction isolation level snapshot
select * from test

  top 增強功能

  1、top 增強??梢灾付ㄒ粋€數(shù)字表達式,以返回要通過查詢影響的行數(shù)或百分比,還可以根據(jù)情況使用變量或子查詢。

  可以在delete、update和insert查詢中使用top選項。

  2、更好地替換set rowcount選項,使之更為有效。

  output

  1、sql server 2005引入一個新的output子句,以使您可以沖修改語句(insert、update、delete)中將數(shù)據(jù)返回到表變量中。

  2、新的output子局的語法為:

  output into @table_variable

  可以通過引用插入的表或刪除的表來訪問被修改的行的舊/新影象,其方式與訪問觸發(fā)器類似。在insert語句中,只能訪問插入的表。在delete語句中,只能訪問刪除的表。在update語句中,可以訪問插入的表和刪除的表。

國內(nèi)最大的酷站演示中心!
|||

  3、代碼演示

use demo
go
create table tt
(
id int identity,
c1 varchar(15)
)
go
insert into tt values ('r1')
insert into tt values ('r2')
insert into tt values ('r5')
insert into tt values ('r6')
insert into tt values ('r7')
insert into tt values ('r8')
insert into tt values ('r9')
insert into tt values ('r10')
declare @del as table (deletedid int, deletedvalue varchar(15))
delete tt
output deleted.id, deleted.c1 into @del
where id < 3
select * from @del
go
-----------------------------------------------
use demo
go
create table toptest (column1 varchar(150))
go
insert into toptest values('t1')
insert into toptest values('t2')
insert into toptest values('t3')
insert into toptest values('t4')
insert into toptest values('t5')
insert into toptest values('t6')
insert into toptest values('t7')
insert into toptest values('t8')
select * from toptest
go
create table toptest2 (column2 varchar(150))
go
insert into toptest2 values('c1')
insert into toptest2 values('c2')
--聲明3個變量
declare @a int
declare @b int
declare @c int
--賦值
set @a = 10
set @b = 5
select @c = @a/@b
--使用計算表達式
select top(@c) * from toptest
--使用select語句作為條件
select top(select count(*) from toptest2) *
from toptest
--指出top
delete top(2) toptest where column1>'t6'
--更新top
update top(2) toptest set column1 = 'hi' where column1<='t2'
select * from toptest



|||

  排序函數(shù) ranking functions

  1、sql server引入幾個新的排序函數(shù):如row_number、rank、dense_rank等。這些新函數(shù)使您可以有效地分析數(shù)據(jù)以及向查詢的結(jié)果行提供排序值。

  2、排序函數(shù)都遵循類似的語法模式:()over,([partition by],order by)。該函數(shù)只能在查詢的兩個子句中指定 - 在select子句或order by子句中。以下詳細討論不同的函數(shù)。

  3、row_number

  row_number是結(jié)果集的順序, 而不是數(shù)據(jù)庫中紀錄存放的原始順序

use demo
go
create table rankorder
(
orderid int,
qty int
)
go
insert rankorder values(30001,10)
insert rankorder values(10001,10)
insert rankorder values(10006,10)
insert rankorder values(40005,10)
insert rankorder values(30003,15)
insert rankorder values(30004,20)
insert rankorder values(20002,20)
insert rankorder values(20001,20)
insert rankorder values(10005,30)
insert rankorder values(30007,30)
insert rankorder values(40001,40)
go
select orderid,qty,
row_number() over(order by qty) as rownumber,
rank()    over(order by qty) as rank,
dense_rank() over(order by qty) as denserank
from rankorder
order by qty

  通用表表達式 common table expressions

  通用表表達式(cte)是一個可以由定義語句引用的臨時表命名的結(jié)果集。在他們的簡單形式中,您可以將cte視為類似于視圖和派生表混合功能的改進版本。在查詢的from子句中引用cte的方式類似于引用派生表和視圖的方式。只須定義cte一次,即可在查詢中多次引用它。在cte的定義中,可以引用在同一批處理中定義的變量。但是cte的真正威力在于它們的遞歸功能,即cte可以包含對它們自身的引用。


|||

  視圖、派生表和cte內(nèi)部的查詢的一般形式

  1、視圖

create view <view_name>(<column_aliases>) as <view_query>

  2、派生表

select * from (<derived_table)query>) as <dericed_table_alias>(<column_aliases>)

  3、cte

with <cte_alias>(<column_aliases>)
as
{
<cte_query>
)
select * from <cte_alias]>

  在關(guān)鍵字with之后,為cte提供一個別名,并且為它的結(jié)果列提供一個可選的別名列表;編寫cte的主體;然后從外部查詢中引用它。

  4、演示代碼

use adventureworks
go
with salescte(productid, salesorderid)
as
(
select productid, count(salesorderid)
from sales.salesorderdetail
group by productid
)
select * from salescte

  recursive ctes 遞歸的通用表表達式

  遞歸的cte是根據(jù)至少兩個查詢(或者稱為兩個成員)構(gòu)建的,一個是非遞歸查詢,也成為固定成員,只能調(diào)用一次,另外一個是遞歸查詢,也成為遞歸成員(rm),可以反復(fù)調(diào)用,直到查詢不再返回行。查詢由union all運算符連接為一個單獨的cte。

  --使用遞歸的通用表表達式

use demo
go
create table carparts
(
carid int not null,
part varchar(15),
subpart varchar(15),
qty int
)
go
insert carparts values (1, 'body', 'door', 4)
insert carparts values (1, 'body', 'trunk lid', 1)
insert carparts values (1, 'body', 'car hood', 1)
insert carparts values (1, 'door', 'handle', 1)
insert carparts values (1, 'door', 'lock', 1)
insert carparts values (1, 'door', 'window', 1)
insert carparts values (1, 'body', 'rivets', 1000)
insert carparts values (1, 'door', 'rivets', 100)
insert carparts values (1, 'door', 'mirror', 1)
go
select * from carparts
go
with carpartscte(subpart, qty)
as
(
-- 固定成員 (am):
-- select查詢無需參考carpartscte
select subpart, qty
from carparts
where part = 'body'
union all
-- 遞歸成員 (rm):
-- select查詢參考carpartscte
select carparts.subpart, carpartscte.qty * carparts.qty
from carpartscte
inner join carparts on carpartscte.subpart = carparts.part
where carparts.carid = 1
)
-- 外部查詢
select subpart, sum(qty) as totalnum
from carpartscte
group by subpart

國內(nèi)最大的酷站演示中心!
|||

  新的關(guān)系運算符 pivot/unpivot/apply

  1、pivot

  pivot運算符將行旋轉(zhuǎn)為列,并且可能同時執(zhí)行聚合。使用pivot運算符時要注意的重要一點是,需要為它提供一個查詢表達式,表達式使用視圖、派生表或者是cte只返回所關(guān)注的列。

  2、unpivot

  unpivot運算符執(zhí)行與pivot運算符相反的操作;他將列旋轉(zhuǎn)為行了。

  3、apply

  apply關(guān)系運算符允許您對外部表的每個行調(diào)用指定的表值函數(shù)一次。您可以在查詢的from子句中指定apply,其方式與使用join關(guān)系運算符類似。apply具有兩種形式:cross apply和outer apply。

  演示:

use demo
go
create table orders
(
customer varchar(10) not null,
product varchar(20) not null,
quantity int not null
)
go
insert orders values('mike', 'bike',3)
insert orders values('mike','chain',2)
insert orders values('mike','bike',5)
insert orders values('lisa','bike',3)
insert orders values('lisa','chain',3)
insert orders values('lisa','chain',4)
insert orders values('lisa','bike',2)
select * from orders
select * from orders
pivot (sum(quantity) for product in ([bike],[chain])) as a
use demo
go
create table sales1
(
[year] int,
quarter char(2),
amount float
)
go
insert into sales1 values (2001, 'q1', 80)
insert into sales1 values (2001, 'q2', 70)
insert into sales1 values (2001, 'q3', 55)
insert into sales1 values (2001, 'q3', 110)
insert into sales1 values (2001, 'q4', 90)
insert into sales1 values (2002, 'q1', 200)
insert into sales1 values (2002, 'q2', 150)
insert into sales1 values (2002, 'q2', 40)
insert into sales1 values (2002, 'q2', 60)
insert into sales1 values (2002, 'q3', 120)
insert into sales1 values (2002, 'q3', 110)
insert into sales1 values (2002, 'q4', 180)
go
select * from sales1
pivot
(sum (amount) --使用sum聚合數(shù)量列
for [quarter] --pivot quarter 列
in (q1, q2, q3, q4)) --使用季節(jié)
as p
go
select * into temp1 from orders
pivot (sum(quantity) for product in ([bike],[chain])) as a
select * from temp1
select customer, product,quantity
from temp1
unpivot(quantity for product in ([bike],[chain])) as a
----------------------------------------------------
use demo
go
create table arrays
(
aid int not null identity primary key,
array varchar(7999) not null
)
go
insert into arrays values('')
insert into arrays values('10')
insert into arrays values('20,40,30')
insert into arrays values('-1,-3,-5')
go
create function function1(@arr as varchar(7999))
returns @t table(pos int not null, value int not null)
as
begin
declare @end as int, @start as int, @pos as int
select @arr = @arr + ',', @pos = 1,
@start = 1, @end = charindex(',', @arr, @start)
while @end > 1
begin
insert into @t values(@pos, substring(@arr, @start, @end - @start))
select @pos = @pos + 1,
@start = @end + 1, @end = charindex(',', @arr, @start)
end
return
end
--測試
select * from function1('200,400,300')
go
select a.aid, f.*
from arrays as a
cross apply function1(array) as f
go
select a.aid, f.*
from arrays as a
outer apply function1(array) as f
go

|||

  ddl觸發(fā)器 ddl triggers

  sql server 2005可以就整個服務(wù)器或數(shù)據(jù)庫的某個范圍為ddl事件定義觸發(fā)器。也可以為單個ddl語句(例如:creat_table、drop_table等)或者為一組語句(例如:指定ddl_database_level_events想要觸發(fā)器觸發(fā)數(shù)據(jù)庫所有ddl事件)定義ddl觸發(fā)器。

  在ddl觸發(fā)器內(nèi)部,可以通過訪問eventdata()函數(shù)獲得與激發(fā)該觸發(fā)器的事件有關(guān)的數(shù)據(jù)。該eventdata()函數(shù)返回有關(guān)事件的xml數(shù)據(jù)。

  ddl觸發(fā)器特別有用的方案包括ddl更改的完整性檢查、審核方案以及其他方案。

  代碼演示:

use demo
go
create trigger prevent_drop_table on database for drop_table
as
raiserror('沒有刪除表的權(quán)限.', 10, 1)
print '嘗試在數(shù)據(jù)庫' + db_name() + '中刪除表.'
print convert (nvarchar (1000),eventdata())
rollback
go
-- 測試
create table testdrop(col1 int)
go
insert into testdrop values(1)
drop table testdrop
-- server
create trigger audit_ddl_logins on all server
for create_login, alter_login, drop_login
as
print '發(fā)生ddl login.'
print convert (nvarchar (1000),eventdata())
go
-- 測試
create login login1 with password = '123'
alter login login1 with password = 'xyz'
drop login login1

  總結(jié)

  sql server 2005中的transaction-sql增強功能提高了用戶在編寫查詢時的表達能力,使用戶可以改善代碼的性能,并且擴充了錯誤處理能力。sql server 2005 在transaction-sql上所做的改進反映了其更好地滿足了ansi-99 sql規(guī)范的要求以及客戶的需求。在transaction-sql和托管代碼之間的選擇。

,歡迎訪問網(wǎng)頁設(shè)計愛好者web開發(fā)。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 龙南县| 南开区| 灌阳县| 勃利县| 寿光市| 库车县| 米易县| 论坛| 庄河市| 门源| 丽江市| 巴塘县| 金沙县| 眉山市| 老河口市| 当雄县| 台东县| 寿阳县| 开远市| 衡南县| 襄垣县| 湖南省| 凤庆县| 景泰县| 太湖县| 镇原县| 新源县| 蚌埠市| 雷波县| 永川市| 临潭县| 清新县| 铜梁县| 巫溪县| 宁河县| 和政县| 邢台市| 保靖县| 墨江| 岑溪市| 屯门区|