2015-04-28 6 views
6

Przekazuję jeden ciąg do procedury składowania: 1:20,2:30,4:50 Zawiera identyfikator i odpowiednią dla niego wartość.Wstawianie wielu wartości w tabeli przy użyciu ciągu znaków

Jak dodać wartość, jak pokazano w tabeli poniżej w bazie danych.

ID  Value 
1  20 
2  30 
4  50 

już funkcję „stringSplit”, który działa doskonale i daje się umieścić w wartości rzędu niektórzy myślą tak:

1:20 
2:30 
4:50 

może ktoś proszę mi pomóc wstawić dane do tabeli z każdego rozwiązania.

już spróbować tego rozwiązania

insert <table> (colname) 
select y.item 
from dbo.SplitString(@testString, ':') x 
cross apply 
dbo.SplitString(x.item, ',') y 

ale powróci zduplikowanych wartości jako bardziej jako wartość id.

moja procedura sklep jest

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 

Odpowiedz

7

Jak już podzielony na wiersze i chcesz wstawić do jakiegoś stołu przez splliting na dwie kolumny mogą być to prace

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

działa jak urok .. thaks mohan111 –

+0

witamy @NikhilBagadiya – mohan111

0

Zastosowanie podciąg i CHARINDEX:

SELECT Substring(col, 0, Charindex(col, ':') - 1)  AS id, 
     Substring(col, Charindex(col, ':') + 1, Len(col)-Charindex(col, ':')) AS value 
FROM splittedtable 
3

Możesz także wypróbować XML.nodes() i funkcje łańcuchowe do plucia danych. Coś takiego

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

thanks @ughai dobrym rozwiązaniem –