1. 程式人生 > >Sql server儲存過程以及一次插入多條記錄

Sql server儲存過程以及一次插入多條記錄

首先簡單介紹sql server儲存過程吧。至於概念含義啥的就不做過多介紹了。它其實和mysql有些類似,語法大同小異。
還是用例子說明問題吧。
CREATE PROCEDURE insert_supplier
@supplier_name varchar(30),
@supplier_contact varchar(30),
--------------------------------輸入引數
@theoutputstring varchar(50) output
-------------------------------輸出引數
AS
BEGIN TRAN 
SET XACT_ABORT OFF
-------------------------------事務操作開始與 SET XACT_ABORT ON 
-------------------------------和if (@theresult<=0) ROLLBACK TRAN else COMMIT TRAN
-------------------------------構成事務的完整操作
declare @theresult int
set @theresult=1
-------------------------------定義和初始化變數

-------------------------------做一些基本的判定
if (@theresult>=0)
begin
--------------------------------------------------------------------------------------begin
  if (@theresult=1)
  begin
     insert into supplier 
       (supplier_name,supplier_contact,supplier_phone,supplier_fax,supplier_email,
supplier_postcode,supplier_remark,supplier_address,
        supplier_website,supplier_telephone) 
     values 
       (@supplier_name,@supplier_contact,@supplier_phone,@supplier_fax,@supplier_email,
@supplier_postcode,@supplier_remark,@supplier_address,
        @supplier_website,@supplier_telephone) 
     if (@@rowcount<>1) set @theresult=-2
  end
------------------------------------------------------------------------------------end 
end

SET XACT_ABORT ON 
if (@theresult<=0) ROLLBACK TRAN else COMMIT TRAN
------------------------------------------------------事務提交或回滾

------------------------------------------------------生成出錯資訊
if @theresult=0 set @theoutputstring='其他錯誤'
else
if @theresult=-2 set @theoutputstring='資訊修改錯誤'
else
set @theoutputstring='true'
-----------------------------------------------------輸出結果集  
select @theoutputstring

GO
根據紅色的詳細註釋,相信大家不難理解這個儲存過程的基本語法,其實和mysql是差不多的。因為sql server是支援事務的,所以每個執行都是可以回滾的和mysql的innodb引擎一樣。
接下來說下如何使用支援插入多條資料的操作,因為sql並沒有陣列的概念,所以只能用一些字串拼接並解析的方法來處理。
set @prepoint_price = 1
set @curpoint_price = charindex('$',@tmp_sale_price)
就以這個銷售價格為例,如果我想傳多條記錄中的多個價格,那麼可以傳之前先把需要傳的價格拼接起來,並用一個特殊字元$來間隔。
PS:charindex這是定位符號函式
,返回第一個此特殊字元的位置。
set @sale_price = substring(@tmp_sale_price,@prepoint_price,@[email protected]_price)
然後設定新變數使用substring函式,以上那句就是在tmp_sale_price變數中擷取開始到特殊字元為止的變數,這樣就可以很輕鬆獲得多條銷售價格中的一條。以此類推,就可以不斷分析出所有的變數值。最後給出一個簡單例子來說明,大家可以關注其結構,至於業務邏輯可以忽視。
@sale_id varchar(20),
@client_name varchar(128),
@employee_id int,
@transaction_id int,
@warehouse_id varchar(32),
@sale_time datetime,
@sale_num varchar(5),
@sale_totalprice float(8),
@sale_logistics varchar(40),
@sale_logisticscode varchar(40),
@tmp_localitem_id varchar(600), 
@tmp_sale_price varchar(600),

@theoutputstring varchar(50) output

AS
BEGIN TRAN 
SET XACT_ABORT OFF

declare @theresult int,@curpoint int, @prepoint int,@curpoint_price int, @prepoint_price int, @localitem_id varchar(20),@sale_price varchar(50)

set @theresult=0

if (@theresult>=0)
begin
insert into sale_record(sale_id,client_name,employee_id,transaction_id,warehouse_id,sale_time,sale_num,sale_totalprice,sale_logistics,sale_logisticscode) 
values(@sale_id,@client_name,@employee_id,@transaction_id,@warehouse_id,@sale_time,@sale_num,@sale_totalprice,@sale_logistics,@sale_logisticscode)
if (@@rowcount<>1) set @theresult=-2
end
if(@theresult>=0)
begin
set @prepoint = 1
set @curpoint = charindex('$',@tmp_localitem_id) 
set @prepoint_price = 1
set @curpoint_price = charindex('$',@tmp_sale_price)
while @curpoint>0 and @theresult>=0
begin
set @localitem_id = substring(@tmp_localitem_id,@prepoint,@
[email protected]
)
set @sale_price = substring(@tmp_sale_price,@prepoint_price,@[email protected]_price)
insert into sale_detail(localitem_id,transaction_id,sale_id,sale_price)values(@localitem_id,@transaction_id,@sale_id,@sale_price)
if (@@rowcount<>1) set @theresult=-3
if(@theresult>=0)
begin
update storage set localitem_num = '0' where localitem_id = @localitem_id
if (@@rowcount<>1) set @theresult=-4
end 
set @[email protected]+1
set @[email protected]_price+1
set @curpoint=charindex('$',@tmp_localitem_id,@prepoint)
set @curpoint_price=charindex('$',@tmp_sale_price,@prepoint_price)
end
end

SET XACT_ABORT ON 
set @theresult=1
if (@theresult<=0) ROLLBACK TRAN else COMMIT TRAN

if @theresult=0 set @theoutputstring='其他錯誤'
else
if @theresult=-2 set @theoutputstring='資訊修改錯誤'
else
if @theresult=-3 set @theoutputstring='查詢詳細表有誤'
else
if @theresult=-2 set @theoutputstring='修改庫存有誤'
else
if @theresult=1 set @theoutputstring='true'
select @theoutputstring

相關推薦

Sql server儲存過程以及插入記錄

首先簡單介紹sql server儲存過程吧。至於概念含義啥的就不做過多介紹了。它其實和mysql有些類似,語法大同小異。 還是用例子說明問題吧。CREATE PROCEDURE insert_supplier @supplier_name varchar(30), @sup

oracle Insert 插入記錄

pan rac ora 方法 tab where ble code 兩種方法 oracle Insert 一次插入多條記錄有兩種方法: 1)Insert All Into table_name values ... insert all into table_name v

使用JDBC插入記錄(以MySQL為例)

閱讀本文需要的先修知識: 最基本的SQL語句 最基本的JDBC操作(如插入單條記錄) 如急需使用請直接看最後一段程式碼。 在JDBC中,插入記錄最簡單的方法是使用executeUpdate()方法,但該方法中的引數只能是單條SQL語句,其實對於需要INSERT或者UPDA

Oracle 怎樣插入記錄

Oracle 一次性插入多條記錄跟 MYSQL 有很大不同。MYSQL  是這樣的,但在 Oracle 中行不同。 INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees'),('Gates', 'Champs-E

mysql使用遊標 觸發 插入記錄

DROP TRIGGER IF EXISTS `AutoInsert`; CREATE DEFINER=`root`@`localhost` TRIGGER `AutoInsert` AFTER INSERT ON `ml_exam` FOR EACH ROW begin

sql server儲存過程 以及幾個常用案例

Transact-SQL中的儲存過程,非常類似於Java語言中的方法,它可以重複呼叫。當儲存過程執行一次後,可以將語句快取中,這樣下次執行的時候直接使用快取中的語句。這樣就可以提高儲存過程的效能。 Ø 儲存過程的概念     儲存過程Procedure是一組為了完成特定功能的SQL語句集合,經編譯後儲存在資

sql語句優化進行記錄的-----插入和修改

更新: update t_student set name = 'timy' where id = 10 現在我要更新ID為10、12 、13的age等於10、12、13 UPDATE t_student SET age= CASEWHEN id 10 THEN10WHE

SQL插入資料

SQL中insert一次可以插入一條資料,我們有三種方法可以一次性插入多條資料。 1. 語法:select 欄位列表 into 新表 from 源表 注意事項:此種方法新表是系統自動建立,語句執行前不可以存在新表,並且新表只能保留源表的標識列特性,其他約束不能保留。 若只需要源表的資料結構,我們可以在語句中

SQL Server儲存過程,傳送陣列引數(個引數)的變通辦法

        最近在做開發過程中碰到這麼一個糾結的問題,需要同時插入N條資料,不想在程式裡控制,但是SQL Sever又不支援陣列引數.所以只能用變通的辦法了.利用SQL Server強大的字串處理傳把陣列格式化為類似"3500320083208#350060052089

插入

sel sysdate 插入 bcd xid sys user lec creat insert into erp_ckscd ( ckdbh, cklx, kfxxid,

oracle插入資料

insert into 表名(欄位1,欄位2) select '一','二' from dual         union all                                 select '三','四' from dual         union all              

oracle插入資料(insert all)

問題 公司的專案,有個功能每次使用需要向資料庫插入很多資料,導致頁面等待很長時間才有結果。 資料庫:oracle11g id:採用sequence自增 每次迴圈,都會查詢一次sequence,然後insert一條資料,效能非常低。 改進 改成一次

Mybatis使用註解的方式插入資料

ORACLE 對於oracle資料庫:不需要進行額外設定,可以直接在方法上使用註解進行多表的插入 @Insert("INSERT ALL INTO city (id,name,state) VALUES (31002, 'Disc','DISC') INTO city2

mysql插入demo測試用資料

1.傻傻的insertINSERT INTO raw_materials.common_picture_setting (PICTURE_SETTING_NAME,PICTURE_SETTING_URL

mybatis怎麼實現插入資料

前兩種為mybatis框架裡面的程式碼,第三種方法為純java程式碼時jdbc操作 1.複製原有資料庫中的n條記錄直接插入 <!--複製Menu表中的所有資訊複製插入,傳入引數為#{pr

Laravel更新記錄,批量更新的方法

在我們實際應用中,免不了這樣的情況——例如我們同時錄入多條資訊,可能三條五條還好說,但量一旦變大,就會增加讀寫資料庫的次數,會降低效率,那麼,我們該如何實現,做到一次讀寫資料庫,批量更新呢? 例如這種情況: HTML程式碼: <!doctype html> &l

SpringMVC頁面向Controller提交陣列+Mybatis傳個引數+MySQL寫入記錄

DAO層定義:int insertRole2Authorities(@Param("roleId")int roleId, @Param("authorities")List<Integer&g

SQL SERVER儲存過程批量插入資料庫表資料

CREATEPROCEDURE add_UserInfoASDECLARE@userCodeVARCHAR(30)DECLARE@userNameVARCHAR(30)DECLARE@userCode_baseVARCHAR(30)DECLARE@countINTEGERDECLARE@indexINTEGE

Sql Server儲存過程從一個表中抓取資料填充到另張表中

  set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go -- ============================================= -- Author:  <alex,,Name> -- Create

SQL server 儲存過程的編寫

USE [資料庫名稱] GO /****** Object:  StoredProcedure [dbo].[insertbGait]    Script Date: 2018/7/17 15:51:22 ******/ SET ANSI_NULLS ON GO