存储过程怎么分割Json型字符串

qq_30173019 2016-01-18 05:29:49
比如,我有一个字符串用逗号的分割出来
需要用循环得到这里面的每一个值
[1, 信息科技],[2,建筑],[3,制造业],然后插入表中
结果分别得到1 信息科技
2 建造
3 建造业

insert t ( key, value) Value(1,”信息科技“)
...全文
409 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_30173019 2016-01-19
  • 打赏
  • 举报
回复
版主威武!版主果然是大神!
中国风 2016-01-19
  • 打赏
  • 举报
回复
SELECT @Str=REPLACE(','+@Str,',[','[')
, @Str=REPLACE(REPLACE(REPLACE(@str,',',','''),'[',',('),']',''')')+') AS b([key], [value])'
,@Str=STUFF(@Str,1,1,' SELECT '+RTRIM(@Id)+' AS ID ,[key], [value] FROM (Values')
--PRINT @str
INSERT INTO [dbo].[ItemResume] EXEC( @Str
这一段替换红色,刚没处理字符串引号问题,这里已处理
中国风 2016-01-19
  • 打赏
  • 举报
回复
引用 15 楼 qq_30173019 的回复:
执行以后,一行都没有插入,其实我是想让他循环插入的,我插入的@Id是不会变得,数据插入后,应该得到这样的事数据: personId Item Id value 1 1 建筑业 1 2 制造 1 3 业务
DECLARE @Str VARCHAR(max)='[1, 信息科技],[2,建筑],[3,制造业]'
,@Id INT=10
SELECT @Str=REPLACE(','+@Str,',[','[')
, @Str=REPLACE(REPLACE(REPLACE(@str,',',','''),'[',',('),']',''')')+') AS b([key], [value])'
,@Str=STUFF(@Str,1,1,' SELECT '+RTRIM(@Id)+' AS ID ,[key], [value] FROM (Values')
--PRINT @str
INSERT INTO [dbo].[ItemResume] EXEC( @Str)
qq_30173019 2016-01-19
  • 打赏
  • 举报
回复
alter proc proc_InsertItemResume @Id int,@str VARCHAR(max) as begin BEGIN TRAN proc_InsertItemResume BEGIN TRY DECLARE @tran_error int; SET @tran_error = 0; begin select @str=REPLACE(REPLACE(@str,'[','('),']',')')+',' select @str=charindex(',',@str) while @str<>0 begin --执行数据插入 SET @Str='Insert into ItemResume ( [PersonId],[ItemKey], [Value]) Values'+REPLACE(REPLACE(@str,'[','('+RTRIM(@Id)+','),']',')') EXEC( @Str) end end END TRY BEGIN CATCH SET @tran_error = @tran_error + 1 END CATCH IF(@tran_error > 0) BEGIN --执行出错,回滚事务 ROLLBACK TRAN; END ELSE BEGIN --没有异常,提交事务 COMMIT TRAN ; END END exec proc_InsertItemResume 1,"[1, 信息科技],[2,建筑],[3,制造业]" 执行成功,但是数据一条都没进去
qq_30173019 2016-01-19
  • 打赏
  • 举报
回复
执行以后,一行都没有插入,其实我是想让他循环插入的,我插入的@Id是不会变得,数据插入后,应该得到这样的事数据: personId Item Id value 1 1 建筑业 1 2 制造 1 3 业务
中国风 2016-01-19
  • 打赏
  • 举报
回复
Insert t ([ID],[key],[value])--这里改为栏位名,那是我举例的栏位名给你参照的,如果表只有3列可按你之前语句不指定栏位
xiehw007 2016-01-19
  • 打赏
  • 举报
回复
查询出两列组合重复次数最多的行数 table a column1 column2 column3 column4 甲 A c d 甲 B c d 甲 B c d 甲 B c d 乙 C c d 乙 D c d 丙 B c d 丙 B c d 查询结果为3 column1+column2的组合行最多的数量,这如何实现?
中国风 2016-01-19
  • 打赏
  • 举报
回复
方法1
SET @Str='Insert t ([Personid],[key],[value]) SELECT '+RTRIM(@Id)+' AS ID ,[key], [value] FROM (Values'+REPLACE(REPLACE(@str,'[','('),']',')')+') AS b([key], [value])'
EXEC( @Str)
方法2
SET @Str='Insert t ( [Personid],[key], [value]) Values'+REPLACE(REPLACE(@str,'[','('+RTRIM(@ID)+','),']',')')
EXEC( @Str)
把红色的替换就行了
qq_30173019 2016-01-19
  • 打赏
  • 举报
回复
CREATE proc proc_InsertItemResume @Id int,@str VARCHAR(max) as begin BEGIN TRAN proc_InsertItemResume BEGIN TRY DECLARE @tran_error int; SET @tran_error = 0; begin select @str=@str+',' select @str=charindex(',',@str) while @str<>0 begin --执行数据插入 SET @Str='Insert t ([ID],[key],[value]) SELECT '+RTRIM(@Id)+' AS ID ,[key], [value] FROM (Values'+REPLACE(REPLACE(@str,'[','('),']',')')+') AS b([ItemKey], [Value])' EXEC( @Str) end end END TRY BEGIN CATCH SET @tran_error = @tran_error + 1 END CATCH IF(@tran_error > 0) BEGIN --执行出错,回滚事务 ROLLBACK TRAN; END ELSE BEGIN --没有异常,提交事务 COMMIT TRAN ; END END 这样改了 执行了,但是没有成功插入,为什么呢
中国风 2016-01-19
  • 打赏
  • 举报
回复
引用 7 楼 qq_30173019 的回复:
三列我贴下表结构,有三列Personid,itemkey,value 我传了一个id就是personID
#5、#6两种方法都OK
qq_30173019 2016-01-19
  • 打赏
  • 举报
回复
大神 可以留个联系方式么比如QQ之类的
qq_30173019 2016-01-19
  • 打赏
  • 举报
回复
我写的这个存储过程改怎么改啊,大神帮帮忙,帮忙给看看吧
中国风 2016-01-19
  • 打赏
  • 举报
回复
--3列时这样用
CREATE proc proc_InsertItemResume
@Id int,@str VARCHAR(max)
as
begin
BEGIN TRAN proc_InsertItemResume
BEGIN TRY
DECLARE @tran_error int;
SET @tran_error = 0;
begin
select @str=@str+','
    select @str=charindex(',',@str)
while  @str<>0
begin
--执行数据插入
SET @Str='Insert t ([ID],[key],[value]) SELECT '+RTRIM(@Id)+' AS ID ,[key], [value] FROM (Values'+REPLACE(REPLACE(@str,'[','('),']',')')+') AS b([key], [value])'
EXEC( @Str)

end
end
 END TRY
    BEGIN CATCH
SET @tran_error = @tran_error + 1
    END CATCH
IF(@tran_error > 0)
    BEGIN
        --执行出错,回滚事务
        ROLLBACK TRAN;
    END
ELSE
    BEGIN
        --没有异常,提交事务
        COMMIT TRAN ;
    END
END
中国风 2016-01-19
  • 打赏
  • 举报
回复
或这样用
SET @Str='Insert t ( [ID],[key], [value]) Values'+REPLACE(REPLACE(@str,'[','('+RTRIM(@ID)+','),']',')')
EXEC( @Str)
qq_30173019 2016-01-19
  • 打赏
  • 举报
回复
三列我贴下表结构,有三列Personid,itemkey,value 我传了一个id就是personID
中国风 2016-01-19
  • 打赏
  • 举报
回复
INSERT INTO [dbo].[ItemResume] VALUES( --是3列还是2列? 这用上面方法动态,你的格式有变?如果是'[1, 信息科技],[2,建筑],[3,制造业]' 会报错
qq_30173019 2016-01-19
  • 打赏
  • 举报
回复
CREATE proc proc_InsertItemResume @Id int,@str VARCHAR(max) as begin BEGIN TRAN proc_InsertItemResume BEGIN TRY DECLARE @tran_error int; SET @tran_error = 0; begin select @str=@str+',' select @str=charindex(',',@str) while @str<>0 begin --执行数据插入 INSERT INTO [dbo].[ItemResume] VALUES(@Id,REPLACE(REPLACE(@str,'[','('),']',')')) end end END TRY BEGIN CATCH SET @tran_error = @tran_error + 1 END CATCH IF(@tran_error > 0) BEGIN --执行出错,回滚事务 ROLLBACK TRAN; END ELSE BEGIN --没有异常,提交事务 COMMIT TRAN ; END END 表里是三列,提示列名或所提供值的数目与表定义不匹配。
中国风 2016-01-18
  • 打赏
  • 举报
回复
DECLARE @Str VARCHAR(max)='[1, 信息科技],[2,建筑],[3,制造业]'

SET @Str='Insert t ( [key], [value]) Values'+REPLACE(REPLACE(@str,'[','('),']',')')
EXEC( @Str)
sql2008以上版本 这样新增数据
中国风 2016-01-18
  • 打赏
  • 举报
回复
这最好放在程序去处理 数据库只能分拆字符处理,效率没程序高

34,837

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧