1) Add the following function:
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:
Select top 1000 from PostAR P
CROSS APPLY dbo.fnSplitStringAllocation(callocs) Split
1 Comment
Jan van der Hilst
Note: not very quick for performance...