Skip to end of metadata
Go to start of metadata


1) Add the following function:

Allocation splitter
IF EXISTS ( SELECT  * FROM  sys.objects WHERE   object_id = OBJECT_ID(N'fnSplitStringAllocation') AND type IN ( N'TF' ) ) 
DROP Function  fnSplitStringAllocation

	GO

CREATE FUNCTION [dbo].[fnSplitStringAllocation] 
( 
    @string NVARCHAR(MAX)
) 
RETURNS @output TABLE(
AutoIDX INt,
Amount float,
Date	Date)
 
BEGIN 


	DECLARE @start INT, @end INT 
	SELECT @start = 1, @end = CHARINDEX('|', @string) 
	WHILE @start < LEN(@string) + 1 BEGIN 
		IF @end = 0  
			SET @end = LEN(@string) + 1


			DECLARE @String2  varchar(255)
			SELECT @String2 = (SUBSTRING(@string, @start, @end - @start))

			
			DECLARE @AutoIDX Int
			DECLARE @Amount Float
			DECLARE @Date date

			--Second one:
			DECLARE @start2 INT, @end2 INT 
			SELECT @start2 = 1, @end2 = CHARINDEX(';', @String2) 
			WHILE @start2 < LEN(@String2) + 1 BEGIN 
				IF @end2 = 0  
					SET @end2 = LEN(@String2) + 1

					DECLARE @Value varchar(255)
					SELECT @Value = (SUBSTRING(@string2, @start2, @end2 - @start2))
					
					--SET THE Allocs
					SELECT @AutoIDX = CASE WHEN LEFT(@Value,1) = 'I' THEN  RIGHT(@Value,LEN(@Value)-2) ELSE @AutoIDX END
					SELECT @Amount = CASE WHEN LEFT(@Value,1) = 'A' THEN RIGHT(@Value,LEN(@Value)-2) ELSE @Amount END
					SELECT @Date = CASE WHEN LEFT(@Value,1) = 'D' THEN convert(datetime,convert(varchar(10),RIGHT(@Value,LEN(@Value)-2),120)) ELSE @Date END

									
					SET @start2 = @end2 + 1 
					SET @end2 = CHARINDEX(';', @string2, @start2)
			END

			INSERT INTO @output (AutoIDX,Amount,Date)  
					VALUES(@AutoIDX,@Amount,@Date)

			SET @start = @end + 1 
			SET @end = CHARINDEX('|', @string, @start)    
		
        
	END  --While

    RETURN 

END

	GO

2) To use in sql:

How to use
Select top 1000 from  PostAR P
			CROSS APPLY dbo.fnSplitStringAllocation(callocs) Split
  • No labels

1 Comment

  1.  Note: not very quick for performance...