加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sqlserver函数+过程,解析字符串信息作为字段,并动态更新数据表

发布时间:2020-12-12 14:56:00 所属栏目:MsSql教程 来源:网络整理
导读:?字符串示例: user_oid=$124;A1=1;A2=2;branch_no=1400;? /* 创建字段处理函数 */ SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS OFF GO CREATE FUNCTION F_NODE_21(@val varchar(4000)) RETURNS @ctb TABLE([name] varchar(50),[value] varchar(50)) AS BE

?字符串示例: user_oid=$124;A1=1;A2=2;branch_no=1400;?

/*

创建字段处理函数

*/

SET QUOTED_IDENTIFIER OFF

GO

SET ANSI_NULLS OFF

GO

CREATE FUNCTION F_NODE_21(@val varchar(4000))

RETURNS @ctb TABLE([name] varchar(50),[value] varchar(50))

AS

BEGIN

?????? declare? @tmpVal? varchar(2000)

?????? declare? @name? varchar(50)

?????? declare? @value? varchar(50)

?

?????? while? charindex(';',@val)>0

????? begin??

???? ??????????? set @val = substring(@val,CHARINDEX(';',@val)+1,2000)--去掉已经计算过的节点

????????????? set @tmpVal = substring(@val,@val)) --得到单个节点的数量 A1=X

????????????? set @name=substring(@tmpVal,CHARINDEX('=',@tmpVal))

????????????? set @value=substring(@tmpVal,@tmpVal)+1,10)

????????????? if len(@name)>0?? and? len(@value)>0

??????????????? begin

???????????????????? insert?? @ctb

??????? ????????????? SELECT?? @name as name,@value as value

??????? ?????? end

? ??? end??

?????? RETURN

END

GO

SET QUOTED_IDENTIFIER OFF

GO

SET ANSI_NULLS ON

GO

/*

创建插入节点表的存储过程

*/

SET QUOTED_IDENTIFIER ON

GO

SET ANSI_NULLS ON

GO

?

CREATE procedure sp_insert_node_21

@content?? varchar(4000)

as

declare? @num? int

declare? @val? varchar(4000)

declare? @tmpVal? varchar(4000)

declare? @user_oid varchar(200)

declare? @sqlStr? varchar(4000)

??????

if @content <> ''

set @val=@content

set @tmpVal = substring(@val,@val)) --得到单个节点的数量 A1=X

set @user_oid=substring(@tmpVal,len(@tmpVal))

?

declare? @map? varchar(2000)

declare? @nameStr? varchar(2000)

declare? @valueStr? varchar(2000)

declare? @name varchar(200)

declare? @value varchar(200)

set @map='';

set @nameStr='';

set @valueStr='';

DECLARE?? CustomCursor?? Cursor?? For?? (Select?? name,value?? From?? cc_dbo.F_NODE_21(@content))

OPEN???????? CustomCursor

?????? FETCH?? NEXT?? FROM?? CustomCursor?? INTO?? @name,@value? ;

??????? WHILE?? @@FETCH_STATUS?? =?? 0

??????? BEGIN??

????????????? if(@name='user_oid' or @name='branch_no' or @name='operate_type')

???????????????????? begin

??????????????????????????? set @map=@map+@name+'='''+@value+''',';

??????????????????????????? set @nameStr=@nameStr+@name+',';

??????????????????????????? set @valueStr=@valueStr+''''+@value+''',';

???????????????????? end

????????????? else

?????? ??????????????? begin

??????????????????????????? set @map=@map+@name+'='+@value+',';

??????????????????????????? set @valueStr=@valueStr+@value+',';

???????????????????? end

??????????????? FETCH?? NEXT?? FROM?? CustomCursor?? INTO?? @name,@value?? ;

??????? END;

CLOSE?? CustomCursor

DEALLOCATE?? CustomCursor

?

if @map is not null

set @map=SubString(@map,len(@map))

if @nameStr is not null

set @nameStr=SubString(@nameStr,len(@nameStr))

if @valueStr is not null

set @valueStr=SubString(@valueStr,len(@valueStr))

??????

begin

?select @num = (select count(1) from node_info_test where user_oid=@user_oid )

?set @sqlStr='';

?if @num > 0

? begin

? ??? set @sqlStr='update node_info_test set '+ @map +' where user_oid='''+@user_oid+'''';

?? end

?else --新插入一条

? begin

? ??? set @sqlStr='insert into node_info_test(count_date,user_oid,'+@nameStr+') values (CONVERT(varchar,? getDate(),20),'''+@user_oid+''','+@valueStr+')'

? end

end

?

execute(@sqlStr)

?

GO

SET QUOTED_IDENTIFIER OFF

GO

SET ANSI_NULLS ON

GO

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读