激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫(kù)技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫(kù) - Sql Server - SQL SERVER存儲(chǔ)過(guò)程用法詳解

SQL SERVER存儲(chǔ)過(guò)程用法詳解

2022-02-24 22:01.NET開(kāi)發(fā)菜鳥 Sql Server

本文詳細(xì)講解了SQL SERVER存儲(chǔ)過(guò)程用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

Transact-SQL中的存儲(chǔ)過(guò)程,非常類似于C#語(yǔ)言中的方法,可以重復(fù)調(diào)用。當(dāng)存儲(chǔ)過(guò)程執(zhí)行一次后,可以將語(yǔ)句存儲(chǔ)到緩存中,這樣下次執(zhí)行的時(shí)候直接使用緩存中的語(yǔ)句。這樣就可以提高存儲(chǔ)過(guò)程的性能。

 

一、存儲(chǔ)過(guò)程的概念

存儲(chǔ)過(guò)程Procedure是一組為了完成特定功能的SQL語(yǔ)句集合,經(jīng)過(guò)編譯后存儲(chǔ)在服務(wù)器端的數(shù)據(jù)庫(kù)中,經(jīng)過(guò)第一次編譯后再次調(diào)用不需要再次編譯,用戶通過(guò)指定存儲(chǔ)過(guò)程的名稱并給出參數(shù)來(lái)執(zhí)行,利用存儲(chǔ)過(guò)程可以加速SQL語(yǔ)句的執(zhí)行。

自定義存儲(chǔ)過(guò)程,由用戶創(chuàng)建并能完成某一特定功能的存儲(chǔ)過(guò)程,但是它與函數(shù)不同,存儲(chǔ)過(guò)程的返回值只是指明執(zhí)行是否成功。

存儲(chǔ)過(guò)程中可以包含邏輯控制語(yǔ)句和數(shù)據(jù)操縱語(yǔ)句,它可以接受參數(shù)、輸出參數(shù)、返回單個(gè)或多個(gè)結(jié)果集以及返回值。

由于存儲(chǔ)過(guò)程在創(chuàng)建時(shí)即在數(shù)據(jù)庫(kù)服務(wù)器上進(jìn)行了編譯并存儲(chǔ)在數(shù)據(jù)庫(kù)中,所以存儲(chǔ)過(guò)程運(yùn)行要比單個(gè)的SQL語(yǔ)句塊要快。同時(shí)由于在調(diào)用時(shí)只需用提供存儲(chǔ)過(guò)程名和必要的參數(shù)信息,所以在一定程度上也可以減少網(wǎng)絡(luò)流量、簡(jiǎn)單網(wǎng)絡(luò)負(fù)擔(dān)。

 

存儲(chǔ)過(guò)程的優(yōu)點(diǎn)

A、 存儲(chǔ)過(guò)程允許標(biāo)準(zhǔn)組件式編程

存儲(chǔ)過(guò)程創(chuàng)建后可以在程序中被多次調(diào)用執(zhí)行,而不必重新編寫該存儲(chǔ)過(guò)程的SQL語(yǔ)句。而且數(shù)據(jù)庫(kù)專業(yè)人員可以隨時(shí)對(duì)存儲(chǔ)過(guò)程進(jìn)行修改,但對(duì)應(yīng)用程序源代碼卻毫無(wú)影響,從而極大的提高了程序的可移植性。

B、 存儲(chǔ)過(guò)程能夠?qū)崿F(xiàn)較快的執(zhí)行速度

如果某一操作包含大量的T-SQL語(yǔ)句代碼,分別被多次執(zhí)行,那么存儲(chǔ)過(guò)程要比批處理的執(zhí)行速度快得多。因?yàn)榇鎯?chǔ)過(guò)程是預(yù)編譯的,在首次運(yùn)行一個(gè)存儲(chǔ)過(guò)程時(shí),查詢優(yōu)化器對(duì)其進(jìn)行分析、優(yōu)化,并給出最終被存在系統(tǒng)表中的存儲(chǔ)計(jì)劃。而批處理的T-SQL語(yǔ)句每次運(yùn)行都需要預(yù)編譯和優(yōu)化,所以速度就要慢一些。

C、 存儲(chǔ)過(guò)程減輕網(wǎng)絡(luò)流量

對(duì)于同一個(gè)針對(duì)數(shù)據(jù)庫(kù)對(duì)象的操作,如果這一操作所涉及到的T-SQL語(yǔ)句被組織成一存儲(chǔ)過(guò)程,那么當(dāng)在客戶機(jī)上調(diào)用該存儲(chǔ)過(guò)程時(shí),網(wǎng)絡(luò)中傳遞的只是該調(diào)用語(yǔ)句,否則將會(huì)是多條SQL語(yǔ)句。從而減輕了網(wǎng)絡(luò)流量,降低了網(wǎng)絡(luò)負(fù)載。

D、 存儲(chǔ)過(guò)程可被作為一種安全機(jī)制來(lái)充分利用

系統(tǒng)管理員可以對(duì)執(zhí)行的某一個(gè)存儲(chǔ)過(guò)程進(jìn)行權(quán)限限制,從而能夠?qū)崿F(xiàn)對(duì)某些數(shù)據(jù)訪問(wèn)的限制,避免非授權(quán)用戶對(duì)數(shù)據(jù)的訪問(wèn),保證數(shù)據(jù)的安全。

 

二、存儲(chǔ)過(guò)程的分類

 

1、系統(tǒng)存儲(chǔ)過(guò)程

以sp_開(kāi)頭,用來(lái)進(jìn)行系統(tǒng)的各項(xiàng)設(shè)定.取得信息.相關(guān)管理工作。系統(tǒng)存儲(chǔ)過(guò)程是系統(tǒng)創(chuàng)建的存儲(chǔ)過(guò)程,目的在于能夠方便的從系統(tǒng)表中查詢信息或完成與更新數(shù)據(jù)庫(kù)表相關(guān)的管理任務(wù)或其他的系統(tǒng)管理任務(wù)。系統(tǒng)存儲(chǔ)過(guò)程主要存儲(chǔ)在master數(shù)據(jù)庫(kù)中,以“sp”下劃線開(kāi)頭的存儲(chǔ)過(guò)程。盡管這些系統(tǒng)存儲(chǔ)過(guò)程在master數(shù)據(jù)庫(kù)中,但我們?cè)谄渌麛?shù)據(jù)庫(kù)還是可以調(diào)用系統(tǒng)存儲(chǔ)過(guò)程。有一些系統(tǒng)存儲(chǔ)過(guò)程會(huì)在創(chuàng)建新的數(shù)據(jù)庫(kù)的時(shí)候被自動(dòng)創(chuàng)建在當(dāng)前數(shù)據(jù)庫(kù)中。

 

2、臨時(shí)存儲(chǔ)過(guò)程

分為兩種存儲(chǔ)過(guò)程:

一是本地臨時(shí)存儲(chǔ)過(guò)程,以井字號(hào)(#)作為其名稱的第一個(gè)字符,則該存儲(chǔ)過(guò)程將成為一個(gè)存放在tempdb數(shù)據(jù)庫(kù)中的本地臨時(shí)存儲(chǔ)過(guò)程,且只有創(chuàng)建它的用戶才能執(zhí)行它;

二是全局臨時(shí)存儲(chǔ)過(guò)程,以兩個(gè)井字號(hào)(##)號(hào)開(kāi)始,則該存儲(chǔ)過(guò)程將成為一個(gè)存儲(chǔ)在tempdb數(shù)據(jù)庫(kù)中的全局臨時(shí)存儲(chǔ)過(guò)程,全局臨時(shí)存儲(chǔ)過(guò)程一旦創(chuàng)建,以后連接到服務(wù)器的任意用戶都可以執(zhí)行它,而且不需要特定的權(quán)限。

 

3、用戶自定義存儲(chǔ)過(guò)程

創(chuàng)建存儲(chǔ)過(guò)程語(yǔ)法:

CREATE PROC [ EDURE ] procedure_name [ ; number ]
    [ { @parameter data_type }
        [ VARYING ] [ = default ] [ OUTPUT ]
    ] [ ,...n ]
[ WITH
    { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
[ FOR REPLICATION ]
AS
[ begin ]
    T-SQL 語(yǔ)句
[ end ]

每個(gè)參數(shù)名前要有一個(gè)“@”符號(hào),每一個(gè)存儲(chǔ)過(guò)程的參數(shù)僅為該程序內(nèi)部使用,參數(shù)的類型除了IMAGE外,其他SQL Server所支持的數(shù)據(jù)類型都可使用。

[OUTPUT]是用來(lái)指定該參數(shù)是輸入?yún)?shù)還是輸出參數(shù),默認(rèn)是輸入?yún)?shù)。

 

二、存儲(chǔ)過(guò)程的用法

創(chuàng)建測(cè)試表MyStudentInfo

CREATE table MyStudentInfo
(
  Id int not null primary key,
  Name varchar(16),
  Age int,
  Gender varchar(2),
  Phone varchar(16),
  Address varchar(50),
  GradeId int,
  Score int
)

如下圖所示

SQL SERVER存儲(chǔ)過(guò)程用法詳解

聯(lián)合插入多條數(shù)據(jù)

INSERT INTO MyStudentInfo
SELECT 1,"張三",20,"1","15801258912","上海",1,90 UNION
SELECT 2,"李四",22,"1","12345678901","北京",1,84 UNION
SELECT 3,"王五",16,"1","13976891234","天津",2,35 UNION
SELECT 4,"趙六",19,"1","18676891234","重慶",3,56 UNION
SELECT 5,"小紅",21,"2","17776891234","廣州",4,82 UNION
SELECT 6,"小王",25,"2","13176891234","深圳",5,54 UNION
SELECT 7,"小劉",18,"2","13374591234","南京",6,69 UNION
SELECT 8,"小張",16,"1","13974596734","長(zhǎng)沙",6,58 UNION
SELECT 9,"小羅",27,"1","13175122786","武漢",7,40 UNION
SELECT 10,"小袁",21,"2","17715872346","石家莊",8,34

執(zhí)行結(jié)果如下圖所示

SQL SERVER存儲(chǔ)過(guò)程用法詳解

創(chuàng)建表

CREATE table GradeInfo
(
  Id int not null primary key,
  GradeName varchar(16)
)

如下圖所示

SQL SERVER存儲(chǔ)過(guò)程用法詳解

聯(lián)合插入多條數(shù)據(jù)

INSERT INTO GradeInfo
SELECT 1,".NET" UNION
SELECT 2,"Android" UNION
SELECT 3,"PHP" UNION
SELECT 4,"UI" UNION
SELECT 5,"HTML5" UNION
SELECT 6,"JAVA" UNION
SELECT 9,"HADOOP" UNION
SELECT 10,"大數(shù)據(jù)"

如下圖所示

SQL SERVER存儲(chǔ)過(guò)程用法詳解

 

1、不帶參數(shù)的存儲(chǔ)過(guò)程,獲取MyStudentInfo表的所有記錄

-- 創(chuàng)建無(wú)參數(shù)的存儲(chǔ)過(guò)程,獲取MyStudentInfo表的所有記錄
create procedure Proc_GetInfo
as
begin
  select * from MyStudentInfo
end

執(zhí)行存儲(chǔ)過(guò)程

-- 執(zhí)行存儲(chǔ)過(guò)程
exec Proc_GetInfo

輸出結(jié)果

SQL SERVER存儲(chǔ)過(guò)程用法詳解

 

2、創(chuàng)建帶輸入?yún)?shù)的存儲(chǔ)過(guò)程

 CREATE proc Proc_InsertData
 @Id int,
 @Name varchar(16),
 @Age int,
 @Gender varchar(2),
 @Phone varchar(16),
 @Address varchar(50),
 @GradeId int,
 @Score int
 as
 begin
  insert INTO MyStudentInfo VALUES(@Id,@Name,@Age,@Gender,@Phone,@Address,@Gender,@Score)
 end
 go

執(zhí)行存儲(chǔ)過(guò)程

 exec Proc_InsertData @Id=11,@Name="小李",@Age=21,@Gender="2",@Phone="13981257512",@Address="太原",@GradeId=4,@Score=62
 GO

執(zhí)行結(jié)果

SQL SERVER存儲(chǔ)過(guò)程用法詳解

 

3、創(chuàng)建帶默認(rèn)值的輸入?yún)?shù)的存儲(chǔ)過(guò)程

 CREATE proc Proc_InsertDefault
 @Id int,
 @Name varchar(16),
 @Age int,
 @Gender varchar(2)="1",
 @Phone varchar(16),
 @Address varchar(50)="沈陽(yáng)",
 @GradeId int,
 @Score int
 as
 begin
  insert INTO MyStudentInfo VALUES(@Id,@Name,@Age,@Gender,@Phone,@Address,@Gender,@Score)
 end
 go

執(zhí)行存儲(chǔ)過(guò)程

exec Proc_InsertDefault @Id=12,@Name="小阮",@Age=24,@Phone="13832757512",@GradeId=4,@Score=70
go

 

4、創(chuàng)建帶輸出參數(shù)的存儲(chǔ)過(guò)程(根據(jù)輸入的ID返回年級(jí)ID)

在創(chuàng)建存儲(chǔ)過(guò)程時(shí),可以用關(guān)鍵字OUTPUT來(lái)創(chuàng)建一個(gè)輸出參數(shù),另外,調(diào)用時(shí)也必須給出OUTPUT關(guān)鍵字

 create proc Proc_Out
 @Id int, -- 默認(rèn)為輸入?yún)?shù)
 @gradeId int out  -- 輸出參數(shù)
 as
 begin
  select @gradeId=GradeId from MyStudentInfo where id=@id
 end

執(zhí)行存儲(chǔ)過(guò)程,按照存儲(chǔ)過(guò)程中定義的參數(shù)順序

 declare @GradeIdOut int
 exec Proc_Out 10,@GradeIdOut out
 print @GradeIdOut
 GO

執(zhí)行結(jié)果

SQL SERVER存儲(chǔ)過(guò)程用法詳解

執(zhí)行存儲(chǔ)過(guò)程,指定參數(shù)名稱進(jìn)行賦值,參數(shù)順序可以與定義時(shí)的參數(shù)順序不一致

DECLARE @Sid int
EXEC Proc_Out @gradeId=@Sid OUT,@Id=10
PRINT @Sid
go

執(zhí)行結(jié)果

SQL SERVER存儲(chǔ)過(guò)程用法詳解

 

5、創(chuàng)建帶返回值的存儲(chǔ)過(guò)程

print語(yǔ)句可以將用戶定義的消息返回給客戶端

編寫一個(gè)存儲(chǔ)過(guò)程,在插入學(xué)生數(shù)據(jù)前,先判斷學(xué)號(hào)是否存在,如果存在,

輸出“要插入的學(xué)生的學(xué)號(hào)已經(jīng)存在”;否則,插入學(xué)生數(shù)據(jù),返回“恭喜,數(shù)據(jù)插入成功”

 create proc Proc_Return
 @Id int,
 @Name varchar(16),
 @Age int,
 @Gender varchar(2),
 @Phone varchar(16),
 @Address varchar(50),
 @GradeId int,
 @Score int
 as
 begin
   IF exists (SELECT * FROM MyStudentInfo WHERE Id=@Id)
       begin
         print "要插入的學(xué)生的學(xué)號(hào)已經(jīng)存在"
         ROLLBACK
       end
   else
       begin
         insert INTO MyStudentInfo VALUES(@Id,@Name,@Age,@Gender,@Phone,@Address,@GradeId,@Score)
         print "恭喜,數(shù)據(jù)插入成功"
       end
 end
 GO

執(zhí)行存儲(chǔ)過(guò)程,該學(xué)號(hào)已經(jīng)存在

exec Proc_Return @Id=10,@Name="小李",@Age=21,@Gender="2",@Phone="13981257512",@Address="太原",@GradeId=4,@Score=75
go

執(zhí)行結(jié)果

SQL SERVER存儲(chǔ)過(guò)程用法詳解

執(zhí)行存儲(chǔ)過(guò)程,插入不存在的學(xué)號(hào)

exec Proc_Return @Id=15,@Name="小李",@Age=21,@Gender="2",@Phone="13981257512",@Address="太原",@GradeId=4,@Score=75
go

執(zhí)行結(jié)果

SQL SERVER存儲(chǔ)過(guò)程用法詳解

()return 語(yǔ)句,return語(yǔ)句可以從過(guò)程、批處理或語(yǔ)句塊中退出,不執(zhí)行其后繼語(yǔ)句

 CREATE proc Proc_Delete
 @name varchar(16)
 as
 begin
    delete FROM MyStudentInfo where Name=@name
    return @@rowcount
 end

調(diào)用存儲(chǔ)過(guò)程

  declare @Del_Row int
  exec @Del_Row= Proc_Delete @name="小劉"
  select @Del_Row 刪除的行
  GO

執(zhí)行結(jié)果

SQL SERVER存儲(chǔ)過(guò)程用法詳解

 

6、創(chuàng)建帶變量的存儲(chǔ)過(guò)程

/*在存儲(chǔ)過(guò)程可以定義變量,包括全局變量(@@變量名)和局部變量(@變量名)。
用于保存存儲(chǔ)過(guò)程中的臨時(shí)結(jié)果。
編寫存儲(chǔ)過(guò)程Proc_Var,根據(jù)輸入的學(xué)生學(xué)號(hào),計(jì)算該學(xué)生的平均成績(jī)。
根據(jù)該生平均成績(jī)與全體學(xué)生平均成績(jī)的關(guān)系,返回相應(yīng)信息*/

 create proc Proc_Var
 @id int,
 @ResStr varchar(16) out
 as
 begin
  --聲明變量
  declare @curAvg decimal(18,2)
  declare @totalAvg decimal(18,2)
  select @totalAvg=AVG(Score) from MyStudentInfo
  select @curAvg=AVG(Score) from MyStudentInfo where Id=@id
  IF @curAvg>@totalAvg
     set @ResStr="高于平均分"
  else
     set @ResStr="低于平均分"
  print "總平均分為:"+convert(varchar(18),@totalAvg)
  print "該生平均分為:"+convert(varchar(18),@curAvg)
  print @ResStr
 end

調(diào)用存儲(chǔ)過(guò)程

 declare @resstring varchar(20)
 exec Proc_Var 6,@resstring out
 go

執(zhí)行結(jié)果

SQL SERVER存儲(chǔ)過(guò)程用法詳解

 

7、創(chuàng)建帶輸入輸出參數(shù)的存儲(chǔ)過(guò)程

 create proc Proc_OutPut
 @Id int,--默認(rèn)輸入?yún)?shù)
 @Score int out,--輸出參數(shù)
 @Age int output --輸入輸出參數(shù)
 as
   begin
     select @Score=Score,@Age=Age from MyStudentInfo where Id=@Id and Age=@Age
   end
go

執(zhí)行存儲(chǔ)過(guò)程

declare @Sid int,@SScore int,@SAge int
set @Sid=8
set @SAge=16
exec Proc_OutPut @Sid,@SScore out,@SAge output
print "成績(jī):"+convert(varchar(8),@SScore)+",年齡:"+convert(varchar(8),@SAge)
go

執(zhí)行結(jié)果

SQL SERVER存儲(chǔ)過(guò)程用法詳解

 

8、創(chuàng)建分頁(yè)存儲(chǔ)過(guò)程

create proc Proc_Page
@StartIndex int,
@EndIndex int
as
begin
   select COUNT(*) from MyStudentInfo
   select * from (
      SELECT ROW_NUMBER() OVER(ORDER BY Id) AS rowid,* FROM MyStudentInfo ) temp
   where temp.rowid between @StartIndex AND @EndIndex
end
go

執(zhí)行存儲(chǔ)過(guò)程

exec Proc_Page 1,4
go

執(zhí)行結(jié)果

SQL SERVER存儲(chǔ)過(guò)程用法詳解

 

分頁(yè)存儲(chǔ)過(guò)程2

create proc Proc_P
@PageIndex int,
@PageSize int
as
begin
    declare @StartRow int,@EndRow int
    set @StartRow=(@PageIndex-1) * @PageSize +1
    set @EndRow =@StartRow+@PageSize-1
    select * from (
        SELECT ROW_NUMBER() OVER(ORDER BY Id ASC) as rowid ,* FROM MyStudentInfo ) temp
       where temp.rowid between @StartRow AND @EndRow
end
go

執(zhí)行存儲(chǔ)過(guò)程

exec Proc_P 2,4
go

執(zhí)行結(jié)果

SQL SERVER存儲(chǔ)過(guò)程用法詳解

 

9、返回多個(gè)結(jié)果集

-- 返回多個(gè)結(jié)果集
create procedure proc_get
@Stuid int,
@Gradeid int
as
begin
   select * from MyStudentInfo where id=@Stuid
   select * from GradeInfo where id=@Gradeid
end
go

執(zhí)行存儲(chǔ)過(guò)程

-- 執(zhí)行存儲(chǔ)過(guò)程
exec proc_get @Stuid=2,@GradeId=4

執(zhí)行結(jié)果

SQL SERVER存儲(chǔ)過(guò)程用法詳解

 

10、存儲(chǔ)過(guò)程中創(chuàng)建變量、賦值變量、創(chuàng)建表變量和臨時(shí)表

--創(chuàng)建名為 GetStuCou_Ext 的返回多個(gè)結(jié)果集的存儲(chǔ)過(guò)程
create procedure GetStuCou_Ext
@StuNo    nvarchar(64),
@Height nvarchar(32)
as
begin
    declare @Var nvarchar(10)    --定義變量

    set @Var="123"        --賦值變量

    --定義表變量
    declare @StuTab table
    (
        ID     int not null primary key,
        StuNo    nvarchar(50) unique,
        Name varchar(50),
        Sex varchar(10),
        Height varchar(10)
    )
    --表變量只能在定義的時(shí)候添加約束

    --定義臨時(shí)表
    create table #Tab
    (
        ID     int not null primary key,
        StuNo    nvarchar(50),
        Name varchar(50),
        Sex varchar(10),
        Height varchar(10)
    )

    alter table #Tab add constraint S_UNIQUE unique(StuNo)

    --臨時(shí)表可以在之后添加約束

    if(@StuNo is not null and @StuNo <> "")
    begin
        insert into @StuTab(ID,StuNo,Name,Sex,Height)    --把數(shù)據(jù)插入表變量
        select S_Id,S_StuNo,S_Name,S_Sex,S_Height
        from Student
        where S_StuNo=@StuNo

        insert into #Tab(ID,StuNo,Name,Sex,Height)    --把數(shù)據(jù)插入臨時(shí)表
        select S_Id,S_StuNo,S_Name,S_Sex,S_Height
        from Student
        where S_StuNo=@StuNo
    end

    if(@Height is not null and @Height <> "")
    begin
        insert into @StuTab(ID,StuNo,Name,Sex,Height)    --把數(shù)據(jù)插入表變量
        select S_Id,S_StuNo,S_Name,S_Sex,S_Height
        from Student
        where S_Height=@Height

        insert into #Tab(ID,StuNo,Name,Sex,Height)    --把數(shù)據(jù)插入臨時(shí)表
        select S_Id,S_StuNo,S_Name,S_Sex,S_Height
        from Student
        where S_Height=@Height
    end

    SELECT * FROM @StuTab
    select * from #Tab
end

--執(zhí)行名為 GetStuCou_DSS 的返回多個(gè)結(jié)果集的存儲(chǔ)過(guò)程
execute GetStuCou_Ext "005","185"

 

11、執(zhí)行動(dòng)態(tài)SQL

在存儲(chǔ)過(guò)程中可以執(zhí)行動(dòng)態(tài)的SQL

create proc GetStus
@StuNo nvarchar(500)
as
begin
    declare @Sql nvarchar(3000)

    if(@StuNo is not null and @StuNo <> "")
    begin
        set @Sql=" select * from Student where S_StuNo in ("+@StuNo+") "
    end

    exec (@Sql)    --執(zhí)行動(dòng)態(tài) sql
end

exec GetStus "003,005,009"        --執(zhí)行存儲(chǔ)過(guò)程 GetStus

到此這篇關(guān)于SQL SERVER存儲(chǔ)過(guò)程用法詳解的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://www.cnblogs.com/dotnet261010/p/5921211.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本成年免费网站 | 综合国产在线 | 国产一级爱c视频 | 欧美成人h版在线观看 | 欧美成人小视频 | 亚洲免费片 | 国产亚洲精品影达达兔 | 欧美日本免费一区二区三区 | 免费黄色一级网站 | 免费看日韩片 | 成人毛片免费播放 | 国产pron | 91美女视频在线观看 | 欧美18videos性处按摩 | 港台三级在线观看 | 久久亚洲一区二区三区成人国产 | 综合毛片| 久久精品2019中文字幕 | 狠狠色噜噜狠狠狠米奇9999 | 黄色一级片在线观看 | 国产成人在线免费视频 | 曰韩在线视频 | 91精品久久久久久 | 久久久久9999 | 欧美成人精品一区二区 | 一区二区三区手机在线观看 | 欧美另类视频一区 | 一区二区三区国产视频 | 26uuu成人人网图片 | 中文字幕在线观看视频www | h网站在线观看 | 日本一级黄色大片 | 国产一区二区不卡视频 | 欧美精品v国产精品v日韩精品 | 免费黄色的视频 | 黑人一区二区三区四区五区 | 叉逼视频 | 久久99国产伦子精品免费 | 久草最新在线 | 国产精品v片在线观看不卡 成人一区二区三区在线 | freexxxhd喷水|