【问题标题】:How to split a string in sql server 2008 using stored procedure and insert the data to table如何使用存储过程在 sql server 2008 中拆分字符串并将数据插入表中
【发布时间】:2023-03-30 11:38:02
【问题描述】:

我想以这种格式分割一个字符串 引用:

"date=10/10/2000|age=13^date=01/01/2001|age=12^date=02/02/2005|age=8"

。 实际上这个字符串只是一个示例,我的原始字符串非常大。我没有得到一点,如果我打破这个字符串比我必须制作多少个变量来捕获数据也是在拆分字符串之后我希望将其插入到包含日期和年龄列的数据表中?我使用什么概念?(我从网络服务中获取这个字符串)提前谢谢..

【问题讨论】:

  • 只是一个建议-在网络/控制器上捕获字符串,为您的数据编写一个解析器,即一个具有日期、年龄或其他属性的对象,创建这些对象的集合并使用批量插入到数据库.
  • 字符串也来自网络服务 - 有没有办法格式化为 JSon 对象 - msdn.microsoft.com/en-us/library/bb299886.aspx
  • 嘿,让我们保持简单,我认为不需要 JSON...
  • 当然 - 取决于您对 Web 服务和功能请求的访问权限

标签: sql sql-server string sql-server-2008 sqlxml


【解决方案1】:

一般来说,我建议编写一个 CLR 函数,它通过正则表达式或 SQL 表值函数拆分字符串,但在您的情况下,您可以尝试一些简单的方法,例如将字符串转换为 xml 并解析它:

declare @str nvarchar(max) = 'date=10/10/2000|age=13^date=01/01/2001|age=12^date=02/02/2005|age=8'
declare @data xml

select @str = replace(@str, '=', '="')
select @str = replace(@str, '|', '" ')
select @str = replace(@str, '^', '"/><row ')
select @str = '<row ' + @str + '"/>'

select @data = cast(@str as xml)

select
    t.c.value('@date', 'nvarchar(max)') as [date],
    t.c.value('@age', 'nvarchar(max)') as [age]
from @data.nodes('row') as t(c)

sql fiddle demo

【讨论】:

  • 谢谢你...真的很棒!
  • 嗨,但它给出的错误是“MSG 9410, Level 16, State 1, Line 11 XML parsing: line 1, character 20964, white space expected”。
  • 能否提供字符串让我测试一下?
  • 我无法将它发布给你...非常大的方式超出了评论框的容量...我告诉你一个字符串包含 25000 个字符的事情..
  • 你能把你的字符串分成几块,看看问题出在哪里?
【解决方案2】:

试试这个:

Declare @stringToSplit varchar(max)='date=10/10/2000|age=13^date=01/01/2001|age=12^date=02/02/2005|age=8^date=10/10/2000|age=13^date=01/01/2001|age=12^date=02/02/2005|age=8^date=10/10/2000|age=13^date=01/01/2001|age=12^date=02/02/2005|age=8^date=10/10/2000|age=13^date=01/01/2001|age=12^date=02/02/2005|age=8'

DECLARE @YourTable table (RowID int, Layout varchar(max))
INSERT @YourTable VALUES (1,@stringToSplit)

;WITH SplitSting AS
(
    SELECT
    RowID,LEFT(Layout,CHARINDEX('^',Layout)-1) AS Part
   ,RIGHT(Layout,LEN(Layout)-CHARINDEX('^',Layout)) AS Remainder
    FROM @YourTable
    WHERE Layout IS NOT NULL AND CHARINDEX('^',Layout)>0
    UNION ALL
    SELECT
    RowID,LEFT(Remainder,CHARINDEX('^',Remainder)-1)
   ,RIGHT(Remainder,LEN(Remainder)-CHARINDEX('^',Remainder))
    FROM SplitSting
    WHERE Remainder IS NOT NULL AND CHARINDEX('^',Remainder)>0
    UNION ALL
    SELECT
    RowID,Remainder,null
    FROM SplitSting
    WHERE Remainder IS NOT NULL AND CHARINDEX('^',Remainder)=0

)

select SUBSTRING(part,CHARINDEX('=',part)+1,(CHARINDEX('|',part)-CHARINDEX('=',part))-1) as [Date],RIGHT(part,CHARINDEX('=',reverse(part))-1) as [Age] from SplitSting

【讨论】:

    【解决方案3】:
    DECLARE @s VARCHAR(300)
    SET @s = 'RELGENINS|1121232243434|343434343434|343434-683211|34343434.00|CIT|22297568|NA|INR|ONDIRECT|NA|NA|NA|22-03-2014 10:43:20|0300|NA|NA|NA|NA|NA|NA|NA|NA|NA|Success|1790153891'
    
    DECLARE @tmp TABLE(   aDate varchar(50))
    
    ;WITH MyRows AS
    (
        SELECT LEFT(@s, CHARINDEX('|', @s) -1) AS MyRow, RIGHT(@s, LEN(@s) - CHARINDEX('|', @s)) AS Remainder
    
        UNION ALL
        SELECT LEFT(Remainder, CHARINDEX('|', Remainder) -1) AS MyRow, RIGHT(Remainder, LEN(Remainder) - CHARINDEX('|', Remainder)) AS Remainder
        FROM MyRows
        WHERE CHARINDEX('|', Remainder)>0
        UNION ALL
        SELECT Remainder AS MyRow, NULL AS Remainder
        FROM MyRows
        WHERE CHARINDEX('|', Remainder)=0
    )
    INSERT INTO @tmp (aDate)
    SELECT  SUBSTRING(MyRow, 0, 20) as date
    FROM MyRows
    
    SELECT *
    FROM @tmp 
    

    【讨论】:

      猜你喜欢
      • 2015-07-28
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      • 2011-09-15
      相关资源
      最近更新 更多