【问题标题】:split string in sql and add each seprareted value into each column of table在sql中拆分字符串并将每个单独的值添加到表的每一列中
【发布时间】:2017-02-20 21:40:46
【问题描述】:

嗨,我想在下面用 - 和 ;和:在 sql server 中并插入到另一个表中

declare @data varchar(max)=null
set @data='nt:865067021846160;2;8.5.05;1,1,20161010102239.000,18.580423,73.815948,549.700,0.28,33.6,11;101;100;0;0;0;FF;146;25}'


col1     col2           col3     col4
Nt  895067021846160     2       7.5.05
nt  875067021846160     3      8.5.05
nt  835067021846160     5      8.5.05

等等

我使用了子字符串和 CHARINDEX,但我没有得到正确的结果。 谢谢

【问题讨论】:

标签: sql sql-server-2008 split substring charindex


【解决方案1】:

对于字符串拆分需求有很多解决方案,您可以从这里fnSplitString使用其中一种字符串拆分功能

我只是在你的例子中演示如何使用这个函数。

尝试将所有-,; 转换为:

declare @data varchar(max)=null
set @data='nt:865067021846160;2;8.5.05;1,1,20161010102239.000,18.580423,73.815948,549.700,0.28,33.6,11;101;100;0;0;0;FF;146;25}'
SET @data=REPLACE(REPLACE(@data,'-',':'),';',':')

现在如下调用fnSplitString,这将给出包含所有字符串片段的单列表。

INSERT INTO #TableName(Col1) SELECT * FROM dbo.fnSplitString(@data,':')

这将给出这样的输出

nt
865067021846160
2
8.5.05
1,1,20161010102239.000,18.580423,73.815948,549.700,0.28,33.6,11
101
100
0
0
0
FF
146
25}

【讨论】:

  • INSERT INTO #TableName SELECT * FROM dbo.fnSplitString(@data,':') 在特定列中逐行插入下面的数据时,列不匹配失败
  • #TableName 列应该只有在数据类型为 varchar(max) 的列上是吧?
  • 但我想在表的特定列中添加这些记录,考虑我的表是创建表 #tempframedata (col1 varchar(max),col2 varchar(max), col3 varchar(max), col4 varchar(最大值),col5 varchar(最大值),col6 varchar(最大值),col7 varchar(最大值),col8 varchar(最大值),col9 varchar(最大值),col10 varchar(最大值),col11 varchar(最大值),col12 varchar(最大值) ,col13 varchar(max))
  • 以及您要在哪一列中添加此数据
  • 第一列第一行数据然后接下来这样
【解决方案2】:

试试下面的脚本。

DECLARE @data VARCHAR(Max) = 'nt:865067021846160;2;8.5.05;1,1,20161010102239.000,18.580423,73.815948,549.700,0.28,33.6,11;101;100;0;0;0;FF;146;25}'
DECLARE @SpitChars varchar(100) = '%[:;-]%'

;WITH cte_1 
  AS
    (
        SELECT PATINDEX(@SpitChars, @data) - 1 + case when  PATINDEX(@SpitChars, Left(@data,1)) = 1 then 1 else 0 end AS LineBreaker
            , @data AS dataString
            ,SUBSTRING(@data, 1, ISNULL(NULLIF(PATINDEX(@SpitChars, @data), 0) - 1 +case when  PATINDEX(@SpitChars, Left(@data,1)) = 1 then 1 else 0 end, 8000)) AS [Extract]
        UNION ALL
        SELECT LineBreaker + ISNULL(NULLIF(PATINDEX(@SpitChars, SUBSTRING(dataString, LineBreaker+1 , 8000)), 0) -  case when  PATINDEX(@SpitChars, SUBSTRING(dataString, LineBreaker+1 , 8000)) = 1 then 0 else 1 end  ,datalength(dataString)-LineBreaker) LineBreaker
            , dataString
            ,SUBSTRING(dataString, LineBreaker+ 1 , ISNULL(NULLIF(PATINDEX(@SpitChars, SUBSTRING(dataString, LineBreaker+1 , 8000)), 0) -  case when  PATINDEX(@SpitChars, SUBSTRING(dataString, LineBreaker+1 , 8000)) = 1 then 0 else 1 end  ,datalength(dataString)-LineBreaker)) AS [Extract]
        FROM  cte_1
        WHERE LineBreaker BETWEEN 1 AND datalength(@data)-1 
    )
SELECT [1] Col1,[2] Col2,[3] Col3,[4] Col4,[5] Col5
      ,[6] Col6,[7] Col7,[8] Col8,[9] Col9,[10] Col10
      ,[11] Col11,[12] Col12,[13] Col13
FROM(
SELECT [Extract],ROW_NUMBER()OVER( ORDER BY (SELECT 1))RNO
FROM  cte_1
WHERE [Extract] NOT IN (':',';','-'))t
PIVOT(MAX([Extract]) FOR [RNO] IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13]) )as pvt

【讨论】:

  • 是否可以将数据插入特定列而不是单列
  • 你能提供更多细节吗?是否要将结果(拆分记录)插入到其他表中?
  • 我只想将数据存储在表中,例如 col1 col2 col3 col4 Nt 895067021846160 2 7.5.05 nt 875067021846160 3 8.5.05 nt 835067021846160 5 8.5.05
  • 但是在这个示例中,我们将得到 13 个字符串作为输出,当我们使用分隔符 ':;-' 进行拆分时。所以你需要 13 列来存储数据。如果有更多的字符串,你想如何管理这个?
  • 13 将被修复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
相关资源
最近更新 更多