Sql server儲存過程以及一次插入多條記錄
還是用例子說明問題吧。
根據紅色的詳細註釋,相信大家不難理解這個儲存過程的基本語法,其實和mysql是差不多的。因為sql server是支援事務的,所以每個執行都是可以回滾的和mysql的innodb引擎一樣。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
接下來說下如何使用支援插入多條資料的操作,因為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,@
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