create function dbo.f_changecoderule(
@old_coderule varchar(50), --以逗號分隔的舊的編碼規則,每層編碼的長度,比如1,2,3,表示有三層編碼,第一層長度為1,第二層長度為2,第三層長度為3
@new_coderule varchar(50), --以逗號分隔的舊的編碼規則,如果某個層次的編碼長度為0,表示刪除該層編碼
@charfill char(1), --擴充編碼時,填充的字元
@position int, --為0,從編碼的最前面開始壓縮或者填充,為-1或者大於舊編碼的長度,從最後一位開始處理,為其他值,從指定的位置後開始處理
@fieldname sysname --編碼欄位名
)returns nvarchar(4000)
asbegin
if isnull(@charfill,'')='' set @charfill=n'0'
declare @old_code table(id int identity,codelen int,codelens int,code nvarchar(200))
declare @new_code table(id int identity,codelen int)
--插分舊編碼規則到表
declare @codelen varchar(10),@codelens varchar(10)
set @codelens=1
while charindex(n',',@old_coderule)>0
begin
select @codelen=left(@old_coderule,charindex(n',',@old_coderule)-1),
@old_coderule=stuff(@old_coderule,1,charindex(n',',@old_coderule),n'')
insert @old_code values(@codelen,@codelens,n'substring('+@fieldname+n','+@codelens+n','+@codelen+n')')
set @codelens=@codelens+cast(@codelen as int)
endinsert @old_code values(@old_coderule,@codelens,n'substring('+@fieldname+n','+@codelens+n','+@old_coderule+n')')
--插分新編碼規則到表
while charindex(n',',@new_coderule)>0
begin
insert @new_code values(left(@new_coderule,charindex(n',',@new_coderule)-1))
set @new_coderule=stuff(@new_coderule,1,charindex(n',',@new_coderule),n'')
endinsert @new_code values(@new_coderule)
--生成編號規則修改處理語句
declare @sql nvarchar(4000)
set @sql=''
select @sql=@sql
+case
when n.codelen=0 then '' --新編碼長度為0,表示去掉這段編碼
else n'+case when len('+@fieldname
+n')<'+cast(o.codelens as varchar)
+n' then '''' else '+case
when n.codelen=o.codelen then n'+'+o.code --新舊編碼長度相同時不需要處理
when n.codelen>o.codelen then case --擴充編碼長度的處理,根據@position和舊編碼長度決定編碼的填充位置
when @position=-1 or @position>=o.codelen
then n'+'+o.code
+n'+'+quotename(replicate(@charfill,n.codelen-o.codelen),n'''')
else n'+stuff('+o.code
+n','+cast(@position+1 as varchar)
+n',0,'+quotename(replicate(@charfill,n.codelen-o.codelen),n'''')
+n')'
endelse case --收縮編碼長度的處理,根據@position和新編碼長度決定編碼的擷取位置
when @position=-1 or @position>n.codelen
then '+left('+o.code+n','+cast(n.codelen as varchar)+n')'
else n'+stuff('+o.code
+n','+cast(@position+1 as varchar)
+n','+cast(o.codelen-n.codelen as varchar)
+n','''')'
endend
+n' end'
endfrom @old_code o,@new_code n
where o.id=n.id
return(stuff(@sql,1,1,n''))
end
jsp按規則生成編碼問題
這個功能需求是這樣的,編碼是由5個條件限定而成,前四個是從列表中隨意選擇,後乙個是根據型別按照序列遞增,整個編碼是由這5個條件組合而成,如下圖所示 此外還需滿足 1 生成的最終編碼是唯一的 2 可以批量生成。我們先看單項生成的例子。一 單項生成 背景 資料庫裡有匯入歷史資料,生成規則是按照選擇的字元...
生成字元SQL語句基本規則
生成字元sql語句基本規則 一 把字串接直生成sql字串 直接加單引號 sqlstr select from table 轉換成的sql為 select from table 二 把兩邊帶有單引號的字串生成sql字串 把乙個常量轉換成帶單引號的字串 把字串兩邊加三個單引號 sqlstr select...
通過Excel生成批量SQL語句,處理大量資料
我們經常會遇到這樣的要求 使用者給發過來一些資料,要我們直接給存放到資料庫裡面,有的是insert,有的是update等等,少量的資料我們可以採取最原始的辦法,也就是在sql裡面用insert into來實現,但是如果有幾十條幾百條甚至上千條資料的時候繼續寫單獨的sql語句的話那就慘了,其實有兩種簡...