我将一个字符串传递给存储过程:1:20,2:30,4:50
它包含id和适当的值。
如何在数据库中添加如下表所示的值。
ID Value
1 20
2 30
4 50
我已经" stringSplit"功能完美的工作,并给出行值,有些人想这样:
1:20
2:30
4:50
任何人都可以帮我用任何解决方案将数据插入表中。
我已经尝试过这个解决方案了
insert <table> (colname)
select y.item
from dbo.SplitString(@testString, ':') x
cross apply
dbo.SplitString(x.item, ',') y
但这将返回重复值,与id值一样多。
我的商店程序是
CREATE PROCEDURE [dbo].[temp_result_insert]
@dataString varchar(max)
AS
insert into tempTable(id,marks)
select x.Item,y.Item
from dbo.SplitStringVarcahr(@dataString, ':') x
cross apply
dbo.SplitStringVarcahr(x.Item,',') y
RETURN 0
答案 0 :(得分:7)
由于您已经拆分成行,并且希望通过splliting到两列来插入某些表,这可能会有效
CREATE TABLE #Test(ID INT,Val INT)
declare @t table (val varchar(50))
insert into @t (val)values ('1:20,2:30,4:50')
declare @str varchar(max)
;with cte as (
SELECT
Split.a.value('.', 'VARCHAR(100)') AS String
FROM (SELECT
CAST ('<M>' + REPLACE([val], ',', '</M><M>') + '</M>' AS XML) AS String
FROM @t) AS A CROSS APPLY String.nodes ('/M') AS Split(a))
INSERT INTO #Test
select SUBSTRING(String,0,CHARINDEX(':',String)),REVERSE(SUBSTRING(reverse(String),0,CHARINDEX(':',reverse(String)))) from cte
select * from #test
答案 1 :(得分:3)
您还可以尝试XML.nodes()
和字符串函数来吐出数据。像这样的东西
DECLARE @var VARCHAR(100) = '1:20,2:30,4:50'
DECLARE @xml xml = CONVERT(xml, '<r>' + REPLACE(@var,',','</r><r>') + '</r>')
SELECT LEFT(val,cindex - 1) c1,RIGHT(val,LEN(val) - cindex) c2
FROM
(
SELECT CHARINDEX(':',c.value('text()[1]','VARCHAR(100)')) cindex,c.value('text()[1]','VARCHAR(100)') val
FROM @xml.nodes('r') as t(c))c
答案 2 :(得分:0)
使用substring和Charindex:
SELECT Substring(col, 0, Charindex(col, ':') - 1) AS id,
Substring(col, Charindex(col, ':') + 1, Len(col)-Charindex(col, ':')) AS value
FROM splittedtable