Technical Article

Split User Defined Function (updated)

,

Since T-SQL has no array data type, passing delimited strings is a great way to send a variable number of parameters to a function or stored procedure.  This function behaves similarly to the VBScript function or Javascript String.split method.  You pass it a delimited string and the delimiter where the split should occur.  Returns a table data type as a psuedo array.  I have added to my model database so a copy is made for all new DBs

IF exists (SELECT * from dbo.sysobjects 
	WHERE id = object_id(N'[dbo].[Split]') 
	AND OBJECTPROPERTY(id, N'IsTableFunction') = 1)
DROP FUNCTION [dbo].[Split]
GO


GO
CREATE FUNCTION dbo.Split (	@vcDelimitedString 		varchar(8000),
				@vcDelimiter			varchar(100) )
/**************************************************************************
DESCRIPTION: Accepts a delimited string and splits it at the specified
		delimiter points.  Returns the individual items as a table data
		type with the ElementID field as the array index and the Element
		field as the data

PARAMETERS:
		@vcDelimitedString		- The string to be split
		@vcDelimiter			- String containing the delimiter where
							delimited string should be split

RETURNS:
		Table data type containing array of strings that were split with
		the delimiters removed from the source string

USAGE:
		SELECT ElementID, Element FROM Split('11111 22222 3333', ' ') ORDER BY ElementID

AUTHOR:	Karen Gayda

DATE: 	05/31/2001

MODIFICATION HISTORY:
	WHO		DATE		DESCRIPTION
	---		----------	---------------------------------------------------
	KMG		01/30/2009	Changed LEN() to DATALENGTH()
***************************************************************************/
RETURNS @tblArray TABLE 
   (
	ElementID	smallint	IDENTITY(1,1),  --Array index
   	Element		varchar(1000)			--Array element contents
   )
AS
BEGIN

	DECLARE 
	@siIndex					smallint,
	@siStart					smallint,
	@siDelSize					smallint


	SET @siDelSize	= DATALENGTH(@vcDelimiter)
	--loop through source string and add elements to destination table array
	WHILE DATALENGTH(@vcDelimitedString) > 0
	BEGIN
		SET @siIndex = CHARINDEX(@vcDelimiter, @vcDelimitedString)
		IF @siIndex = 0
		BEGIN
			INSERT INTO @tblArray VALUES(@vcDelimitedString)
			BREAK
		END
		ELSE
		BEGIN
			INSERT INTO @tblArray VALUES(SUBSTRING(@vcDelimitedString, 1,@siIndex - 1))
			SET @siStart = @siIndex + @siDelSize
			SET @vcDelimitedString = SUBSTRING(@vcDelimitedString, @siStart , DATALENGTH(@vcDelimitedString) - @siStart + 1)
		END
	END
	
	RETURN
END
GO

Rate

4 (8)

You rated this post out of 5. Change rating

Share

Share

Rate

4 (8)

You rated this post out of 5. Change rating