• -- Tested and working

    DECLARE @Statement VARCHAR(1000), @Year SMALLINT, @AgencyCode VARCHAR(5)

    SELECT @Year = 2014, @AgencyCode = '57LHS'

    SET @Statement = '

    SELECT

    [Complaint Number] = QNUMBM,

    [Complaint Date] = QCMPDM,

    [Complaint Reason] = QCRSNM

    FROM OPENQUERY(

    [AS400_DB2],

    ''SELECT QNUMBM, QCMPDM, QCRSNM

    FROM QMPLNT

    WHERE QCMPDM BETWEEN ' + CAST(@Year*10000 AS CHAR(8)) + ' AND ' + CAST((@Year+1)*10000 AS CHAR(8)) + '

    AND QAGYCD = ''''' + @AgencyCode + '''''

    AND QCSQNM = 1''

    )';

    --PRINT @Statement -- visual syntax check

    IF OBJECT_ID ('tempdb..#Complaints') IS NOT NULL DROP TABLE #Complaints;

    CREATE TABLE #Complaints ([Complaint Number] INT, [Complaint Date] INT, [Complaint Reason] VARCHAR(6));

    INSERT INTO #Complaints ([Complaint Number], [Complaint Date], [Complaint Reason])

    EXEC(@Statement);

    “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