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 |