1. 程式人生 > >SQL-Server資料庫儲存過程學習

SQL-Server資料庫儲存過程學習

一.在生產中涉及到SQL-Server資料庫儲存過程,順便學習記錄

--建立儲存過程 可生成當年所有日期,並且週末工作時間為0小時 ,其中HR_Calendar  為業務表
CREATE PROCEDURE dbo.Auto_HR_Calendar
AS 
SET DATEFIRST 1
declare @i varchar(10) 
declare @j int
declare @year int
declare @num int
set @j = 110
set @i= dateadd(d,1-datepart(dy,getdate()),getdate())
set @year=datepart(yy,@i)
SELECT @num= COUNT(1) FROM HR_Calendar  WHERE HRC_ID LIKE 'HRC'+CONVERT(varchar(10),@year)+'%'
if (@num=0)
begin
while(@year=datepart(yy,@i))
begin
if(DATEPART(dw, @i)>5)
begin
insert into HR_Calendar (HRC_ID,HRC_Date,

HRC_WorkHour) values('HRC'+CONVERT(varchar(10),@year)+'00000'+CONVERT(varchar(10),@j),@i,0)
end
else
begin
insert into HR_Calendar (HRC_ID,HRC_Date,

HRC_WorkHour) values('HRC'+CONVERT(varchar(10),@year)+'00000'+CONVERT(varchar(10),@j),@i,8)
end
set @i=dateadd(d,1,@i)
set @[email protected]+1
end
end   
Go

二),工作中涉及資料批量插入時可用到sqlserver新特性:Bulk和表值引數(Table-Valued Parameters)

,我用的是表值引數

顧名思義,表值引數表示你可以把一個表型別作為引數傳遞到函式或儲存過程裡。

例項講解:

第一步:建立一個Type型別和寫入資料的原始表結構相同 

CREATE TYPE [dbo].[TestTVP] AS TABLE(
    [TID] [bigint] NOT NULL,
    [DepID] [nvarchar](100) NOT NULL,
    [DepName] [nvarchar](512) NOT NULL,
    [DataChange_CreateTime] [datetime] NOT NULL,
    [DataChange_LastTime] [datetime] NOT NULL,
    PRIMARY KEY CLUSTERED 
(
[TID] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)
GO

第二步:建立儲存過程

CREATE PROCEDURE [dbo].[SP_TestTVP_I]
(
@TestTVP TestTVP READONLY
)
AS
DECLARE @retcode int, @rowcount int
    SET LOCK_TIMEOUT 1000
    SET NOCOUNT ON           
INSERT INTO 原始表名(列)
SELECT 表引數列
FROM @TestTVP

第三步:程式碼使用

//需要構建Table資料或者從表中查詢的資料返回到Table

/*宣告一個變數來引用該型別*/
DECLARE @TestTVP
AS LocationTableType;

/* Add data to the table variable. */
INSERT INTO @TestTVP (LocationName, CostRate)
    SELECT [Name], 0.00
    FROM 
    [AdventureWorks].[Person].[StateProvince];

/* 把表變數的資料傳遞給儲存過程 */
EXEC usp_InsertProductionLocation @TestTVP;
GO

一、定義變數
--簡單賦值 
declare @a int
set @a=5 
print @a 
  
--使用select語句賦值 
declare @user1 nvarchar(50) 
select @user1='張三'
print @user1 
declare @user2 nvarchar(50) 
select @user2 = Name from ST_User where ID=1 
print @user2 
  
--使用update語句賦值 
declare @user3 nvarchar(50) 
update ST_User set @user3 = Name where ID=1 
print @user3
 

二、表、臨時表、表變數

--建立臨時表1 
create table #DU_User1 

     [ID] [int]  NOT NULL, 
     [Oid] [int] NOT NULL, 
     [Login] [nvarchar](50) NOT NULL, 
     [Rtx] [nvarchar](4) NOT NULL, 
     [Name] [nvarchar](5) NOT NULL, 
     [Password] [nvarchar](max) NULL, 
     [State] [nvarchar](8) NOT NULL
); 
--向臨時表1插入一條記錄 
insert into #DU_User1 (ID,Oid,[Login],Rtx,Name,[Password],State) values (100,2,'LS','0000','臨時','321','特殊'); 
  
--從ST_User查詢資料,填充至新生成的臨時表 
select * into #DU_User2 from ST_User where ID<8 
  
--查詢並聯合兩臨時表 
select * from #DU_User2 where ID<3 union select * from #DU_User1 
  
--刪除兩臨時表 
drop table #DU_User1 
drop table #DU_User2
 
--建立臨時表 
CREATE TABLE #t 

    [ID] [int] NOT NULL, 
    [Oid] [int] NOT NULL, 
    [Login] [nvarchar](50) NOT NULL, 
    [Rtx] [nvarchar](4) NOT NULL, 
    [Name] [nvarchar](5) NOT NULL, 
    [Password] [nvarchar](max) NULL, 
    [State] [nvarchar](8) NOT NULL, 

  
--將查詢結果集(多條資料)插入臨時表 
insert into #t select * from ST_User 
--不能這樣插入 
--select * into #t from dbo.ST_User 
  
--新增一列,為int型自增長子段 
alter table #t add [myid] int NOT NULL IDENTITY(1,1) 
--新增一列,預設填充全球唯一標識 
alter table #t add [myid1] uniqueidentifier NOT NULL default(newid()) 
  
select * from #t 
drop table #t
--給查詢結果集增加自增長列 
  
--無主鍵時: 
select IDENTITY(int,1,1)as ID, Name,[Login],[Password] into #t from ST_User 
select * from #t 
  
--有主鍵時: 
select (select SUM(1) from ST_User where ID<= a.ID) as myID,* from ST_User a order by myID
--定義表變數 
declare @t table

    id int not null, 
    msg nvarchar(50) null

insert into @t values(1,'1') 
insert into @t values(2,'2') 
select * from @t
 三、迴圈

--while迴圈計算1到100的和 
declare @a int
declare @sum int
set @a=1 
set @sum=0 
while @a<=100 
begin
    set @[email protected] 
    set @a+=1 
end
print @sum
四、條件語句

--if,else條件分支 
if(1+1=2) 
begin
    print '對'
end
else
begin
    print '錯'
end
  
--when then條件分支 
declare @today int
declare @week nvarchar(3) 
set @today=3 
set @week=case
    when @today=1 then '星期一'
    when @today=2 then '星期二'
    when @today=3 then '星期三'
    when @today=4 then '星期四'
    when @today=5 then '星期五'
    when @today=6 then '星期六'
    when @today=7 then '星期日'
    else '值錯誤'
end
print @week
 

五、遊標

declare @ID int
declare @Oid int
declare @Login varchar(50) 
  
--定義一個遊標 
declare user_cur cursor for select ID,Oid,[Login] from ST_User 
--開啟遊標 
open user_cur 
while @@fetch_status=0 
begin
--讀取遊標 
    fetch next from user_cur into @ID,@Oid,@Login 
    print @ID 
    --print @Login 
end
close user_cur 
--摧毀遊標 
deallocate user_cur
六、觸發器

  觸發器中的臨時表:

  Inserted 
  存放進行insert和update 操作後的資料 
  Deleted 
  存放進行delete 和update操作前的資料

--建立觸發器 
Create trigger User_OnUpdate  
    On ST_User  
    for Update 
As 
    declare @msg nvarchar(50) 
    [email protected]記錄修改情況 
    select @msg = N'姓名從“' + Deleted.Name + N'”修改為“' + Inserted.Name + '”' from Inserted,Deleted 
    --插入日誌表 
    insert into [LOG](MSG)values(@msg) 
      
--刪除觸發器 
drop trigger User_OnUpdate
七、儲存過程

--建立帶output引數的儲存過程 
CREATE PROCEDURE PR_Sum 
    @a int, 
    @b int, 
    @sum int output
AS
BEGIN
    set @[email protected][email protected] 
END
  
--建立Return返回值儲存過程 
CREATE PROCEDURE PR_Sum2 
    @a int, 
    @b int
AS
BEGIN
    Return @[email protected] 
END
      
--執行儲存過程獲取output型返回值 
declare @mysum int
execute PR_Sum 1,2,@mysum output
print @mysum 
  
--執行儲存過程獲取Return型返回值 
declare @mysum2 int
execute @mysum2= PR_Sum2 1,2 
print @mysum2
 
  

八、自定義函式

  函式的分類:

    1)標量值函式

    2)表值函式

        a:內聯表值函式

        b:多語句表值函式

    3)系統函式

--新建標量值函式 
create function FUNC_Sum1 

    @a int, 
    @b int

returns int
as
begin
    return @[email protected] 
end
  
--新建內聯表值函式 
create function FUNC_UserTab_1 

    @myId int

returns table
as
return (select * from ST_User where ID<@myId) 
  
--新建多語句表值函式 
create function FUNC_UserTab_2 

    @myId int

returns @t table

    [ID] [int] NOT NULL, 
    [Oid] [int] NOT NULL, 
    [Login] [nvarchar](50) NOT NULL, 
    [Rtx] [nvarchar](4) NOT NULL, 
    [Name] [nvarchar](5) NOT NULL, 
    [Password] [nvarchar](max) NULL, 
    [State] [nvarchar](8) NOT NULL

as
begin
    insert into @t select * from ST_User where ID<@myId 
    return
end
  
--呼叫表值函式 
select * from dbo.FUNC_UserTab_1(15) 
--呼叫標量值函式 
declare @s int
set @s=dbo.FUNC_Sum1(100,50) 
print @s 
  
--刪除標量值函式 
drop function FUNC_Sum1
談談自定義函式與儲存過程的區別:

一、自定義函式:

  1. 可以返回表變數

  2. 限制頗多,包括

    不能使用output引數;

    不能用臨時表;

    函式內部的操作不能影響到外部環境;

    不能通過select返回結果集;

    不能update,delete,資料庫表;

  3. 必須return 一個標量值或表變數

  自定義函式一般用在複用度高,功能簡單單一,爭對性強的地方。

二、儲存過程

  1. 不能返回表變數

  2. 限制少,可以執行對資料庫表的操作,可以返回資料集

  3. 可以return一個標量值,也可以省略return

   儲存過程一般用在實現複雜的功能,資料操縱方面。

相關推薦

SQL-Server資料庫儲存過程學習

一.在生產中涉及到SQL-Server資料庫儲存過程,順便學習記錄 --建立儲存過程 可生成當年所有日期,並且週末工作時間為0小時 ,其中HR_Calendar  為業務表 CREATE PROCEDURE dbo.Auto_HR_Calendar AS  SET DATE

sql server 資料庫儲存過程

最近由於工作原因使用到MS-SQLSERVER,發現之前的東西大多已經忘記,為了加強記憶,特總結MS-SQLSERVER的一些知識在最近幾篇文中: 儲存過程定義:      儲存過程是使用者為了完成某些特定功能定義的一塊SQL程式集合,類似於C++中的

在易語言中呼叫MS SQL SERVER資料庫儲存過程(Transact-SQL)方法總結

作者:liigo 日期:2010/8/25   Microsoft SQL SERVER 資料庫儲存過程,根據其輸入輸出資料,籠統的可以分為以下幾種情況或其組合:無輸入,有一個或多個輸入引數,無輸出,直接返回(return)一個值,通過output引數返回一個或多個值,

資料庫——SQL Server儲存過程

上一篇部落格總結了許多資料庫常用的SQL語句,今天我們就來看一下SQL的儲存過程。 簡單來說,儲存過程就是一條或者多條sql語句的集合,可視為批處理檔案,但是其作用不僅限於批處理。 本篇主要介紹變數的使用,儲存過程和儲存函式的建立,呼叫,檢視,修改以及刪除操作。上一篇部落格對這一部分內容也有

SQL Server儲存過程相關的資源網址

儲存過程相關文章 引用連線: 1、SQL server儲存過程建立與使用----http://blog.csdn.net/miniduhua/article/details/52102176 2、SQLSERVER儲存過程基本語法----http://www.cnb

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資料庫新手入門學習總結(二)

3.查詢 簡單查詢,使用TOP子句 查詢結果排序order by 帶條件的查詢where,使用算術表示式,使用邏輯表示式,使用between關鍵字,使用in關鍵字, 模糊查詢like 在查詢中使用聚合函式:sum(x),avg(x),min(x),max(x),count(x),count() 使用分組查詢g

你所不知道的SQL Server資料庫啟動過程(使用者資料庫載入過程的疑難雜症)

 前言 本篇主要是上一篇文章的補充篇,上一篇我們介紹了SQL Server服務啟動過程所遇到的一些問題和解決方法,可點選檢視,我們此篇主要介紹的是SQL Server啟動過程中關於使用者資料庫載入的流程,並且根據載入過程中所遇到的一系列問題提供解決方案。 其實SQL Server作為微軟的一款優秀RDBM

你所不知道的SQL Server資料庫啟動過程,以及啟動不起來的各種問題的分析及解決技巧

目前SQL Server資料庫作為微軟一款優秀的RDBMS,其本身啟動的時候是很少出問題的,我們在平時用的時候,很少關注起啟動過程,或者很少了解其底層執行過程,大部分的過程只關注其內部的表、儲存過程、檢視、函式等一系列應用方式,而當有一天它執行的正常的時候突然啟動不起來了,這時候就束手無策了,能做的或許只能是

SQL SERVER-建立儲存過程-有時需要關掉MSSM,重新開啟就正常了

語法: CREATE PROC [ EDURE ] procedure_name [ ; number ]     [ { @parameter data_type }         [ VARYING ] [ = default ]

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資料庫新手入門學習總結(三)

4.檢視、索引和事務 檢視是由一個或多個數據表(基本表)匯出的虛擬表或者查詢表,是關係資料庫系統提供給使用者以多種角度觀察資料庫中資料的重要機制。 檢視的好處:能夠簡化使用者的操作;檢視能夠對機密資料提供安全保護。 建立檢視時,檢視的名稱存在sysobjects表中。有關檢視中所定義列的資訊新增到syscol

SQL SERVER-獲得儲存過程的返回值和輸出引數

ALTER PROCEDURE [dbo].[InsertRecord]  (     @name nvarchar(100) ) AS BEGIN          SET NOCOUNT ON;

關於sql server儲存過程中建立臨時表,並往臨時表中插入資料時出現亂碼的問題

  此前在客戶一個繁體系統的sql  server中執行儲存過程的時候出現亂碼,經查發現建立臨時表後,往臨時表中插入資料時得到的資料是亂碼的,所以檢視建立表的sql指令碼,經查需要將變數型別設定為  

SQL Server建立儲存過程——動態SQL

儲存過程(stored procedure)是一組為了完成特定功能的SQL語句集合,經編譯後儲存在伺服器端的資料庫中,利用儲存過程可以加速SQL語句的執行。 自定義儲存過程,由使用者建立並能完成某一特定功能的儲存過程,儲存過程既可以有引數又有返回值,但是它與函式不同,儲存過程的返回值只是指明執行是否成功,

SQL SERVER 資料庫儲存的值裡面前後有空格,有可能是全形或者半形空格,如何在查詢中處理

例如 使用者表裡面的 UserCode 有空格,那麼如何查詢出來對應的使用者  表名 tblUser 欄位 UserCode 表記錄為3條 ’    admin','bbbadmin','abc' 如果用 select  * from  tblUser where Use

按日期儲存資料的sql server動態儲存過程

 set @chrsql= '  if not exists(select 1 from sysobjects where name='''[email protected]+''' and type=''U'')  begin   CREATE TABLE '[email prot