http://www.cnblogs.com/vic_lu/archive/2011/06/24/2088883.html
http://imdbt.blog.51cto.com/903896/203613
if exists (select * from dbo.sysobjects
where id = object_id(N'[dbo].[p_splitpage]')
and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_splitpage]
GO
create procedure p_splitpage
@sql nvarchar(4000), --要執行的sql語句
@currentpage int=2, --要顯示的頁碼
@pagesize int=10, --每頁的大小
@recordcount int=0 out, --記錄數
@pagecount int=0 out --總頁數
as
set nocount on
declare @p1 int
exec sp_cursoropen @p1 output,@sql,@scrollopt=1,@ccopt=1,@rowcount=@pagecount output
select @recordcount=@pagecount,@pagecount=ceiling(1.0*@pagecount/@pagesize)
,@currentpage=(@currentpage-1)*@pagesize+1
select @recordcount recordcount ,@pagecount pagecount,@currentpage currentpage
exec sp_cursorfetch @p1,16,@currentpage,@pagesize
exec sp_cursorclose @p1
go
一、定義變量
--簡單賦值 |
declare
@a int |
set
@a=5 |
print @a |
|
--使用select語句賦值 |
declare
@user1 nvarchar(50) |
select
@user1= '張三' |
print @user1 |
declare
@user2 nvarchar(50) |
select
@user2 = Name from ST_User
where ID=1
|
print @user2 |
|
--使用update語句賦值 |
declare
@user3 nvarchar(50) |
update
ST_User set @user3 = Name
where ID=1 |
print @user3 |
二、表、臨時表、表變量
--創建臨時表1 |
create
table #DU_User1 |
( |
[ID] [ int ] NOT
NULL , |
[Oid] [ int ] NOT
NULL , |
[Login] [nvarchar](50) NOT
NULL , |
[Rtx] [nvarchar](4) NOT
NULL , |
[ Name ] [nvarchar](5) NOT
NULL , |
[ Password ] [nvarchar]( max ) NULL ,
|
[State] [nvarchar](8) NOT
NULL |
); |
--向臨時表1插入一條記錄 |
insert
into #DU_User1 (ID,Oid,[Login],Rtx, Name ,[ Password ],State) values
(100,2, 'LS' , '0000' , '臨時' , '321' , '特殊' ); |
|
--從ST_User查詢數據,填充至新生成的臨時表 |
select
* into #DU_User2
from ST_User where ID<8
|
|
--查詢並聯合兩臨時表 |
select
* from #DU_User2
where ID<3 union select
* from #DU_User1
|
|
--刪除兩臨時表 |
drop
table #DU_User1 |
drop
table #DU_User2 |
--創建臨時表 |
CREATE
TABLE #t |
( |
[ID] [ int ] NOT
NULL , |
[Oid] [ int ] NOT
NULL , |
[Login] [nvarchar](50) NOT
NULL , |
[Rtx] [nvarchar](4) NOT
NULL , |
[ Name ] [nvarchar](5) NOT
NULL , |
[ Password ] [nvarchar]( max ) NULL ,
|
[State] [nvarchar](8) NOT
NULL , |
) |
|
--將查詢結果集(多條數據)插入臨時表 |
insert
into #t select *
from ST_User
|
--不能這樣插入 |
--select * into #t from dbo.ST_User |
|
--添加一列,爲int型自增長子段 |
alter
table #t add [myid]
int NOT
NULL IDENTITY(1,1) |
--添加一列,默認填充全球唯一標識 |
alter
table #t add [myid1] uniqueidentifier
NOT NULL
default (newid()) |
|
select
* from #t
|
drop
table #t |
--給查詢結果集增加自增長列 |
|
--無主鍵時: |
select
IDENTITY( int ,1,1) as ID,
Name ,[Login],[ Password ] into
#t from ST_User
|
select
* from #t
|
|
--有主鍵時: |
select
( select SUM (1) from
ST_User where
ID<= a.ID) as myID,*
from ST_User a
order by
myID |
--定義表變量 |
declare
@t table |
( |
id
int not
null , |
msg nvarchar(50) null |
) |
insert
into @t values (1, '1' ) |
insert
into @t values (2, '2' ) |
select
* from @t |
三、循環
--while循環計算1到100的和 |
declare
@a int |
declare
@ sum int |
set
@a=1 |
set
@ sum =0 |
while @a<=100 |
begin |
set @ sum +=@a |
set @a+=1
|
end |
print @ sum |
四、條件語句
--if,else條件分支 |
if(1+1=2) |
begin |
print '對' |
end |
else |
begin |
print '錯' |
end |
|
--when then條件分支 |
declare
@today int |
declare
@week nvarchar(3) |
set
@today=3 |
set
@week= case |
when @today=1
then '星期一' |
when @today=2
then '星期二' |
when @today=3
then '星期三' |
when @today=4
then '星期四' |
when @today=5
then '星期五' |
when @today=6
then '星期六' |
when @today=7
then '星期日' |
else '值錯誤' |
end |
print @week |
五、遊標
declare
@ID int |
declare
@Oid int |
declare
@Login varchar (50) |
|
--定義一個遊標 |
declare
user_cur cursor
for select ID,Oid,[Login] from
ST_User |
--打開遊標 |
open
user_cur |
while @@fetch_status=0 |
begin |
--讀取遊標 |
fetch next
from user_cur into
@ID,@Oid,@Login |
print @ID |
--print @Login |
end |
close
user_cur |
--摧毀遊標 |
deallocate
user_cur |
六、觸發器
觸發器中的臨時表:
Inserted
存放進行insert和update 操作後的數據
Deleted
存放進行delete 和update操作前的數據
--創建觸發器 |
Create
trigger User_OnUpdate |
On ST_User
|
for Update |
As |
declare @msg nvarchar(50)
|
--@msg記錄修改情況 |
select @msg = N '姓名從“'
+ Deleted. Name
+ N '”修改爲“' + Inserted. Name
+ '”'
from Inserted,Deleted |
--插入日誌表 |
insert into
[LOG](MSG) values (@msg) |
|
--刪除觸發器 |
drop
trigger User_OnUpdate |
七、存儲過程
--創建帶output參數的存儲過程 |
CREATE
PROCEDURE PR_Sum |
@a
int , |
@b
int , |
@ sum int
output |
AS |
BEGIN |
set @ sum =@a+@b |
END |
|
--創建Return返回值存儲過程 |
CREATE
PROCEDURE PR_Sum2 |
@a
int , |
@b
int |
AS |
BEGIN |
Return @a+@b
|
END |
|
--執行存儲過程獲取output型返回值 |
declare
@mysum int |
execute
PR_Sum 1,2,@mysum output |
print @mysum |
|
--執行存儲過程獲取Return型返回值 |
declare
@mysum2 int |
execute
@mysum2= PR_Sum2 1,2 |
print @mysum2 |
八、自定義函數
函數的分類:
1)標量值函數
2)表值函數
a:內聯表值函數
b:多語句表值函數
3)系統函數
--新建標量值函數 |
create
function FUNC_Sum1 |
( |
@a
int , |
@b
int |
) |
returns
int |
as |
begin |
return @a+@b
|
end |
|
--新建內聯表值函數 |
create
function FUNC_UserTab_1 |
( |
@myId int |
) |
returns
table |
as |
return
( select *
from ST_User where ID<@myId)
|
|
--新建多語句表值函數 |
create
function FUNC_UserTab_2 |
( |
@myId int |
) |
returns
@t table |
( |
[ID] [ int ] NOT
NULL , |
[Oid] [ int ] NOT
NULL , |
[Login] [nvarchar](50) NOT
NULL , |
[Rtx] [nvarchar](4) NOT
NULL , |
[ Name ] [nvarchar](5) NOT
NULL , |
[ Password ] [nvarchar]( max ) NULL ,
|
[State] [nvarchar](8) NOT
NULL |
) |
as |
begin |
insert into
@t select *
from ST_User
where ID<@myId |
return |
end |
|
--調用表值函數 |
select
* from dbo.FUNC_UserTab_1(15) |
--調用標量值函數 |
declare
@s int |
set
@s=dbo.FUNC_Sum1(100,50) |
print @s |
|
--刪除標量值函數 |
drop
function FUNC_Sum1 |
談談自定義函數與存儲過程的區別:
一、自定義函數:
1. 可以返回表變量
2. 限制頗多,包括
不能使用output參數;
不能用臨時表;
函數內部的操作不能影響到外部環境;
不能通過select返回結果集;
不能update,delete,數據庫表;
3. 必須return 一個標量值或表變量
自定義函數一般用在複用度高,功能簡單單一,爭對性強的地方。
二、存儲過程
1. 不能返回表變量
2. 限制少,可以執行對數據庫表的操作,可以返回數據集
3. 可以return一個標量值,也可以省略return
存儲過程一般用在實現複雜的功能,數據操縱方面。