Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
Author |
Topic |
harivhn
Starting Member
4 Posts |
Posted - 2008-01-08 : 04:18:08
|
SQL UDF split()The objective of this article is to help the SQL developers with an UDF that can be used within a stored procedures or Function to split a string (based on given delimiter) and extract the required portion of the string. Scripting languages like VB script and Java script have in-built split() functions but there is no such function available in SQL server. In my experience this function is really handy when you’re working on an ASP application with SQL server as backend, whereby you’ll need to pass the ASP page submitted values to the SQL stored procedure. To give a simple example, in a typical Monthly reporting ASP page – the users would select a range of months and extract the information pertaining to this date range. Classic implementation of this model is to have an ASP page to accept the input parameters and pass the values to the SQL stored procedure (SP). The SP would return a result set which is then formatted in the ASP page as results.If the date range is continuous ie. JAN07 to MAR07 then the SP can typically accept a ‘From’ and ‘To’ range variables. But I’ve encountered situations whereby the users select 3 months from the current year and 2 months from previous year (non-continuous date ranges). In such scenario the SP cannot have a date range as input parameters. Typically an ASP programmer would do is by having a single date input parameter in the SP and call the SP within a loop in the ASP page. This is an inefficient way of programming as contacting the database server within an ASP loop could cause performance overhead especially if the table being queried is an online transaction processing table.Here is how I handled the above situation.1. Declared one string input parameter of type varchar(8000) (if you’re using SQL 2005 then it is advisable to use Varchar(Max))2. Pass the ASP submitted values as string, in this case the months selected by user would be supplied to the SP as a string3. Within the Stored Procedure I’ll call the split() function to extract each month from the string and query the corresponding dataThe basic structure of the stored procedure is as pasted below:-CREATE PROCEDURE FETCH_SALES_DETAIL (@MONTH VARCHAR(MAX))ASBEGIN DECLARE @MONTH_CNT INT,@MTH DATETIME SET @MONTH_CNT=1 WHILE DBO.SPLIT(@MONTH,',',@MONTH_CNT) <> '' BEGIN SET @MTH = CAST(DBO.SPLIT(@MONTH,',',@MONTH_CNT) AS DATETIME) --<<Application specific T-SQLs>>-- (BEGIN) SELECT [SALES_MONTH],[SALES_QTY],[PRODUCT_ID],[TRANSACTION_DATE] FROM SALES (NLOCK) WHERE [SALES_MONTH]= @MTH --<<Application specific T-SQLs>>--(END) SET @MONTH_CNT=@MONTH_CNT+1 ENDENDDbo.SPLIT() function takes 3 parameters 1) The main string with the values to be split2) The delimiter3) The Nth occurrence of the string to be returnedThe functionality of the UDF is as explained STEP by STEP:1. Function DeclarationCREATE FUNCTION [dbo].[SPLIT] ( @nstring VARCHAR(MAX), @deliminator nvarchar(10), @index int)RETURNS VARCHAR(MAX)Function is declared with 3 input parameters:- @nstring of type VARCHAR(MAX) will hold the main string to be split@deliminator of type NVARCHAR(10) will hold the delimiter @index of type INT will hold the index of the string to be returned2. Variable DeclarationDECLARE @position intDECLARE @ustr VARCHAR(MAX)DECLARE @pcnt intThree variables are needed within the function. @position is an integer variable that will be used to traverse along the main string. @ustr will store the string to be returned and the @pcnt integer variable to check the index of the delimiter.3. Variable initialization SET @position = 1SET @pcnt = 1SELECT @ustr = ''Initialize the variables 4. Main functionality WHILE @position <= DATALENGTH(@nstring) and @pcnt <= @index BEGIN IF SUBSTRING(@nstring, @position, 1) <> @deliminator BEGIN IF @pcnt = @index BEGIN SET @ustr = @ustr + CAST(SUBSTRING(@nstring, @position, 1) AS nvarchar) END SET @position = @position + 1 END ELSE BEGIN SET @position = @position + 1 SET @pcnt = @pcnt + 1 ENDEND4.1 The main while loop is used to traverse through the main string until the word index is less than or equal to the index passed as input parameter.4.2 Within the while loop each character within the string is verified against the delimiter and if it does not match then local word count variable is checked against the input index parameter4.3 If the values are same ie., the input variable index and the word being processed in the while loop are the same then the word is stored in the @ustr variable. If the values does not match then the @position variable is incremented.4.4 If the character matches with the delimiter then the word count variable @pcnt is incremented along with the @position variable5. Return the valueRETURN @ustrI hope this article would benefit those who are looking for a handy function to deal with Strings.Feel free to send your feedback at dearhari@gmail.com |
|
blindman
Master Smack Fu Yak Hacker
2365 Posts |
|
|
|
|
|
|