SQL Server建立儲存過程——動態SQL
儲存過程(stored procedure)是一組為了完成特定功能的SQL語句集合,經編譯後儲存在伺服器端的資料庫中,利用儲存過程可以加速SQL語句的執行。
自定義儲存過程,由使用者建立並能完成某一特定功能的儲存過程,儲存過程既可以有引數又有返回值,但是它與函式不同,儲存過程的返回值只是指明執行是否成功,
儲存過程並不能像函式那樣被直接呼叫,只能利用 execute 來執行儲存過程。
優點:
1、提高應用程式的通用性和可移植性:儲存過程建立後,可以在程式中被多次呼叫,而不必重新編寫該儲存過程的SQL語句。並且資料庫專業人員可以隨時對儲存過程進行
修改,且對程式原始碼沒有影響,這樣就極大的提高了程式的可移植性。
2、可以提高SQL的速度,儲存過程是編譯過的,如果某一個操作包含大量的SQL程式碼或分別被執行多次,那麼使用儲存過程比直接使用單條SQL語句執行速度快的多。
3、減輕伺服器的負擔:當用戶的操作是針對資料庫物件的操作時,如果使用單條呼叫的方式,那麼網路上還必須傳輸大量的SQL語句,如果使用儲存過程,
則直接傳送過程的呼叫命令即可,降低了網路的負擔。
語法:
1 CREATE PROC [ EDURE ] procedure_name [ ; number ] 2 [ { @parameter data_type } 3 [ VARYING ] [ = default ] [ OUTPUT ] 4 ] [ ,...n ] 5 [ WITH 6 { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ] 7 [ FOR REPLICATION ] 8 AS 9 [ begin ] 10 T-SQL 語句 11 [ end ]
無引數儲存過程:
1 --建立名為 GetStuCou 的無引數儲存過程 2 create procedure GetStuCou 3 as 4 begin 5 select * 6 from Student s 7 left join Course c on s.C_S_Id=c.C_Id 8 end 9 10 --執行名為 GetStuCou 的無引數儲存過程 11 execute GetStuCou
有返回值的儲存過程:
1 --建立名為 GetStuCou_Re 的有返回值的儲存過程 2 create procedure GetStuCou_Re 3 as 4 begin 5 insert into Course(C_Name) values('HTML5') 6 return SCOPE_IDENTITY(); -- 返回為當前表插入資料最後生成的標識值。 7 end 8 9 --執行名為 GetStuCou 的有返回值的儲存過程 10 execute GetStuCou_Re
有輸入引數的儲存過程:
1 --建立名為 GetStuCou_In 的有輸入引數的儲存過程 2 create procedure GetStuCou_In 3 @StuNo nvarchar(64)='001' --設定預設值 4 as 5 begin 6 select * from Student where [email protected] 7 end 8 9 --執行名為 GetStuCou_In 的有輸入引數的儲存過程(不傳引數,即使用預設值) 10 execute GetStuCou_In 11 12 --執行名為 GetStuCou_In 的有輸入引數的儲存過程(傳入引數) 13 execute GetStuCou_In '005'
有輸入、輸出引數的儲存過程:
1 --建立名為 GetStuCou_Out 的有輸入引數和輸出引數的儲存過程 2 create procedure GetStuCou_Out 3 @StuNo nvarchar(64), 4 @Height nvarchar(32) output 5 as 6 begin 7 if(@StuNo is not null and @StuNo <> '') 8 begin 9 select @Height=S_Height 10 from Student 11 where [email protected] 12 end 13 else 14 begin 15 set @Height='185' 16 end 17 end 18 19 --執行名為 GetStuCou_Out 的有輸入引數和輸出引數的儲存過程 20 execute GetStuCou_Out '005',null
有輸入、輸出引數和結果集的儲存過程:
1 --建立名為 GetStuCou_DS 的有輸入引數、輸出引數和結果集的儲存過程 2 create procedure GetStuCou_DS 3 @StuNo nvarchar(64), 4 @Height nvarchar(32) output 5 as 6 begin 7 if(@StuNo is not null and @StuNo <> '') 8 begin 9 select @Height=S_Height 10 from Student 11 where [email protected] 12 end 13 else 14 begin 15 set @Height='185' 16 end 17 18 select s.S_Id,s.S_StuNo,s.S_Name,s.S_Sex,s.S_Height,s.S_BirthDate,c.C_Id,c.C_Name 19 from Student s 20 left join Course c on s.C_S_Id=c.C_Id 21 where [email protected] 22 end 23 24 --執行名為 GetStuCou_DS 的有輸入引數、輸出引數和結果集的儲存過程 25 execute GetStuCou_DS '005',null
返回多個結果集的儲存過程:
1 --建立名為 GetStuCou_DSS 的返回多個結果集的儲存過程 2 create procedure GetStuCou_DSS 3 @StuNo nvarchar(64), 4 @Height nvarchar(32) 5 as 6 begin 7 if(@StuNo is not null and @StuNo <> '') 8 begin 9 select * 10 from Student 11 where [email protected] 12 end 13 14 if(@Height is not null and @Height <> '') 15 begin 16 select * 17 from Student 18 where [email protected] 19 end 20 end 21 22 --執行名為 GetStuCou_DSS 的返回多個結果集的儲存過程 23 execute GetStuCou_DSS '005','185'
儲存過程裡面不僅可以進行查詢,還可以進行各種增刪改操作。其實儲存就是由很多 T-SQL 語句組成的程式碼塊。
儲存過程中建立變數、賦值變數、建立表變數和臨時表:
1 --建立名為 GetStuCou_Ext 的返回多個結果集的儲存過程 2 create procedure GetStuCou_Ext 3 @StuNo nvarchar(64), 4 @Height nvarchar(32) 5 as 6 begin 7 declare @Var nvarchar(10) --定義變數 8 9 set @Var='123' --賦值變數 10 11 --定義表變數 12 declare @StuTab table 13 ( 14 ID int not null primary key, 15 StuNo nvarchar(50) unique, 16 Name varchar(50), 17 Sex varchar(10), 18 Height varchar(10) 19 ) 20 --表變數只能在定義的時候新增約束 21 22 --定義臨時表 23 create table #Tab 24 ( 25 ID int not null primary key, 26 StuNo nvarchar(50), 27 Name varchar(50), 28 Sex varchar(10), 29 Height varchar(10) 30 ) 31 32 alter table #Tab add constraint S_UNIQUE unique(StuNo) 33 34 --臨時表可以在之後新增約束 35 36 if(@StuNo is not null and @StuNo <> '') 37 begin 38 insert into @StuTab(ID,StuNo,Name,Sex,Height) --把資料插入表變數 39 select S_Id,S_StuNo,S_Name,S_Sex,S_Height 40 from Student 41 where [email protected] 42 43 insert into #Tab(ID,StuNo,Name,Sex,Height) --把資料插入臨時表 44 select S_Id,S_StuNo,S_Name,S_Sex,S_Height 45 from Student 46 where [email protected] 47 end 48 49 if(@Height is not null and @Height <> '') 50 begin 51 insert into @StuTab(ID,StuNo,Name,Sex,Height) --把資料插入表變數 52 select S_Id,S_StuNo,S_Name,S_Sex,S_Height 53 from Student 54 where [email protected] 55 56 insert into #Tab(ID,StuNo,Name,Sex,Height) --把資料插入臨時表 57 select S_Id,S_StuNo,S_Name,S_Sex,S_Height 58 from Student 59 where [email protected] 60 end 61 62 SELECT * FROM @StuTab 63 select * from #Tab 64 end 65 66 --執行名為 GetStuCou_DSS 的返回多個結果集的儲存過程 67 execute GetStuCou_Ext '005','185'
儲存過程動態執行 SQL 語句:
以上可以看出我們傳入的引數(學號)是單個的,那麼如果一次性傳入多個學號呢(使用逗號隔開,即 '005,006,007' ),這就需要用到動態拼接並執行 sql 語句。
1 create proc GetStus 2 @StuNo nvarchar(500) 3 as 4 begin 5 declare @Sql nvarchar(3000) 6 7 if(@StuNo is not null and @StuNo <> '') 8 begin 9 set @Sql=' select * from Student where S_StuNo in ('[email protected]+') ' 10 end 11 12 exec (@Sql) --執行動態 sql 13 end 14 15 exec GetStus '003,005,009' --執行儲存過程 GetStus
現在還有一個問題,我想要執行動態 sql 的時候並返回變數值,比如我現在需要執行動態 sql 的時候返回課程 ID ,然後根據課程 ID 查詢課程。
使用系統儲存過程 sp_executesql 動態 sql 給變數賦值。
修改儲存過程之後:
1 ALTER proc [dbo].[GetStus] 2 @StuNo nvarchar(500) 3 as 4 begin 5 declare @Sql nvarchar(3000) 6 declare @C_Id int 7 declare @Cou int 8 9 if(@StuNo is not null and @StuNo <> '') 10 begin 11 set @Sql=' select @CId=C_S_Id,@cou=count(1) from Student where S_StuNo in ('[email protected]+') group by C_S_Id ' 12 end 13 14 exec sp_executesql @Sql,N'@CId int output,@cou int output',@CId = @C_Id output,@cou = @Cou output; 15 16 select @C_Id,@Cou --檢視返回變數的值 17 18 select * from Course where [email protected]_Id 19 end 20 21 exec GetStus '005' --執行儲存過程 GetStus
PS:sp_executesql 要求動態 Sql 和動態 Sql 引數列表必須是 NVARCHAR 型別。
動態Sql的引數列表與外部提供值的引數列表順序必需一致,例如:N'@CId int output,@cou int output',@CId = @C_Id output,@cou = @Cou output;,@CId 對應 @C_Id,@cou 對應 @Cou。
動態SQl的引數列表與外部提供引數的引數列表引數名可以同名,如果不一樣,需顯示註明,例如:N'@CId int output,@cou int output',@CId = @C_Id output,@cou = @Cou output;,即 @CId = @C_Id 和 @cou = @Cou 。
相關推薦
SQL Server建立儲存過程——動態SQL
儲存過程(stored procedure)是一組為了完成特定功能的SQL語句集合,經編譯後儲存在伺服器端的資料庫中,利用儲存過程可以加速SQL語句的執行。 自定義儲存過程,由使用者建立並能完成某一特定功能的儲存過程,儲存過程既可以有引數又有返回值,但是它與函式不同,儲存過程的返回值只是指明執行是否成功,
SQL SERVER-建立儲存過程-有時需要關掉MSSM,重新開啟就正常了
語法: CREATE PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ]
sql server建立儲存過程(有參,無參,有輸出)
student表已經有了,“建立”在中間,測試在最下面! select * from student; sid sname sex age tel s001 豐登兒 男 35 13527542451 s002 班克爾
在易語言中呼叫MS SQL SERVER資料庫儲存過程(Transact-SQL)方法總結
作者:liigo 日期:2010/8/25 Microsoft SQL SERVER 資料庫儲存過程,根據其輸入輸出資料,籠統的可以分為以下幾種情況或其組合:無輸入,有一個或多個輸入引數,無輸出,直接返回(return)一個值,通過output引數返回一個或多個值,
關於sql server 在儲存過程中建立臨時表,並往臨時表中插入資料時出現亂碼的問題
此前在客戶一個繁體系統的sql server中執行儲存過程的時候出現亂碼,經查發現建立臨時表後,往臨時表中插入資料時得到的資料是亂碼的,所以檢視建立表的sql指令碼,經查需要將變數型別設定為
C#與SQL Server儲存過程之一(建立):使用C#建立SQL Server的儲存過程
通常,開發人員使用的是T-SQL來建立SQL Server的儲存過程、函式和觸發器。而現在的SQL Server 2005已經完全支援.NET通用語言執行時(CLR)了。這就意味著,你可以使用.NET的語言,如C#、VB.NET之類的來開發SQL Server的儲存過程、
SQL Server 與儲存過程相關的資源網址
儲存過程相關文章 引用連線: 1、SQL server儲存過程建立與使用----http://blog.csdn.net/miniduhua/article/details/52102176 2、SQLSERVER儲存過程基本語法----http://www.cnb
mysql 儲存過程動態sql
DROP PROCEDURE IF EXISTS PRO_STA_SYSTEM_ORDER_STATE; DELIMITER // CREATE DEFINER=`root`@`%` PROCEDURE `PRO_STA_SYSTEM_ORDER_STATE`(OUT O_RESULT_
資料庫——SQL Server的儲存過程
上一篇部落格總結了許多資料庫常用的SQL語句,今天我們就來看一下SQL的儲存過程。 簡單來說,儲存過程就是一條或者多條sql語句的集合,可視為批處理檔案,但是其作用不僅限於批處理。 本篇主要介紹變數的使用,儲存過程和儲存函式的建立,呼叫,檢視,修改以及刪除操作。上一篇部落格對這一部分內容也有
Sql Server在儲存過程裡面使用遊標遍歷一個表
這裡關於SqlServer有兩個知識點:一個是使用遊標遍歷表,另一個是使用if not exists的sql語句進行插入。 一、使用遊標遍歷表 這個表可以是資料庫的表,也可以是外面DataTable型別的引數傳進去,使用遊標可以概括為以下步驟:宣告遊標、開啟遊標、讀取
Java呼叫SQL Server的儲存過程詳解
本文較長,包含了如下幾部分 1使用不帶引數的儲存過程 使用 JDBC 驅動程式呼叫不帶引數的儲存過程時,必須使用 call SQL 轉義序列。不帶引數的 call 轉義序列的語法如下所示: {call procedure-name}
SQL Server基礎(三)SQL Server 的儲存過程:什麼是儲存過程、儲存過程有什麼作用、儲存過程的使用方法
一、簡介 網上百度了好幾篇部落格,都沒有說明儲存過程是什麼東西?然後這個東西有什麼用? 從馬克思認識論上來看,我們必須先認識事物是什麼東西(即本質),然後才進一步認識事物是用來幹嘛的(即屬性)。於是,參考了下面的這篇CSDN論壇,和大家分享下,什麼是儲存過程,它又有什麼用。 htt
sql server 資料庫儲存過程
最近由於工作原因使用到MS-SQLSERVER,發現之前的東西大多已經忘記,為了加強記憶,特總結MS-SQLSERVER的一些知識在最近幾篇文中: 儲存過程定義: 儲存過程是使用者為了完成某些特定功能定義的一塊SQL程式集合,類似於C++中的
Sql Server的儲存過程與Java程式碼相連線呼叫(二)
我所寫的專案是使用Maven開發,在pom.xml中新增如下必要依賴: 新增com.microsoft.sqlserver的mssql-jdbc 6.2.1.jre8的依賴 <dependency> <gro
Sql Server中儲存過程中輸入和輸出引數(簡單例項,一看就懂)
-- ===================【建立儲存過程】===================== USE [Message] GO /****** Object: StoredProcedure [dbo].[讀取外部資料庫查詢] Script Date:
SQL SERVER-獲得儲存過程的返回值和輸出引數
ALTER PROCEDURE [dbo].[InsertRecord] ( @name nvarchar(100) ) AS BEGIN SET NOCOUNT ON;
oracle儲存過程,動態sql
CREATE OR REPLACE PROCEDURE "TUBEMNG"."RE" (one OUT INTEGER,two OUT INTEGER,three OUT INTEGER,four OUT INTEGER,ptype IN VARCHAR2,D
sql server 呼叫儲存過程返回值
1.OUPUT引數返回值 CREATE PROCEDURE [dbo].[nb_order_insert]( @o_buyerid int , @o_id bigint OUTPUT )AS BEGIN SET NOCOUNT ON; BEGIN INSERT
jdbc 呼叫 sql server 的儲存過程時“該語句沒有返回結果集”的解決方法
在JDBC中呼叫SQL Server中的儲存過程時出現如下異常: com.microsoft.sqlserver.jdbc.SQLServerException: 該語句沒有返回結果集。 at com.microsoft.sqlserver
java呼叫sql server的儲存過程(dbutils)
一般我們在寫介面或者後臺的時候,java用的是springmvc框架,而連線資料庫則用到的是jdbc(原始的),為了更加方便,通過配置檔案的方式連線資料庫(sql server2008),通過兩天的學習,和自己的揣摩,終於弄出來了,為了給一些需要的又剛好沒有找到這個方法的程