1. 程式人生 > >SQL Server建立儲存過程——動態SQL

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),通過兩天的學習,和自己的揣摩,終於弄出來了,為了給一些需要的又剛好沒有找到這個方法的程