Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQLServer2008中使用存储过程拆分字符串并将数据插入表_Sql_Sql Server_String_Sql Server 2008_Sqlxml - Fatal编程技术网

如何在SQLServer2008中使用存储过程拆分字符串并将数据插入表

如何在SQLServer2008中使用存储过程拆分字符串并将数据插入表,sql,sql-server,string,sql-server-2008,sqlxml,Sql,Sql Server,String,Sql Server 2008,Sqlxml,我想拆分此格式的字符串 引述: 。 实际上这个字符串只是一个示例,我的原始字符串非常大。我没有得到一点,如果我打断这个字符串,那么在拆分字符串之后,我需要多少变量来捕获数据,我希望这些变量被插入到包含日期和年龄等列的数据表中?我使用什么概念?(我从web服务获得这个字符串)提前感谢..一般来说,我建议编写一个CLR函数,通过正则表达式或SQL表值函数拆分字符串,但在您的情况下,您可以尝试一些简单的方法,例如将字符串转换为xml并对其进行解析: declare @str nvarchar(max)

我想拆分此格式的字符串 引述:


实际上这个字符串只是一个示例,我的原始字符串非常大。我没有得到一点,如果我打断这个字符串,那么在拆分字符串之后,我需要多少变量来捕获数据,我希望这些变量被插入到包含日期和年龄等列的数据表中?我使用什么概念?(我从web服务获得这个字符串)提前感谢..

一般来说,我建议编写一个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)
declare@str nvarchar(max)='date=10/10/2000 | age=13^ date=01/01/2001 | age=12^ date=02/02/2005 | age=8'
声明@dataxml
选择@str=replace(@str,“=”,“=”)
选择@str=replace(@str,|,“,”)
选择@str=replace(@str,'^','“/>试试这个:

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

只是一个建议-在web/controller上捕获字符串,为您的数据编写一个解析器,即一个具有日期、年龄或其他属性的对象,创建此对象的集合,并使用批量插入到db。此外,字符串来自web服务-是否有任何方式可以格式化为JSon对象-嘿,让我们保持它非常简单,不需要J据我所知…当然-取决于您对web服务和功能请求的访问Hank u…真的很好!您好,但它给出的错误为“MSG 9410,16级,状态1,第11行XML解析:第1行,字符20964,预期为空白“。你能提供字符串以便我测试它吗?我无法将其发送给你…远远超出了评论框的容量…我告诉你一件事,字符串包含25000个字符。你能将字符串按块分割,看看问题出在哪里吗?”?
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
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