首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从长字符串文本中拆分数据,然后更新每个数据。

从长字符串文本中拆分数据,然后更新每个数据。
EN

Stack Overflow用户
提问于 2018-08-23 10:23:46
回答 1查看 63关注 0票数 0

我试图在ms数据库中创建一个有点复杂的存储过程。我的主要关注点是输入长字符串文本,然后将数据拆分为字符,并在匹配的地方更新数据。详细说明:DataString是输入的长文本字符串,它将包含类似于下面示例的值。

'-'是数据类型名称与其值之间的分隔符。

','是两种不同值之间的分隔符。

':'是两组数据之间的分隔符,每组数据都由:分隔。

现在,您能告诉我如何从长字符串中获取每个数据并将它们插入到匹配的位置吗?如果你还需要知道些什么,问个问题。提前感谢

长文本字符串示例:

代码语言:javascript
复制
ASIN-NsQf8,type-0,Price-7,IsPrime-1:ASIN-fD5tsQ,type-1,Price-13,IsPrime-0:ASIN-tvQtsu,type-1,Price-14,IsPrime-1

未完成的SQL代码:

代码语言:javascript
复制
CREATE PROCEDURE dbo.lk_UpdateMatchingDataOfThirdparty 
@DataString VARCHAR(MAX)
AS
BEGIN
    SET NOCOUNT ON;

    UPDATE ThirdPartyData SET Price = @value_get_from_string, IsPrime = @value_get_from_string, DateChecked = GETDATE()
    WHERE ASIN = '@value_get_from_string' AND type = '@value_get_from_string';
END
GO
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-23 10:58:57

不幸的是,string_split()不返回序列号。因此,如果您对另一个拆分/解析函数开放,它也是执行函数。

注:i对try_convert()部分作了假设

示例

代码语言:javascript
复制
Declare @DataString varchar(max) = 'ASIN-NsQf8,type-0,Price-7,IsPrime-1:ASIN-fD5tsQ,type-1,Price-13,IsPrime-0:ASIN-tvQtsu,type-1,Price-14,IsPrime-1'

UPDATE A 
   SET Price       = B.Price
     , IsPrime     = B.IsPrime
     , DateChecked = GETDATE()
 From  ThirdPartyData A
 Join  (
        Select [ASIN]   =replace(max(case when B.RetVal Like 'ASIN-%' then B.RetVal end),'ASIN-','')
              ,[Type]   =try_convert(int,replace(max(case when B.RetVal Like 'type-%' then B.RetVal end),'type-',''))
              ,[Price]  =try_convert(money,replace(max(case when B.RetVal Like 'price-%' then B.RetVal end),'price-',''))
              ,[IsPrime]=try_convert(bit,replace(max(case when B.RetVal Like 'IsPrime-%' then B.RetVal end),'IsPrime-',''))
         From  [dbo].[tvf-Str-Parse](@DataString,':') A
         Cross Apply [dbo].[tvf-Str-Parse](A.RetVal,',') B
         Group By A.RetSeq
       ) B 
   on  A.[ASIN]=B.[ASIN] and A.[Type]=B.[Type]

如果有助于可视化,则子查询返回

代码语言:javascript
复制
ASIN    Type    Price   IsPrime
tvQtsu  1       14.00   1
NsQf8   0       7.00    1
fD5tsQ  1       13.00   0

如果感兴趣的话,

代码语言:javascript
复制
CREATE FUNCTION [dbo].[tvf-Str-Parse] (@String varchar(max),@Delimiter varchar(10))
Returns Table 
As
Return (  
    Select RetSeq = Row_Number() over (Order By (Select null))
          ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
    From  (Select x = Cast('<x>' + replace((Select replace(@String,@Delimiter,'§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
    Cross Apply x.nodes('x') AS B(i)
);

string_split()编辑:如果您想要2016+

代码语言:javascript
复制
Select [ASIN]   =replace(max(case when Value Like 'ASIN-%' then Value end),'ASIN-','')
      ,[Type]   =try_convert(int,replace(max(case when Value Like 'type-%' then Value end),'type-',''))
      ,[Price]  =try_convert(money,replace(max(case when Value Like 'price-%' then Value end),'price-',''))
      ,[IsPrime]=try_convert(bit,replace(max(case when Value Like 'IsPrime-%' then Value end),'IsPrime-',''))
 From (
       Select A.RN
             ,B.*
        From ( Select RN=Row_Number() over (Order by (select null)),* from string_split(@DataString,':') ) A
        Cross Apply string_split(A.Value,',') B
      ) A
 Group By RN
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51983600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档