• 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.

    “Write the query the simplest way. If through testing it becomes clear that the performance is inadequate, consider alternative query forms.” - Gail Shaw

    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