| Author |
Topic |
|
aakcse
Aged Yak Warrior
570 Posts |
Posted - 2012-06-29 : 08:34:11
|
In a table column I have data as below'A2','act1''+','act2''s9','act4,act8,act12'I want to insert into other table as belowA2 act1+ act2s9 act4s9 act8s9 act12I have a tabled value function which takes string & delimiter and returns resultsCREATE FUNCTION StringToTable (@Delimiter VARCHAR(5), @String VARCHAR(max))RETURNS @RtnValue TABLE ([ID] INT IDENTITY(1, 1),[Value] VARCHAR(max))AS BEGIN DECLARE @Cnt INTSET @Cnt=1WHILE (CHARINDEX(@Delimiter, @String)>0) --charindex(',' 'actuser1')BEGININSERT INTO @RtnValue ([Value])SELECT [Value] = LTRIM(RTRIM(SUBSTRING(@String, 1, CHARINDEX(@Delimiter, @String)-1)))SET @String=SUBSTRING(@String, CHARINDEX(@Delimiter, @String)+1, LEN(@String))SET @Cnt=@Cnt+1ENDINSERT INTO @RtnValue ([Value])SELECT [Value] = LTRIM(RTRIM(@String))RETURNEND-Neil |
|
|
sunitabeck
Master Smack Fu Yak Hacker
5155 Posts |
Posted - 2012-06-29 : 09:18:30
|
Assuming the columns are Col1 and Col2:INSERT INTO YourNewTable(Col1, Col2)SELECT a.Col1, b.[Value]FROM YourTable a CROSS APPLY ( SELECT [Value] FROM dbo.StringToTable(',',a.Col2)) b |
 |
|
|
aakcse
Aged Yak Warrior
570 Posts |
Posted - 2012-06-29 : 10:29:22
|
Thanks, I need help to develop the else part of the below code in the SP, The IF part is working fine & Giving the desired result I am trying handle this kind of data 'a','p,q,r' in the else part rest all explained in comment@LC = 1set @LT= (SELECT TOP 1 ID FROM #L ORDER BY ID DESC) --#L is the table which contains dataUPDATE #L SET L=''''+REPLACE(lump,@Delim,''',''')+'''' -- now the delimter is ',' --after this L= 'a','p,q,r' type of data for all rec--ufn_CountChar this function returns number of delimiterWHILE @LC<=@LT BEGIN -- here I inserted all the normal values data e.g. 'a','b' else part should take care of kind of 'a','p,q,r' SELECT @No_Of_Delim = ufn_CountChar(L,',') FROM #L WHERE ID = @LC --@No_Of_Col is the total number of columns in the table IF @No_Of_Col = @No_Of_Delim+1 -- +1 coz say e.g. no of col=2 then delimiter will 1 BEGIN SELECT @SQLString = 'INSERT INTO '+@v_ToTableName+' VALUES(' + L + ')' FROM #L WHERE ID = @LC EXEC (@sqlstring) END ELSE --'a','b,c,d,e,f' like wise data in L column of #L BEGIN INSERT INTO @v_ToTableName -- YourNewTable @header --(Col1, Col2) --@header is passed as a parameter to this SP it contails values like 'col1 varchar(10), col2 varchar(20)' SELECT a.Col1, b.[Value] FROM YourTable a CROSS APPLY ( SELECT [Value] FROM dbo.StringToTable(',',a.Col2)) b ENDset @lc=@lc+1end -- end of while-Neil |
 |
|
|
sunitabeck
Master Smack Fu Yak Hacker
5155 Posts |
Posted - 2012-06-29 : 11:56:10
|
| What is the definition of the @v_ToTableName table? You have to list the columns of that table in the insert list. Also, there must be one column in the select list for each column you list in the insert list. |
 |
|
|
aakcse
Aged Yak Warrior
570 Posts |
Posted - 2012-06-29 : 14:46:45
|
@v_ToTableName is the to table name, I am passing to and from table names as parameter to the sp and col names, of from table as a parameter I have now changed the else part as below, however this might cause performance .. BEGIN SELECT @Var = L from #L WHERE ID = @L SET @Var1stCol = SUBSTRING(@VAR,1,CHARINDEX(',',@Var)-1 ) SET @VAR = SUBSTRING(@VAR,CHARINDEX(',',@Var)+1,LEN(@VAR)) --'b,c,d,e' SET @NO_OF_DELIM2=@No_Of_Delim WHILE (@NO_OF_DELIM2 > 0) -- 'a','b,c,d,e' 4>0-- 3>0 --2>0 --1>0 BEGIN IF @NO_OF_DELIM2=1 SET @REST_VAR = @VAR ELSE BEGIN SET @REST_VAR = LEFT(@VAR,CHARINDEX(',',@VAR)-1) +'''' --'b'--'c'--'d'-- SET @VAR = ''''+SUBSTRING(@VAR,CHARINDEX(',',@Var)+1,LEN(@VAR)) --'c,d,e'--'d,e'--'e' END SELECT @SQLString = 'INSERT INTO '+@v_ToTableName+ ' VALUES('+@Var1stCol+ ','+@REST_VAR+')' EXEC (@SQLString) SET @NO_OF_DELIM2 = @NO_OF_DELIM2 - 1 --3--2--1--0 END-Neil |
 |
|
|
aakcse
Aged Yak Warrior
570 Posts |
Posted - 2012-06-29 : 16:39:23
|
| I have tested the above code with different data sets, it is working perfectly only problem might be in future is with performance-Neil |
 |
|
|
aakcse
Aged Yak Warrior
570 Posts |
Posted - 2012-07-02 : 15:14:19
|
| Hi Sunitha, I am facing problem with data like'a','b','x,y,z'I have programmed for 'a','x,y,z' how to deal with above data, Can I use patindex and charindex to separate the 'x,y,z' and 'a','b'?-Neil |
 |
|
|
|
|
|