sql server:按照计数器和另一个列值天生主键
我正在建设一个客户表,其父表是公司的.
varchar(9)主键的别的部门应为零添补计数器,通过该公司内的客户数目递增. 譬喻. company = MSFT,这是MSFT记录的第一个插入:PK应为MSFT00001 我开始行使一个而不是触发器和一个我从其他stackoverflow相应建设的udf. ALTER FUNCTION [dbo].[GetNextID] ( @in varchar(9) ) RETURNS varchar(9) AS BEGIN DECLARE @prefix varchar(9); DECLARE @res varchar(9); DECLARE @pad varchar(9); DECLARE @num int; DECLARE @start int; if LEN(@in)<9 begin set @in = Left(@in + replicate('0',9),9) end SET @start = PATINDEX('%[0-9]%',@in); SET @prefix = LEFT(@in,@start - 1 ); declare @tmp int; set @tmp = len(@in) declare @tmpvarchar varchar(9); set @tmpvarchar = RIGHT( @in,LEN(@in) - @start + 1 ) SET @num = CAST( RIGHT( @in,LEN(@in) - @start + 1 ) AS int ) + 1 SET @pad = REPLICATE( '0',9 - LEN(@prefix) - CEILING(LOG(@num)/LOG(10)) ); SET @res = @prefix + @pad + CAST( @num AS varchar); RETURN @res END 怎样编写my而不是触发器来插入值并增进此主键.可能我应该放弃它并开始一个割草营业? 歉仄,没有它,tmpvarchar变量SQL处事器给了我稀疏的功效. 办理要领固然我赞成阻挡者的概念,但“接管不能改变的原则”倾向于低落整体压力程度,恕我直言.实行以下要领.弱点 >仅限单排插入.您不会对新客户表举办任何批量插入,由于每次要插入行时都必要执行存储进程. 可是,从好的方面来说,这种要领并没有任何与之相干的竞争前提,而且真正触犯我的感情并不是太严峻的黑客进攻.以是… 起首,从密钥天生表开始.它将包括每个公司的1行,包括您的公司标识符和每次执行插入时我们将要碰撞的整数计数器. create table dbo.CustomerNumberGenerator ( company varchar(8) not null,curr_value int not null default(1),constraint CustomerNumberGenerator_PK primary key clustered ( company ),) 其次,你必要一个像这样的存储进程(究竟上,你也许但愿将这个逻辑集成到认真插入客户记录的存储进程中.稍后具体先容).该存储进程接管公司标识符(譬喻“MSFT”)作为其独一参数.此存储进程执行以下操纵: >将公司ID放入类型情势(譬喻,大写和修剪前导/尾随空格). 干得好: create procedure dbo.GetNewCustomerNumber @company varchar(8) as set nocount on set ansi_nulls on set concat_null_yields_null on set xact_abort on declare @customer_number varchar(32) -- -- put the supplied key in canonical form -- set @company = ltrim(rtrim(upper(@company))) -- -- if the name isn't already defined in the table,define it. -- insert dbo.CustomerNumberGenerator ( company ) select id = @company where not exists ( select * from dbo.CustomerNumberGenerator where company = @company ) -- -- now,an interlocked update to get the current value and increment the table -- update CustomerNumberGenerator set @customer_number = company + right( '00000000' + convert(varchar,curr_value),8 ),curr_value = curr_value + 1 where company = @company -- -- return the new unique value to the caller -- select customer_number = @customer_number return 0 go 您也许但愿将其集成到将行插入customer表的存储进程中的缘故起因是它将它们所有组合到一个事宜中;假如没有这个,当插入失败时,您的客户编号也许会/将会呈现间隙. (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |