亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

SQL Server基礎之存儲過程

2024-08-31 00:54:32
字體:
來源:轉載
供稿:網友
SQL Server基礎之存儲過程

  簡單來說,存儲過程就是一條或者多條sql語句的集合,可視為批處理文件,但是其作用不僅限于批處理。本篇主要介紹變量的使用,存儲過程和存儲函數的創建,調用,查看,修改以及刪除操作。

一:存儲過程概述

 SQLServer中的存儲過程是使用T_SQL編寫的代碼段。它的目的在于能夠方便的從系統表中查詢信息,或者完成與更新數據庫表相關的管理任務和其他的系統管理任務.T_SQL語句是SQLServer數據庫與應用程序之間的編程接口。在很多情況下,一些代碼會被開發者重復編寫多次,如果每次都編寫相同功能的代碼,不但繁瑣,而且容易出錯,而且由于SQLServer逐條的執行語句會降低系統的運行效率。

 簡而言之,存儲過程就是SQLServer為了實現特定任務,而將一些需要多次調用的固定操作語句編寫成程序段,這些程序段存儲在服務器上,有數據庫服務器通過程序來調用。

存儲過程的優點:

  1. 存儲過程加快系統運行速度,存儲過程只在創建時編譯,以后每次執行時不需要重新編譯。
  2. 存儲過程可以封裝復雜的數據庫操作,簡化操作流程,例如對多個表的更新,刪除等。
  3. 可實現模塊化的程序設計,存儲過程可以多次調用,提供統一的數據庫訪問接口,改進應用程序的可維護性。
  4. 存儲過程可以增加代碼的安全性,對于用戶不能直接操作存儲過程中引用的對象,SQLServer可以設定用戶對指定存儲過程的執行權限。
  5. 存儲過程可以降低網絡流量,存儲過程代碼直接存儲于數據庫中,在客戶端與服務器的通信過程中,不會產生大量的T_SQL代碼流量。

存儲過程的缺點:

  1. 數據庫移植不方便,存儲過程依賴與數據庫管理系統,SQLServer存儲過程中封裝的操作代碼不能直接移植到其他的數據庫管理系統中。
  2. 不支持面向對象的設計,無法采用面向對象的方式將邏輯業務進行封裝,甚至形成通用的可支持服務的業務邏輯框架.
  3. 代碼可讀性差,不易維護。不支持集群。
二:存儲過程分類

1.系統存儲過程

  系統存儲過程是SQLServer系統自身提供的存儲過程,可以作為命令執行各種操作。

  系統存儲過程主要用來從系統表中獲取信息,使用系統存儲過程完成數據庫服務器的管理工作,為系統管理員提供幫助,為用戶查看數據庫對象提供方便,系統存儲過程位于數據庫服務器中,并且以sp_開頭,系統存儲過程定義在系統定義和用戶定義的數據庫中,在調用時不必在存儲過程前加數據庫限定名。例如:sp_rename系統存儲過程可以修改當前數據庫中用戶創建對象的名稱,sp_helptext存儲過程可以顯示規則,默認值或視圖的文本信息,SQLSERVER服務器中許多的管理工作都是通過執行系統存儲過程來完成的,許多系統信息也可以通過執行系統存儲過程來獲得。

  系統存儲過程創建并存放在與系統數據庫master中,一些系統存儲過程只能由系統管理員使用,而有些系統存儲過程通過授權可以被其它用戶所使用。

2.用戶存儲過程(自定義存儲過程)

  自定義存儲過程即用戶使用T_SQL語句編寫的、為了實現某一特定業務需求,在用戶數據庫中編寫的T_SQL語句集合,自定義存儲過程可以接受輸入參數、向客戶端返回結果和信息,返回輸出參數等。創建自定義存儲過程時,存儲過程名前加上"##"表示創建了一個全局的臨時存儲過程;存儲過程前面加上"#"時,表示創建的局部臨時存儲過程。局部臨時存儲過程只能在創建它的回話中使用,會話結束時,將被刪除。這兩種存儲過程都存儲在tempdb數據庫中。

用戶定義的存儲過程分為兩類:T_SQL和CLR

T_SQL:存儲過程是值保存的T_SQL語句集合,可以接受和返回用戶提供的參數,存儲過程也可能從數據庫向客戶端應用程序返回數據。

CLR存儲過程是指引用Microsoft.NETFramework公共語言的方法存儲過程,可以接受和返回用戶提供的參數,它們在.NETFramework程序集是作為類的公共靜態方法實現的。

3.擴展存儲過程

 擴展存儲過程是以在SQLSERVER環境外執行的動態連接(DLL文件)來實現的,可以加載到SQLSERVER實例運行的地址空間中執行,擴展存儲過程可以用SQLSERVER擴展存儲過程API編程,擴展存儲過程以前綴"xp_"來標識,對于用戶來說,擴展存儲過程和普通話存儲過程一樣,可以用相同的方法來執行。

三:創建存儲過程

工欲善其事,必先利其器,準備數據如下:

use sample_db;--創建測試books表create table books (    book_id int identity(1,1) PRimary key,    book_name varchar(20),    book_price float,    book_auth varchar(10));--插入測試數據insert into books (book_name,book_price,book_auth)                    values                        ('論語',25.6,'孔子'),                        ('天龍八部',25.6,'金庸'),                        ('雪山飛狐',32.7,'金庸'),                        ('平凡的世界',35.8,'路遙'),                        ('史記',54.8,'司馬遷');
1.創建無參存儲過程
--1.創建無參存儲過程if (exists (select * from sys.objects where name = 'getAllBooks'))    drop proc proc_get_studentgocreate procedure getAllBooksasselect * from books;--調用,執行存儲過程exec getAllBooks;
2.修改存儲過程
alter procedure dbo.getAllBooks asselect book_auth from books;
3.刪除存儲過程
drop procedure getAllBooks;
4.重命名存儲過程
sp_rename getAllBooks,proc_get_allBooks;
5.創建帶參數的存儲過程

 存儲過程的參數分為兩種:輸入參數和輸出參數

輸入參數:用于向存儲過程傳入值,類似java語言或則c中的值傳遞。

輸出參數:用于調用存儲過程后,參會結果,類似java語言的按引用傳遞。

值傳遞和引用傳遞區別:

  • 基本數據類型賦值屬于值傳遞;引用類型之間賦值屬于引用傳遞。
  • 值傳遞傳遞的是實實在在的變量值;引用傳遞傳遞的是對象的引用地址。
  • 值傳遞后,兩個變量改變的是各自的值;引用傳遞后,兩個引用改變的是同一個對象的狀態

(1)帶一個參數存儲過程

if (exists (select * from sys.objects where name = 'searchBooks'))    drop proc searchBooksgocreate proc searchBooks(@bookID int)as    --要求book_id列與輸入參數相等    select * from books where book_id=@bookID;--執行searchBooksexec searchBooks 1;

(2)帶2個參數存儲過程

if (exists (select * from sys.objects where name = 'searchBooks1'))    drop proc searchBooks1gocreate proc searchBooks1(    @bookID int,    @bookAuth varchar(20))as    --要求book_id和book_Auth列與輸入參數相等    select * from books where book_id=@bookID and book_auth=@bookAuth;exec searchBooks1 1,'金庸';

(3)創建有返回值的存儲過程

if (exists (select * from sys.objects where name = 'getBookId'))    drop proc getBookIdgocreate proc getBookId(    @bookAuth varchar(20),--輸入參數,無默認值    @bookId int output --輸入/輸出參數 無默認值)as    select @bookId=book_id from books where book_auth=@bookAuth--執行getBookId這個帶返回值的存儲過程declare @id int --聲明一個變量用來接收執行存儲過程后的返回值exec getBookId '孔子',@id outputselect @id as bookId;--as是給返回的列值起一個名字

(4)創建帶通配符的存儲過程

if (exists (select * from sys.objects where name = 'charBooks'))    drop proc charBooksgocreate proc charBooks(    @bookAuth varchar(20)='金%',    @bookName varchar(20)='%')as     select * from books where book_auth like @bookAuth and book_name like @bookName;--執行存儲過程charBooksexec  charBooks    '孔%','論%';

(5)加密存儲過程

  with encryption子句對用戶隱藏存儲過程的文本.下例創建加密過程,使用 sp_helptext 系統存儲過程獲取關于加密過程的信息,然后嘗試直接從 syscomments 表中獲取關于該過程的信息.

if (object_id('books_encryption', 'P') is not null)    drop proc books_encryptiongocreate proc books_encryption with encryptionas     select * from books;--執行此過程books_encryptionexec books_encryption;exec sp_helptext 'books_encryption';--控制臺會顯示"對象 'books_encryption' 的文本已加密。"

(6).不緩存存儲過程

--with  recompile不緩存if (object_id('book_temp', 'P') is not null)    drop proc book_tempgocreate proc book_tempwith recompileas    select * from books;goexec book_temp;exec sp_helptext 'book_temp';

(7).創建帶游標參數的存儲過程

if (object_id('book_cursor', 'P') is not null)    drop proc book_cursorgocreate proc book_cursor    @bookCursor cursor varying outputas    set @bookCursor=cursor forward_only static for    select book_id,book_name,book_auth from books    open @bookCursor;go--調用book_cursor存儲過程declare @cur cursor,        @bookID int,        @bookName varchar(20),        @bookAuth varchar(20);exec book_cursor @bookCursor=@cur output;fetch next from @cur into @bookID,@bookName,@bookAuth;while(@@FETCH_STATUS=0)begin     fetch next from @cur into @bookID,@bookName,@bookAuth;    print 'bookID:'+convert(varchar,@bookID)+' , bookName: '+ @bookName            +' ,bookAuth: '+@bookAuth;endclose @cur    --關閉游標DEALLOCATE @cur; --釋放游標

(8).創建分頁存儲過程

if (object_id('book_page', 'P') is not null)    drop proc book_pagegocreate proc book_page(    @TableName varchar(50),            --表名    @ReFieldsStr varchar(200) = '*',   --字段名(全部字段為*)    @OrderString varchar(200),         --排序字段(必須!支持多字段不用加order by)    @WhereString varchar(500) =N'',  --條件語句(不用加where)    @PageSize int,                     --每頁多少條記錄    @PageIndex int = 1 ,               --指定當前為第幾頁    @TotalRecord int output            --返回總記錄數)asbegin     --處理開始點和結束點    Declare @StartRecord int;    Declare @EndRecord int;     Declare @TotalCountSql nvarchar(500);     Declare @SqlString nvarchar(2000);        set @StartRecord = (@PageIndex-1)*@PageSize + 1    set @EndRecord = @StartRecord + @PageSize - 1     SET @TotalCountSql= N'select @TotalRecord = count(*) from ' + @TableName;--總記錄數語句    SET @SqlString = N'(select row_number() over (order by '+ @OrderString +') as rowId,'+@ReFieldsStr+' from '+ @TableName;--查詢語句    --    IF (@WhereString! = '' or @WhereString!=null)        BEGIN            SET @TotalCountSql=@TotalCountSql + '  where '+ @WhereString;            SET @SqlString =@SqlString+ '  where '+ @WhereString;                    END    --第一次執行得到    --IF(@TotalRecord is null)    --   BEGIN           EXEC sp_executesql @totalCountSql,N'@TotalRecord int out',@TotalRecord output;--返回總記錄數    --  END    ----執行主語句    set @SqlString ='select * from ' + @SqlString + ') as t where rowId between ' + ltrim(str(@StartRecord)) + ' and ' +  ltrim(str(@EndRecord));    Exec(@SqlString)    END--調用分頁存儲過程book_pageexec book_page 'books','*','book_id','',3,1,0;--declare @totalCount intexec book_page 'books','*','book_id','',3,1,@totalCount output; select @totalCount as totalCount;--總記錄數。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产99精品国自产| 日韩a**站在线观看| 亚洲网站视频福利| 成人两性免费视频| 国产精品69av| 精品久久久久久久久久久| 97色在线视频观看| 国内精品久久久久久影视8| www.欧美精品| 国产精品丝袜一区二区三区| 在线观看日韩视频| 久久伊人精品天天| 国内精品久久久久久| 国产久一一精品| 精品福利视频导航| 欧美日本在线视频中文字字幕| 亚洲第一av在线| 国产精品久久中文| 国产成人精品久久二区二区91| 日韩在线视频播放| 欧美日韩免费在线| 亚洲黄色免费三级| 成人欧美一区二区三区黑人孕妇| 亚洲va欧美va国产综合剧情| 欧美成人午夜剧场免费观看| 亚洲精品国精品久久99热一| 日韩成人中文字幕在线观看| 92看片淫黄大片欧美看国产片| 66m—66摸成人免费视频| 95av在线视频| 在线精品视频视频中文字幕| 国产精品h在线观看| 丁香五六月婷婷久久激情| 欧美裸体xxxx极品少妇| 欧美日韩人人澡狠狠躁视频| 播播国产欧美激情| 亚洲国产精品电影在线观看| 国产亚洲一区二区精品| 久久久亚洲天堂| 欧美中文在线观看| 欧美丝袜一区二区| 清纯唯美亚洲激情| 影音先锋欧美精品| 久久精品影视伊人网| 性欧美亚洲xxxx乳在线观看| 97久久精品人人澡人人爽缅北| 国产高清在线不卡| 国产精品v日韩精品| 91精品久久久久久久久久入口| 国产精品久久久久久久久久| 久久亚洲国产精品| 精品中文字幕在线2019| 亚洲精品国产福利| 超碰91人人草人人干| 亚洲少妇中文在线| 亚洲精品电影久久久| 国产精品香蕉国产| 国产精品久久精品| 中文字幕日韩专区| 精品视频中文字幕| 日本精品久久电影| 亚洲国产精品久久久久久| 精品高清一区二区三区| 久久久精品视频在线观看| 国产成人涩涩涩视频在线观看| 久久免费观看视频| 国产精品高潮视频| 在线观看中文字幕亚洲| 超薄丝袜一区二区| 国产精自产拍久久久久久蜜| 欧美伊久线香蕉线新在线| 久久天天躁夜夜躁狠狠躁2022| 91久久精品一区| 亚洲综合日韩中文字幕v在线| 久久久久久久久久久久av| 国产69精品久久久久99| 欧美一级bbbbb性bbbb喷潮片| 久久成人精品电影| 国语自产精品视频在免费| 国产主播欧美精品| 一区国产精品视频| 欧美黄色小视频| 亚洲a在线观看| 中文字幕精品—区二区| 亚洲人永久免费| 国产精品视频导航| 久久99热精品这里久久精品| 国产精品久久久久久久美男| 中文字幕亚洲无线码在线一区| 欧美xxxx综合视频| 97国产在线视频| 在线精品视频视频中文字幕| 欧美精品久久久久久久久久| 91精品国产成人www| 欧美成人免费网| 日韩在线视频线视频免费网站| 国产日韩欧美在线视频观看| 日韩美女主播视频| 亚洲三级黄色在线观看| 国产精品久久一区主播| 国产精品午夜国产小视频| 欧美在线国产精品| 欧美精品在线免费| 欧美午夜女人视频在线| 国产精品成人av性教育| 欧美色欧美亚洲高清在线视频| 日韩a**站在线观看| 成人疯狂猛交xxx| 日韩欧美一区二区在线| 中国日韩欧美久久久久久久久| 久久久精品一区二区| 国产精品久久久久久久久久久久久久| 国产午夜精品久久久| 伊人伊成久久人综合网小说| 国产在线98福利播放视频| 成人精品视频久久久久| 97视频免费在线观看| 97精品国产97久久久久久免费| 91精品视频在线播放| 97成人在线视频| 136fldh精品导航福利| 欧美成人精品xxx| 免费91麻豆精品国产自产在线观看| 欧美视频免费在线观看| 在线观看国产精品淫| 国产精品久久久久久久av大片| 久热爱精品视频线路一| 亚洲xxxxx电影| 欧美成人精品xxx| 亚洲乱亚洲乱妇无码| 久久夜色精品国产欧美乱| 日韩欧美中文字幕在线观看| 中文字幕欧美日韩精品| 日韩免费观看网站| 欧美日韩中文在线观看| 日韩精品在线观看一区二区| 亚洲图片在区色| 亚洲欧美中文日韩v在线观看| 欧美性高潮床叫视频| 欧美激情18p| 久久精品一本久久99精品| 国产区精品视频| 日韩视频免费看| 欧美在线播放视频| 亚洲一区二区三区777| 欧美美女操人视频| 成人网址在线观看| 精品综合久久久久久97| 日韩电影中文字幕在线| 成人动漫网站在线观看| 欧洲精品在线视频| 久久精品男人天堂| 91免费高清视频| 综合网日日天干夜夜久久| 亚洲欧美在线磁力| 亚洲男人7777| 中文字幕在线观看亚洲| 欧美老女人bb| 精品国产福利视频| 亚洲综合最新在线| 疯狂欧美牲乱大交777| 欧美在线视频a| 国产一区二区三区毛片| 欧美猛交ⅹxxx乱大交视频|