导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

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

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

insert t ( key, value) Value(1,”信息科技“)
...全文
250 点赞 收藏 19
写回复
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
这最好放在程序去处理 数据库只能分拆字符处理,效率没程序高
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告