In order to parse an array passed in as a parameter in a stored procedure I use a stored procedure ripped from here: http://vyaskn.tripod.com/passing_arrays_to_stored_procedures.htm
To be more precise, it is method 5:
SELECT o.OrderID, CustomerID, EmployeeID, OrderDate
FROM dbo.Orders AS o
JOIN
(
SELECT LTRIM(RTRIM(SUBSTRING(OrderID, number+1, CHARINDEX(',', OrderID, number+1)-number - 1))) AS OrderID
FROM
(
SELECT ',' + @OrderList + ',' AS OrderID
) AS InnerQuery
JOIN
Numbers n
ON
n.Number < LEN(InnerQuery.OrderID)
WHERE SUBSTRING(OrderID, number, 1) = ','
) as Derived
ON o.OrderID = Derived.OrderID
I use this sp to insert records in a table and instead of one column per insert (row) I need to do more.
For example, my input string would be something like:
col1_val1,col2_val1,col3_val1,col1_val2,col2_val2,col3_val2,col1_val3,col2_val3,col3_val3 ....
However, I can't get my head around how to build this query. I have tried a cross join to multiple Numbers table but that generates a cartesian product (I cannot get a distinct-like result).
Is there any way around it?
Thanks
by: Rajesh_mjPosted on 2007-11-14 at 02:59:41ID: 20278914
Hi, p assing_arr ays_to_sto red_proced ures.htm
as three columns ).
st)
mn1, number+1, CHARINDEX(',', Column1, number+1)-number - 1))) AS Column1
mn2, number+1, CHARINDEX(',', Column2, number+1)-number - 1))) AS Column2
mn3, number+1, CHARINDEX(',', Column3, number+1)-number - 1))) AS Column3
First create dbo.SplitOrderIDs specified in the method 6
http://vyaskn.tripod.com/
Then just try this:
(I have used orderid,ShipVia,EmployeeID
declare @OrderList varchar(1000),@Col1 varchar(1000),@Col2 varchar(1000),@Col3 varchar(1000)
SET @OrderList ='10248,3,5,10259,3,4'
drop table #newtable
Select IDENTITY(int, 1,1) AS ID_Num, OrderID INTO #NewTable from dbo.SplitOrderIDs(@OrderLi
select * from #NewTable
Select @col1 = '',@col2 = '',@Col3 =''
select @Col1 =@Col1+cast(OrderID as varchar(10))+',' from #NewTable where Id_Num % 3 = 1
select @Col2 =@Col2+cast(OrderID as varchar(10))+',' from #NewTable where Id_Num % 3 = 2
select @Col3 =@Col3+cast(OrderID as varchar(10))+',' from #NewTable where Id_Num % 3 = 0
SELECT Distinct o.OrderID, CustomerID, EmployeeID, OrderDate
FROM dbo.Orders AS o
JOIN
(
SELECT LTRIM(RTRIM(SUBSTRING(Colu
FROM
(
SELECT ',' + @col1 + ',' AS Column1
) AS InnerQuery
JOIN
Numbers n
ON
n.Number < LEN(InnerQuery.Column1)
WHERE SUBSTRING(Column1, number, 1) = ','
) as Derived1
ON o.OrderID = Derived1.Column1
JOIN
(
SELECT LTRIM(RTRIM(SUBSTRING(Colu
FROM
(
SELECT ',' + @col2 + ',' AS Column2
) AS InnerQuery
JOIN
Numbers n
ON
n.Number < LEN(InnerQuery.Column2)
WHERE SUBSTRING(Column2, number, 1) = ','
) as Derived2
ON o.ShipVia = Derived2.Column2
JOIN
(
SELECT LTRIM(RTRIM(SUBSTRING(Colu
FROM
(
SELECT ',' + @col3 + ',' AS Column3
) AS InnerQuery
JOIN
Numbers n
ON
n.Number < LEN(InnerQuery.Column3)
WHERE SUBSTRING(Column3, number, 1) = ','
) as Derived3
ON o.EmployeeID = Derived3.Column3