2015-04-28 20 views
6

我傳遞一個字符串以存儲過程: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 

回答

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 
+0

作品般的魅力.. thaks mohan111 –

+0

歡迎@NikhilBagadiya – mohan111

0

使用字符串和CHARINDEX:

SELECT Substring(col, 0, Charindex(col, ':') - 1)  AS id, 
     Substring(col, Charindex(col, ':') + 1, Len(col)-Charindex(col, ':')) AS value 
FROM splittedtable 
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 
+0

感謝@ughai很好的解決方案 –