I'd check for NULL decsription in the source table:
DECLARE MOVEITEMS_CUR CURSOR FOR
SELECT MOVEITEMSID, MOVEDATE, ITEMID, [DESCRIPTION], USERID
FROM MYOB_IMPORT..MOVEITEMS
WHERE [DESCRIPTION] IS NOT NULL
The code is horrible! I gave up after playing for a few minutes:
DECLARE @MESSAGE VARCHAR(2000),
@ID INT,
@DATE DATETIME,
@STOCKCODE varchar(50),
@DESCRIPTION varchar(2000),
@userid INT
CREATE TABLE #TEMP (
[ID] INT,
[DATE] DATETIME,
ITEMID INT,
STOCKCODE VARCHAR(50),
[DESCRIPTION] VARCHAR(100),
USERID INT,
QUANTITY FLOAT,
DIRECTION VARCHAR(10),
LOCATIONID INT
)
DECLARE MOVEITEMS_CUR CURSOR FOR
SELECT MOVEITEMSID, MOVEDATE, ITEMID, [DESCRIPTION], USERID
FROM MYOB_IMPORT..MOVEITEMS
WHERE [DESCRIPTION] IS NOT NULL
OPEN MOVEITEMS_CUR
FETCH NEXT FROM MOVEITEMS_CUR
INTO @ID, @DATE, @STOCKCODE, @DESCRIPTION, @userid
WHILE @@FETCH_STATUS = 0
BEGIN
WHILE (LEN(@DESCRIPTION)) > 5
BEGIN
INSERT INTO #TEMP ([ID],[DATE],ITEMID,STOCKCODE,[DESCRIPTION],USERID,QUANTITY,DIRECTION,LOCATIONID)
SELECT
[ID] = @ID,
[DATE] = @DATE,
ITEMID = @STOCKCODE,
STOCKCODE = ITEMNUMBER,
[DESCRIPTION] = x.NewDescription,
USERID = @userid,
QUANTITY = CASE
WHEN CHARINDEX('INTO',x.NewDescription) = 0
THEN x.QtyMoved
ELSE 0 - x.QtyMoved
END,
DIRECTION = CASE
WHEN CHARINDEX('INTO',x.NewDescription) = 0
THEN 'TO'
ELSE 'FROM' END,
L.LOCATIONID
FROM MYOB_IMPORT..ITEMS I
CROSS APPLY (
SELECT
DescFirstLine = LEFT(@DESCRIPTION,CHARINDEX(CHAR(13),@DESCRIPTION)),
DescFirstWord = LEFT(@DESCRIPTION,CHARINDEX(' ',@DESCRIPTION)-1)
) b
CROSS APPLY (
SELECT
NewDescription = REPLACE(REPLACE(LEFT(@DESCRIPTION,CHARINDEX(CHAR(13),@DESCRIPTION) - 1),CHAR(10),''),'MOVED ',''),
QtyMoved = CONVERT(FLOAT,REPLACE(DescFirstWord,CHAR(10),''))
) x
CROSS APPLY (
SELECT esrever = REVERSE(REPLACE(REPLACE(DescFirstLine,CHAR(10),''),'MOVED ',''))
) y
LEFT JOIN MYOB_IMPORT..LOCATIONS L
ON LEFT(REVERSE(LEFT(y.esrever,CHARINDEX(' ',y.esrever) - 1)),
LEN(LEFT(y.esrever,CHARINDEX(' ',y.esrever) - 1)) - 1) = L.LOCATIONIDENTIFICATION
WHERE @STOCKCODE = ITEMID
IF (LEN(@DESCRIPTION) - LEN(b.DescFirstLine)) > 0
BEGIN
SELECT @DESCRIPTION = RIGHT(@DESCRIPTION,LEN(@DESCRIPTION) - LEN(b.DescFirstLine))
END
ELSE
BEGIN
BREAK
END
END
FETCH NEXT FROM MOVEITEMS_CUR
INTO @ID, @DATE, @STOCKCODE, @DESCRIPTION, @userid
END
CLOSE MOVEITEMS_CUR
DEALLOCATE MOVEITEMS_CUR
What would be really interesting to see would be MOVEITEMS.description and matches with LOCATIONS.LOCATIONIDENTIFICATION, because I don't believe for one moment that the expressions should be as complex as they are.
For fast, accurate and documented assistance in answering your questions, please read this article.
Understanding and using APPLY, (I) and (II) Paul White
Hidden RBAR: Triangular Joins / The "Numbers" or "Tally" Table: What it is and how it replaces a loop Jeff Moden