在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...