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

本文介绍如何在SQL Server中使用函数和存储过程解析含有键值对的字符串,将这些信息动态地插入或更新数据表的字段。通过创建F_NODE_21函数来拆分字符串,然后用sp_insert_node_21存储过程根据解析结果更新或插入记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 字符串示例: 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,0,CHARINDEX(';', @val)) --得到单个节点的数量 A1=X

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

              set @value=substring(@tmpVal,CHARINDEX('=', @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,0,CHARINDEX(';', @val)) --得到单个节点的数量 A1=X

set @user_oid=substring(@tmpVal,CHARINDEX('=', @tmpVal)+1,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 @nameStr=@nameStr+@name+',';

                            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,0,len(@map))

if @nameStr is not null

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

if @valueStr is not null

set @valueStr=SubString(@valueStr,0,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值