目錄
SqlServer存储过程详解
首頁 資料庫 mysql教程 SqlServer存储过程详解

SqlServer存储过程详解

Jun 07, 2016 pm 03:26 PM
sqlserver 儲存 詳解 過程

SqlServer存储过程详解 1.创建存储过程的基本语法模板: if ( exists ( select * from sys.objects where name = ' pro_name ' )) drop proc pro_name go create proc pro_name @param_name param_type [ = default_value] as begin sql语句 end ps:[]表示非

SqlServer存储过程详解

1.创建存储过程的基本语法模板:

<span>if</span> (<span>exists</span> (<span>select</span> <span>*</span> <span>from</span> sys.objects <span>where</span> name <span>=</span> <span>'</span><span>pro_name</span><span>'</span><span>))
    </span><span>drop</span> <span>proc</span><span> pro_name
</span><span>go</span>
<span>create</span> <span>proc</span><span> pro_name
    </span><span>@param_name</span> param_type [<span>=</span><span>default_value]
</span><span>as</span>
<span>begin</span><span>    
    sql语句
</span><span>end</span>
登入後複製

ps:[]表示非必写内容。sys.objects存储的是本数据库中的信息,不仅仅存储表名,还有存储过程名 、视图名、触发器等等。

例如:

<span> 1</span> <span>if</span> (<span>exists</span> (<span>select</span> <span>*</span> <span>from</span> sys.objects <span>where</span> name <span>=</span> <span>'</span><span>USP_GetAllUser</span><span>'</span><span>))
</span><span> 2</span>     <span>drop</span> <span>proc</span><span> USP_GetAllUser
</span><span> 3</span> <span>go</span>
<span> 4</span> <span>create</span> <span>proc</span><span> USP_GetAllUser
</span><span> 5</span> <span>@UserId</span> <span>int</span> <span>=</span><span>1</span>
<span> 6</span> <span>as</span> 
<span> 7</span> <span>set</span> nocount <span>on</span><span>;
</span><span> 8</span> <span>begin</span>
<span> 9</span>     <span>select</span> <span>*</span> <span>from</span> UserInfo <span>where</span> Id<span>=</span><span>@UserId</span>
<span>10</span> <span>end</span>
登入後複製

ps:SQL Server 实用工具将 GO 解释为应将当前的 Transact-SQL 批处理语句发送给 SQL Server 的信号。当前批处理语句是自上一 GO 命令后输入的所有语句,若是第一条 GO 命令,则是从特殊会话或脚本的开始处到这条 GO 命令之间的所有语句。

2.调用方法:

<span>exec</span> dbo.USP_GetAllUser <span>2</span>;
登入後複製

 

ps:一般在执行存储过程是,最好加上架构名称,例如  dbo.USP_GetAllUser  这样可以可以减少不必要的系统开销,提高性能。 因为如果在存储过程名称前面没有加上架构名称,SQL SERVER 首先会从当前数据库sys schema(系统架构)开始查找,如果没有找到,则会去其它schema查找,最后在dbo架构(系统管理员架构)里面查找。

 

3.查看本数据库中存在的存储过程

SqlServer存储过程详解

依次展开数据库、可编程性、存储过程,即可看到已创建的存储过程。

4.修改存储过程

<span>alter</span> <span>proc</span><span> proc_name
</span><span>as</span>
  sql语句
登入後複製

5.存储过程中的输出参数的使用

<span> 1</span> <span>if</span> (<span>exists</span>(<span>select</span> <span>*</span> <span>from</span>  sys.objects <span>where</span> name<span>=</span><span>'</span><span>GetUser</span><span>'</span><span>))
</span><span> 2</span>     <span>drop</span> <span>proc</span><span> GetUser
</span><span> 3</span> <span>go</span> 
<span> 4</span> <span>create</span> <span>proc</span><span> GetUser
</span><span> 5</span>     <span>@id</span> <span>int</span><span> output,
</span><span> 6</span>     <span>@name</span> <span>varchar</span>(<span>20</span><span>) out
</span><span> 7</span> <span>as</span> 
<span> 8</span> <span>begin</span> 
<span> 9</span>     <span>select</span> <span>@id</span><span>=</span>Id,<span>@name</span><span>=</span>Name <span>from</span> UserInfo <span>where</span> Id<span>=</span><span>@id</span>
<span>10</span> <span>end</span>
<span>11</span> 
<span>12</span> <span>go</span> 
<span>13</span> <span>declare</span> 
<span>14</span> <span>@name</span> <span>varchar</span>(<span>20</span><span>),
</span><span>15</span> <span>@id</span> <span>int</span><span>;
</span><span>16</span> <span>set</span> <span>@id</span><span>=</span><span>3</span><span>;
</span><span>17</span> <span>exec</span> dbo.GetUser <span>@id</span>,<span>@name</span><span> out;
</span><span>18</span> <span>select</span> <span>@id</span>,<span>@name</span><span>;
</span><span>19</span> <span>print</span> <span>Cast</span>(<span>@id</span> <span>as</span> <span>varchar</span>(<span>10</span>))<span>+</span><span>'</span><span>-</span><span>'</span><span>+</span><span>@name</span>;
登入後複製

ps:参数output为该参数可以输出

6.分页获取数据的存储过程

<span> 1</span> <span>if</span> (<span>exists</span>(<span>select</span> <span>*</span> <span>from</span>  sys.objects <span>where</span> name<span>=</span><span>'</span><span>GetUserByPage</span><span>'</span><span>))
</span><span> 2</span>     <span>drop</span> <span>proc</span><span> GetUserByPage
</span><span> 3</span> <span>go</span> 
<span> 4</span> <span>create</span> <span>proc</span><span> GetUserByPage
</span><span> 5</span>     <span>@pageIndex</span> <span>int</span><span>,
</span><span> 6</span>     <span>@pageSize</span> <span>int</span>
<span> 7</span> <span>as</span> 
<span> 8</span> <span>declare</span> 
<span> 9</span> <span>@startIndex</span> <span>int</span><span>,
</span><span>10</span> <span>@endIndex</span> <span>int</span><span>;
</span><span>11</span> <span>set</span> <span>@startIndex</span> <span>=</span>  (<span>@pageIndex</span><span>-</span><span>1</span>)<span>*</span><span>@pageSize</span><span>+</span><span>1</span><span>;
</span><span>12</span> <span>set</span> <span>@endIndex</span> <span>=</span> <span>@startIndex</span> <span>+</span> <span>@pageSize</span> <span>-</span><span>1</span><span> ;
</span><span>13</span> <span>begin</span> 
<span>14</span>     <span>select</span> Id,Name <span>from</span> 
<span>15</span> <span>    (
</span><span>16</span>         <span>select</span> <span>*</span>,row_number()<span>over</span> (<span>order</span> <span>by</span> Id)<span>as</span> <span>number</span> <span>from</span><span> UserInfo  
</span><span>17</span>     )t <span>where</span> t.<span>number</span><span>>=</span><span>@startIndex</span> <span>and</span> t.<span>number</span><span><span>@endIndex</span>
<span>18</span> <span>end</span>
<span>19</span> 
<span>20</span> <span>go</span> 
<span>21</span> <span>exec</span> dbo.GetUserByPage <span>2</span>,<span>4</span>;</span>
登入後複製

7.存储过程中事务的创建

<span>if</span> (<span>exists</span>(<span>select</span> <span>*</span> <span>from</span>  sys.objects <span>where</span> name<span>=</span><span>'</span><span>JayJayToTest</span><span>'</span><span>))
    </span><span>drop</span> <span>proc</span><span> JayJayToTest
</span><span>go</span> 
<span>create</span> <span>proc</span><span> JayJayToTest
    </span><span>@GiveMoney</span> <span>int</span><span>,
    </span><span>@UserName</span> <span>nvarchar</span>(<span>20</span><span>)
</span><span>as</span> 
<span>begin</span><span>set</span> nocount <span>on</span><span>;
    </span><span>begin</span> <span>tran</span><span>;
    </span><span>begin</span><span> try
        </span><span>update</span> BankTest <span>set</span> <span>Money</span> <span>=</span> <span>Money</span><span>-</span><span>@GiveMoney</span> <span>where</span> Name<span>=</span><span>@UserName</span><span>;</span>
        <span>update</span> BankTest <span>set</span> <span>Money</span> <span>=</span> <span>Money</span><span>+</span><span>@GiveMoney</span> <span>where</span> Name<span>=</span><span>'</span><span>test</span><span>'</span><span>;
        </span><span>commit</span><span>;
    </span><span>end</span><span> try    
    </span><span>begin</span><span> catch        
        </span><span>rollback</span> <span>tran</span><span>;
        </span><span>print</span> (<span>'</span><span>发生异常,事务进行回滚</span><span>'</span><span>);
    </span><span>end</span><span> catch    
</span><span>end</span>
<span>go</span>
<span>exec</span> JayJayToTest <span>10</span>,<span>'</span><span>jayjay</span><span>'</span>
登入後複製

8.了解存储过程的执行计划

<span>SELECT</span> <span>*</span> <span>FROM</span> sys.<span>[</span><span>syscacheobjects</span><span>]</span>查看当前缓存的执行计划
登入後複製

如果执行存储过程时成功通过解析阶段,则 Microsoft SQL Server 查询优化器将分析存储过程中的 Transact-SQL 语句并创建一个执行计划。执行计划描述执行存储过程的最快方法,所依据的信息包括:

  1.表中的数据量。

  2.表的索引的存在及特征,以及数据在索引列中的分布。

  3.WHERE 子句条件所使用的比较运算符和比较值。

  4.是否存在联接以及 UNION、GROUP BY 和 ORDER BY 关键字。

查询优化器在分析完存储过程中的这些因素后,将执行计划置于内存中。分析存储过程和创建执行计划的过程称为编译。优化的内存中的执行计划将用来执行该查询。执行计划将驻留在内存中,直到重新启动 SQL Server 或其他对象需要存储空间时为止。如果随后执行了存储过程,而现有执行计划仍留在内存中,则 SQL Server 将重用现有执行计划。如果执行计划不再位于内存中,则创建新的执行计划。

重新编译执行计划(create proc JayJayToTest with recompile)

创建存储过程时在其定义中指定 WITH RECOMPILE 选项,表明 SQL Server 将不对该存储过程计划进行高速缓存;该存储过程将在每次执行时都重新编译。当存储过程的参数值在各次执行间都有较大差异,导致每次均需创建不同的执行计划时,可使用 WITH RECOMPILE 选项。此选项并不常用,因为每次执行存储过程时都必须对其进行重新编译,这样会使存储过程的执行变慢。

由于数据库的新状态,数据库内的某些更改可能会导致执行计划效率低下或不再有效。SQL Server 检测这些使执行计划无效的更改,并将计划标记为无效。此后,必须为执行查询的下一个连接重新编译新的计划。导致计划无效的情况包括:

  1.对查询所引用的表或视图进行任何结构更改(ALTER TABLE 和 ALTER VIEW)。
  2.通过语句(如 UPDATE STATISTICS)显式生成或者自动生成新的分发内容统计。
  3.除去执行计划所使用的索引。
  4.显式调用 sp_recompile。
  5.对键的大量更改(其他用户对由查询引用的表使用 INSERT 或 DELETE 语句所产生的修改)。
  6.对于带触发器的表,inserted 或 deleted 表内的行数显著增长。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

sqlserver怎麼匯入mdf文件 sqlserver怎麼匯入mdf文件 Apr 08, 2024 am 11:41 AM

匯入步驟如下:將 MDF 檔案複製到 SQL Server 的資料目錄(通常為 C:\Program Files\Microsoft SQL Server\MSSQL\DATA)。在 SQL Server Management Studio(SSMS)中,開啟資料庫並選擇「附加」。點選“新增”按鈕,選擇 MDF 檔案。確認資料庫名稱,點選確定按鈕即可。

sqlserver資料庫中已存在名為的物件怎麼解決 sqlserver資料庫中已存在名為的物件怎麼解決 Apr 05, 2024 pm 09:42 PM

對於 SQL Server 資料庫中已存在同名對象,需要採取下列步驟:確認物件類型(表格、檢視、預存程序)。如果物件為空,可使用 IF NOT EXISTS 跳過建立。如果物件有數據,使用不同名稱或修改結構。使用 DROP 刪除現有物件(謹慎操作,建議備份)。檢查架構更改,確保沒有引用刪除或重新命名的物件。

怎麼查看sqlserver連接埠號 怎麼查看sqlserver連接埠號 Apr 05, 2024 pm 09:57 PM

若要查看 SQL Server 連接埠號碼:開啟 SSMS,連線到伺服器。在物件資源管理器中找到伺服器名稱,右鍵單擊它,然後選擇“屬性”。在「連線」標籤中,查看「TCP 連接埠」欄位。

sqlserver服務無法啟動怎麼辦 sqlserver服務無法啟動怎麼辦 Apr 05, 2024 pm 10:00 PM

當 SQL Server 服務無法啟動時,可採取下列步驟解決:檢查錯誤日誌以確定根本原因。確保服務帳戶具有啟動服務的權限。檢查依賴項服務是否正在執行。禁用防毒軟體。修復 SQL Server 安裝。如果修復不起作用,重新安裝 SQL Server。

sqlserver誤刪資料庫怎麼恢復 sqlserver誤刪資料庫怎麼恢復 Apr 05, 2024 pm 10:39 PM

若誤刪 SQL Server 資料庫,可採取下列步驟還原:停止資料庫活動;備份日誌檔案;檢查資料庫日誌;復原選項:從備份還原;從交易日誌還原;使用 DBCC CHECKDB;使用第三方工具。請定期備份資料庫並啟用交易日誌以防止資料遺失。

sqlserver資料庫在哪裡 sqlserver資料庫在哪裡 Apr 05, 2024 pm 08:21 PM

SQL Server 資料庫檔案通常儲存在下列預設位置:Windows: C:\Program Files\Microsoft SQL Server\MSSQL\DATALinux: /var/opt/mssql/data可透過修改資料庫檔案路徑設定來自訂資料庫檔案位置。

sqlserver安裝失敗怎麼樣刪除乾淨 sqlserver安裝失敗怎麼樣刪除乾淨 Apr 05, 2024 pm 11:27 PM

如果 SQL Server 安裝失敗,可透過下列步驟清理:解除安裝 SQL Server刪除註冊表項刪除檔案和資料夾重新啟動計算機

sqlserver英文安裝怎麼更改中文 sqlserver英文安裝怎麼更改中文 Apr 05, 2024 pm 10:21 PM

SQL Server 英文安裝可透過下列步驟變更為中文:下載對應語言套件;停止 SQL Server 服務;安裝語言套件;變更執行個體語言;變更使用者介面語言;重新啟動應用程式。

See all articles