Sunday, August 8, 2010

Cross Apply In SQL Server


I will be introducing you with magic feature from Microsoft SQL-Server 2005, Called CROSS APPLY. If you want to get all Geo information where city are separated by “,” you can use udf or sub query for CROSS APPLY.

Create a Geo table.

Geo
CityState
Rajkot, Ahmedabad, Vadodara, Surat, JamnagarGujarat
Mumbai, Pune, Nagpur, NasikMaharashtra
Bangalore, Mysor, MangaloreKarnataka


Expected Result

To retrieve all Geo information with separated city.
CityStateOrgCity
AhmedabadGujaratRajkot, Ahmedabad, Vadodara, Surat, Jamnagar
JamnagarGujaratRajkot, Ahmedabad, Vadodara, Surat, Jamnagar
RajkotGujaratRajkot, Ahmedabad, Vadodara, Surat, Jamnagar
SuratGujaratRajkot, Ahmedabad, Vadodara, Surat, Jamnagar
VadodaraGujaratRajkot, Ahmedabad, Vadodara, Surat, Jamnagar
BangaloreKarnatakaBangalore, Mysor, Mangalore
MangaloreKarnatakaBangalore, Mysor, Mangalore
MysorKarnatakaBangalore, Mysor, Mangalore
MumbaiMaharashtraMumbai, Pune, Nagpur, Nasik
NagpurMaharashtraMumbai, Pune, Nagpur, Nasik
Nasik< MaharashtraMumbai, Pune, Nagpur, Nasik
PuneMaharashtraMumbai, Pune, Nagpur, Nasik


(1) Create a function that accept string value and return table, after splitting with special character.

Create Function[dbo].[fnSplit]
(
@sInputList VARCHAR(200)
)
RETURNS @List TABLE (item VARCHAR (8000))
BEGIN

DECLARE @sDelimiter varchar(2)
SET @sDelimiter =',' --Set Delimiter value

DECLARE @sItem VARCHAR(8000)

WHILE CHARINDEX(@sDelimiter, @sInputList, 0) <> 0
BEGIN
SELECT @sItem = RTRIM(LTRIM(SUBSTRING(@sInputList, 1, CHARINDEX(@sDelimiter, @sInputList, 0)-1))), @sInputList=RTRIM(LTRIM (SUBSTRING(@sInputList, CHARINDEX(@sDelimiter, @sInputList, 0)+LEN(@sDelimiter),LEN(@sInputList))))

IF LEN(@sItem) > 0
INSERT INTO @List SELECT @sItem
END

IF LEN(@sInputList) > 0
INSERT INTO @List SELECT @sInputList -- Put the last item in

RETURN

END

How to execute above function

Select * from dbo.fnSplit('Rajkot, Ahmedabad, Vadodara, Surat, Jamnagar')
orderby item

Result:
Ahmedabad
Jamnagar
Rajkot
Surat
Vadodara

(2) To retrieve above Expected Result use following query

SELECT Item as City, [State], City as OrgCity
FROM Geo
CROSS APPLY [dbo].[fnSplit](Geo.city)
Orderby [State], Item

==============================================
Nirman Doshi|Senior Software Engineer

WebMingle Technology
Accelerated by knowledge. Driven by values.
www.webMingle.in

No comments:

Post a Comment