SQL函式解決insert多筆自動流水號問題

2022-02-28 12:39:10 字數 2394 閱讀 5151

在mssql的儲存過程中有時會有一次性插入多筆的情況,insert into......select....

這時如果insert的table中有自定義的業務流水號['bu'+日期+流水碼] ,則不得不用使用游標,然後呼叫自動單號儲存過程,因為select中不得使用儲存過程作為一列的結果集返回,但函式是可以的

這裡的table名稱必須明確,原因很簡單,mssql中對自定義函式有很多限制,如不能執行動態t-sql,  不能對資料庫中表進行insert,update,delete操作[表變數可以]。

--select dbo.fn_getautoid('', 'st3_padd', 'po', '2011/07/21', 4)

create

function

fn_getautoid

(@no_comp

nvarchar(10

),    

--公司

@tablename

nvarchar

(100

),    

--表名

@prefix

nvarchar(4

),    

--字首

@dt_trn

nvarchar(10

),    

--日期

@id_len

tinyint

,        

--流水碼長度

@rownum

int--

當前行序號

)returns

nvarchar(30

)asbegin

declare

@autoid

nvarchar(30

)    

--自動單號

declare

@prefix_all

nvarchar(15

)    

--字首

if@no_comp

isnull

set@no_comp=''

if@prefix

isnull

set@prefix=''

if@id_len

isnull

set@id_len=4

set@dt_trn

=replace

(replace

(@dt_trn, '

/', ''

), '-'

, '')--

字首set

@prefix_all

=@prefix

+@dt_trn

--點數增加表

if@tablename='

st3_padd

'begin

select

@autoid

=@prefix_all

+right('

00000000'+

cast

(isnull

(max

(cast

(right

(no_po, 

@id_len

) as

int)), 0)

+@rownum

asnvarchar

), @id_len

)from

st3_padd

where

(no_comp

=@no_comp

or@no_comp=''

)and

no_po 

like

@prefix_all+'

%'end/*

其他表。。

else if @tablename=''

begin

end*/

return

@autoid

insert

into

st3_padd(no_comp, no_po, no_src, seq_src)

select

no_comp, dbo.fn_getautoid(no_comp, 

'st3_padd', 

'po', 

'2011/07/21', 

4, row_number() 

over

(order

byno_club)), no_club, no_seq

from

st3_clubmd

where

no_comp='

0001

'and

no_club='

fr201106290001

'select

*from

st3_padd

注:此例中表名及相關邏輯用了實際程式碼,只作參照用

此例未考慮資料庫併發插入問題,此問題估計須用到鎖機制才能解決 

SQL 十七 INSERT語句

sql表將資料按行儲存,一行接一行。insert into語句用於向資料庫中的表新增新的資料行。sql insert into語法如下 insert into table name values value1,value2,value3,確保值的順序與表中的列的順序相同。考慮以下employees表...

SQL系列 插入資料(insert)

總述 insert 是用來插入行到資料庫表的。插入資料庫表可以分為幾種 a.插入完整的行 資料庫表有多少個字段就插入多少欄位的值 b.插入行的一部分 c.插入多行 d.插入某些查詢的結果。a.插入完整的行 insert into customers value null,pep e.100 main...

insert函式的修改,

我們來看一下當中的第2個圓圈,為什麼使用size來相加呢?我們知道一開始我們定義的初始空間為init size 我們想一下啊,如果是第1次進行空間的增加,那麼我們使用init來進行相加是可以的,但是當第2次想加我們再想開闢空間的時候,還使用初始空間大小,加上我們所要開闢的空間大小是不可以的,因為第1...